python 读取excel 并处理被合并单元格的数据
业务需求是 读取excel数据 并按指定规则拼接数据保存到 md文件中
遇到的问题,大量空列和空行 造成读取数据卡住,或者逐行 逐单元格遍历 过慢。(例如:实际可用数据 一千 行,ws.max_row 读取到的有效行是十万 ),此问题已进行处理,
以下代码仅是示例,视情况优化调整
from openpyxl import load_workbook
from openpyxl.cell import MergedCell
import time
import pandas as pd
def excel_to_md(file_path, output_file_path):
# 替换原数据中的\r\n
def 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.bounds
base_value = replace_value(item.start_cell.value)
# 1-based index转为0-based index
top_row -= 1
top_col -= 1
df.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-0
row_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')
原文地址:https://blog.csdn.net/a1041646584/article/details/140644213
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!