Python操做Excel 之 openpyxl

1、基礎
  1. 安裝openpyxl 模塊
    pip install openpyxl 或者經過輪子安裝
  • font(字體類):字號、字體顏色、下劃線等json

  • fill(填充類):顏色等ide

  • border(邊框類):設置單元格邊框測試

  • alignment(位置類):對齊方式字體

  • number_format(格式類):數據格式ui

  • protection(保護類):寫保護excel

1.1 建立excel文件
from openpyxl import Workbook
wb = Workbook()   #建立文件對象

wb.remove(wb["sheet"])

wb.remove(self.wb["sheet"])  #移除掉第一個sheet

ws = wb.create_sheet("{0}蒸汽壓力記錄表".format(self.sample_name), 0)

#生成所含列總數的大寫字母
upper_string_list = string.ascii_uppercase[:self.all_col]

wb.save("e:\\sample.xlsx")
1.2 操做單元格
from openpyxl import Workbook
wb = Workbook()
ws1 = wb.create_sheet("Mysheet")           #建立一個sheet

ws1["A1"]=123.11
ws1["B2"]="你好"
d = ws1.cell(row=4, column=2, value=10)

print ws1["A1"].value
print ws1["B2"].value
print d.value

# Save the file
wb.save("e:\\sample.xlsx")
1.3 對多個單元格
import uuid
import string
import json
import time
import os
import base64

from openpyxl.workbook import Workbook
from openpyxl.styles import Font, Alignment, Side, Border

from Lib.Utils import Utils

class ExportReport:

    def __init__(self, start_time, water_temp, test_people,
                 sample_name, pressure_value, pressure_list,*args, **kwargs):
        """

        :param start_time: 實驗開始時間
        :param water_temp: 水浴溫度
        :param test_people: 試驗人
        :param sample_name: 樣品名稱
        :param pressure_value: 最終壓力
        :param args: 實驗過程壓力記錄列表
        :param kwargs:
        """
        self.start_time = start_time
        self.water_temp = str(water_temp)+' ℃'
        self.test_people = test_people
        self.sample_name = sample_name
        self.pressure_value = pressure_value
        self.all_col = 5+len(pressure_list) #一共多少列
        self.pressure_record = pressure_list #第六列到最後一列的數據列表

        #全部的數據列
        self.data_list = [
            self.start_time, self.water_temp,
            self.test_people,self.sample_name,
            self.pressure_value
        ]
        self.data_list.extend(self.pressure_record)
        self.col_list = ["開始時間", "水浴溫度", "測試人", "樣品名稱", "最終壓力值"]

        # base64轉化爲圖片
        # self.bs64 = bs64
        # self.img_path = Utils.change_base64_as_img(self.bs64)

        self.wb = Workbook()

        #self.wb.remove(self.wb["sheet"])

        self.ws = self.wb.create_sheet("{0}蒸汽壓力記錄表".format(self.sample_name), 0)
        #生成所含列總數的大寫字母
        self.upper_string_list = string.ascii_uppercase[:self.all_col]
        # 水平對齊,居中對齊
        self.alignment_style = Alignment(horizontal='center', vertical='center')
        #定義border 邊框樣式
        left, right, top, bottom = [Side(style='thin', color='000000')]*4
        self.border_style = Border(left=left, right=right, top=top, bottom=bottom)
        #定義字體
        self.font_size = Font(size=9)
        for col in self.upper_string_list:
            self.ws.column_dimensions[col].width = 20

    #建立表頭第一行
    def create_row1(self):
        #把全部列合併
        self.ws.merge_cells(start_row=1, end_row=1, start_column=1, end_column=self.all_col)
        #寫入值
        # self.ws.cell(row=1, column=1).value = value
        self.ws.cell(row=1, column=1).value = "{0}蒸汽壓力記錄表".format(self.sample_name)
        self.ws['A1'].alignment = self.alignment_style
        self.ws['A1'].font = Font(size=16, bold=True)
        self.create_row2_3()

    def create_row2_3(self):
        #把前五列,二三行單元格合併,並寫入值
        for col in range(1, len(self.col_list)+1):
            self.ws.merge_cells(start_row=2, end_row=3, start_column=col, end_column=col)
            col_str = self.upper_string_list[col-1]+"2"
            self.ws[col_str] = self.col_list[col-1]
            self.ws[col_str].alignment = self.alignment_style
            self.ws[col_str].font = Font(size=12, bold=True)

        #把第二行第六列開始到最後列合併
        self.ws.merge_cells(start_row=2, end_row=2, start_column=len(self.col_list)+1, end_column=self.all_col)
        col_str = self.upper_string_list[len(self.col_list)]+"2"
        self.ws[col_str] = "實驗過程壓力記錄"
        self.ws[col_str].alignment = self.alignment_style
        self.ws[col_str].font = Font(size=12, bold=True)

        #第三行第六列開始到最後列寫入值
        for index, col_ltr in enumerate(self.upper_string_list[5:]):
            col_str = col_ltr+'3'
            self.ws[col_str] = "第{0}次壓力記錄".format(index+1)
            self.ws[col_str].alignment = self.alignment_style
            self.ws[col_str].font = Font(size=12, bold=True)

    def add_data(self):
        #第四行開始寫入數據,全部數據居中對齊,水平居中
        for index, col in enumerate(self.upper_string_list):
            col_str = col+"4"
            self.ws[col_str] = self.data_list[index]
            self.ws[col_str].alignment = self.alignment_style
            self.ws[col_str].font = Font(size=12, bold=True)

    def create(self,value=None):
        if value:
            self.ws.cell(row=1, column=1).value = value
        self.create_row1()
        self.add_data()

    def save(self, filename):
        try:
            self.wb.save(filename)
        except:
            self.wb.save(filename[:-5] + str('_' + Utils.getFileName()) + filename[-5:])

        # 關閉excel
        self.close()

    def close(self):
        self.wb.close()

if __name__ == '__main__':
    er = ExportReport(1, 2, 3, 4, 5, ['x', 's', 's', 'b','w'])
    er.create()
    er.wb.save('17表.xlsx')
相關文章
相關標籤/搜索