from openpyxl import load_workbook
from typing import Union, List, IO
import openpyxl
import pandas as pd
import os
def write_excel(file_full_path, values:list,sheet_name ="Sheet1"):
# sheet名稱
sheet_name = sheet_name
# 獲取指定的檔案
wb = openpyxl.load_workbook(file_full_path)
# 獲取指定的sheet
ws = wb[sheet_name]
# 獲得最大行數
max_row_num = ws.max_row
# 獲得最大列數
max_col_num = ws.max_column
# 將當前行設定為最大行數
ws._current_row = max_row_num
# 使用append方法,將行資料按行追加寫入
# values = ['Jack', '12', '2023/11/12', 'Failed']
ws.append(values)
# 儲存檔案
wb.save(file_full_path)
#如果要批次寫入資料的話可以用迴圈在內部使用,以減少io操作減少寫入時間如下
def write_excel_2(file_full_path,sheet_name ="Sheet1"):
# sheet名稱
sheet_name = sheet_name
# 獲取指定的檔案
wb = openpyxl.load_workbook(file_full_path)
# 獲取指定的sheet
ws = wb[sheet_name]
# 獲得最大行數
max_row_num = ws.max_row
# 獲得最大列數
max_col_num = ws.max_column
# 將當前行設定為最大行數
ws._current_row = max_row_num
# 使用append方法,將行資料按行追加寫入
# values = ['Jack', '12', '2023/11/12', 'Failed']
for i in range(200,1000):
values = ['Jack', i, '2023/11/12', 'Failed']
ws.append(values)
# 儲存檔案
wb.save(file_full_path)
def xlsx_read():
# 載入Excel檔案
workbook = load_workbook(filename='example - 副本.xlsx')
# 獲取所有的工作表名稱
sheet_names = workbook.sheetnames
Lists = []
# 遍歷所有工作表
for sheet_name in sheet_names:
# 獲取工作表
sheet = workbook[sheet_name]
# 遍歷所有行
for row in sheet.iter_rows(values_only=True):
# 列印每行的資料
# print(row)
Lists.append(row)
return Lists
#輸出形式 [('name', 'num', 'date', 'F_T'), ('Jack', 0, '2023/11/12', 'Failed'), ('Jack', 1, '2023/11/12', 'Failed')]
class ExcelUtils(object):
""" Excel檔案操作工具類 """
@classmethod
def read_excel(
cls,
path_or_buffer: Union[str, IO],
sheet_name: str = "Sheet1",
col_mapping: dict = None,
all_col: bool = True,
header: int = 0,
**kwargs
) -> List[dict]:
"""
讀取excel表格資料,根據col_mapping替換列名
Args:
path_or_buffer: 檔案路徑或者緩衝流
sheet_name: 讀書excel表的sheet名稱
col_mapping: 列欄位對映
all_col: True返回所有列資訊,False則返回col_mapping對應的欄位資訊
header: 預設0從第一行開啟讀取,用於指定從第幾行開始讀取
Returns:
"""
use_cols = None
if not all_col:
# 獲取excel表指定列資料
use_cols = list(col_mapping) if col_mapping else None
df = pd.read_excel(path_or_buffer, sheet_name=sheet_name, usecols=use_cols, header=header, **kwargs)
if col_mapping:
df.rename(columns=col_mapping, inplace=True)
return df.to_dict("records")
#輸出形式[{'name': 'Jack', 'num': 0, 'date': '2023/11/12', 'F_T': 'Failed'}, {'name': 'Jack', 'num': 1, 'date': '2023/11/12', 'F_T': 'Failed'}]