openpyxl读取POI生成的文件只能读到A1

这里写自定义目录标题

原因

Apache POI写出来的excel文件,sheetX.xml 中 dimension tag的ref为 A1(正常的excel文件为A1:XXX,XXX指最后一个单元格)
正常excel文件

处理

重载openpyxl 的WorkSheetParser类中 WorkSheetParser.parse_dimensions 方法

from openpyxl.worksheet._reader import WorkSheetParser, ROW_TAG, DATA_TAG, CELL_TAG, DIMENSION_TAG
from openpyxl.worksheet.dimensions import SheetDimension
from openpyxl import load_workbook
from openpyxl.utils.cell import range_boundaries
from lxml import etree

def new_parse_dimisions(self):
    # 预设置一个 boundaries
    boundaries = (1, 1, 1, 1)
    try:
        # 解析成etree(使用lxml模块)
        tree = etree.parse(self.source)
        # 尝试查找dimenssion
        dimension_elem = tree.find(f'//{DIMENSION_TAG}')
        dim = SheetDimension.from_tree(dimension_elem) if dimension_elem else None
        # 如果没有Dimension信息, 或 Dimension只有A1
        if not dim or dim.boundaries == (1,1,1,1):
            # 查找最后一个单元格, [last()]会影响效率
            last_cell = tree.findall(f'//{DATA_TAG}/{ROW_TAG}/{CELL_TAG}')[-1]
            # cell标签的r属性中,就是最后一个单元格的地址,解析失败的情况下,就用A1兜底。
            last_cell_address = last_cell.get('r', 'A1')
            # 将单元格区域转为tuple
            boundaries = range_boundaries(f'A1:{last_cell_address}')
            return boundaries
        else:
            boundaries = dim.boundaries if dim else (1, 1, 1, 1)
    finally:
        return boundaries

# 重载方法
WorkSheetParser.parse_dimensions = new_parse_dimisions
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值