openpyxl使用總結

設置表頭單元格的顏色

fill = PatternFill("solid", fgColor='FF000000')
font = Font(color='00FFFFFF')
for index, v in enumerate(header):
  d = self.ws.cell(row=1, column=index + 1)
  d.value = v
  d.fill = fill
  d.font = font

設置表頭單元格的長度

self.ws.column_dimensions[row[0]].width = row[1]

單元格保存圖片

# 獲取圖片
img = Image(image_path)
# 設置圖片寬高
img.width, img.height = 100, 100
# 保存圖片
self.ws.add_image(img, f'F{index_row + 2}')
# 設置圖片單元格高度;寬度由header設置
self.ws.row_dimensions[index_row + 2].height = 100

封裝的腳本代碼

from openpyxl.styles import PatternFill, Font
from openpyxl.drawing.image import Image
from openpyxl import Workbook
from typing import List
import os

from core.config import settings


class Excel:
    def __init__(self, excel_name):
        self.excel_name: str = excel_name
        self.excel_path: str = f'{settings.TEMP_FILE}/{self.excel_name}'
        self.wb = Workbook()
        self.ws = self.wb.active

    def write_header(self, header: List[str], column_width: List[list]):
        """
        headers: 表頭內容
        column_dimensions:表頭的間隔
        """
        # 設置表頭樣式:黑色填充,白色字體
        fill = PatternFill("solid", fgColor='FF000000')
        font = Font(color='00FFFFFF')
        for index, v in enumerate(header):
            d = self.ws.cell(row=1, column=index + 1)
            d.value = v
            d.fill = fill
            d.font = font

        # 設置列間隔
        for row in column_width:
            self.ws.column_dimensions[row[0]].width = row[1]

    def write_body(self, rows: List[dict]):
        """
        rows: [[1,2,3],[1,2,3]]
        """
        for index_row, row in enumerate(rows):
            index = 1
            for v in row.values():
                self.ws.cell(row=index_row + 2, column=index).value = v
                index += 1

        return self.__save()

    def write_body_with_image(self, rows: List[dict]):
        """
        rows: [[1,2,3],[1,2,3]],
        """
        for index_row, row in enumerate(rows):
            index = 1
            for v in row.values():
                if index == 6:
                    # 單元格保存圖片用add_image
                    image_path = f'{settings.BASE_PATH}/{v}'
                    img = Image(image_path)
                    # 設置寬高
                    img.width, img.height = 100, 100
                    self.ws.add_image(img, f'F{index_row + 2}')
                    # 設置圖片單元格高度;寬度由header設置
                    self.ws.row_dimensions[index_row + 2].height = 100
                else:
                    self.ws.cell(row=index_row + 2, column=index).value = v
                index += 1

        return self.__save()

    def __save(self):
        try:
            self.wb.save(self.excel_path)
            return True
        except Exception as e:
            print(f'[保存Excel報錯] {e}')
            return False

    # def __del__(self):
    #     os.remove(self.excel_name)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章