业务需求是 读取excel数据 并按指定规则拼接数据保存到 md文件中
遇到的问题,大量空列和空行 造成读取数据卡住,或者逐行 逐单元格遍历 过慢。(例如:实际可用数据 一千 行,ws.max_row 读取到的有效行是十万 ),此问题已进行处理,
以下代码仅是示例,视情况优化调整
from openpyxl import load_workbook
from openpyxl.cell import MergedCell
import timeimport pandas as pddef excel_to_md(file_path, output_file_path):# 替换原数据中的\r\ndef replace_value(str):return str.replace('\n', '').replace('\r', '') if str else ''start = time.time()# 使用 openpyxl的load_workbook 读取excel单元格属性 合并单元格数据组merged_xls = pd.ExcelFile(load_workbook(file_path), engine="openpyxl")# 使用 pandas的read_excel 读取数据with pd.ExcelFile(file_path, engine="openpyxl") as xls:with open(output_file_path, 'w') as f:for sheet_name in xls.sheet_names:df = pd.read_excel(xls, sheet_name=sheet_name,engine="openpyxl")df.dropna(axis=1, how='all', inplace=True)df.dropna(axis=0, how='all', inplace=True)# print(f'sheet_name: {sheet_name},开始获取 合并单元格集合 ')# cells_time = time.time()sheet = merged_xls.book[sheet_name]merged_cells = sheet.merged_cells# print(f'sheet_name: {sheet_name},存在 合并的单元格 {len(merged_cells.ranges)if merged_cells else 0}个')for item in merged_cells:top_col, top_row, bottom_col, bottom_row = item.boundsbase_value = replace_value(item.start_cell.value)# 1-based index转为0-based indextop_row -= 1top_col -= 1df.iloc[top_row:bottom_row, top_col:bottom_col] = base_value# print(f'sheet_name: {sheet_name},给合并的单元格赋值 完成 %.5f sec' %(time.time()-cells_time))# 将空单元格赋值为空字符df = df.fillna('')# 开始是写入f.write(f'# {sheet_name}\n')for index, row in df.iterrows():# 处理空表头读取为 Unnamed: 0 替换成 Unnamed-0row_str = ';'.join([f'{str(col).replace(": ","-") if "Unnamed:" in str(col) else col}:{row[col]}' for col in df.columns])replace_value(row_str)f.write(f'{row_str}\n')merged_xls.close()print(file_path+' 执行时间 : %.5f sec' %(time.time()-start))excel_to_md('test.xlsx','test.xlsx.md')