自学内容网 自学内容网

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)!