openpyxl:读取单元格数据时的错误处理

问题描述 投票:0回答:2

我有一个由人准备的 xlsm 文件。可以理解的是,某些单元格的格式错误。例如,有些列应该包含整数字符串作为 ID,但某些单元格的格式会错误地设置为日期时间。读取这些单元格时,当 openpyxl 无法将整数解析为日期时间格式时,它会发出警告并将这些单元格标记为错误,例如:

...\lib\site-packages\openpyxl\worksheet_reader.py:223:用户警告:单元格 G14935 被标记为日期,但序列值 1713074675 超出了日期限制。该单元格将被视为错误。 警告(消息)

我在谷歌上搜索了几个小时的解决方案,包括搜索读取单元格时的错误处理方法、设置列或单元格的数据类型(使用pandas读取文件,但我将错误跟踪到openpyxl),但无济于事。我需要的是一种覆盖已保存单元格数据类型的方法,并尝试将其值加载为不同类型。

任何帮助将不胜感激!

注意:通过 pandas 读取文件没有帮助:建议在调用 pd.read_excel 时使用关键字 dtype='string' ,不幸的是,似乎有问题的单元格将首先根据单元格数据类型读取,然后转换为请求的单元格数据类型。

python-3.x pandas openpyxl
2个回答
0
投票

我认为 Openpyxl 没有任何选项可以修复它。
不确定是否还有其他可以尝试的 Pandas。

但是,您应该能够通过更改数字格式来修复使用

Xlwings
的问题。 (请注意,在 Openpyxl 中执行此操作将不起作用)。

import xlwings as xw

xlfile = 'foo.xlsx'
with xw.App(visible=False) as app:
    wb = xw.Book(xlfile)
    ws = wb.sheets['Sheet1']

    ### Note you should be able to see the value using the formula field of the cell irrespective of setting the number format. 
    ### But you must change the number format to 'fix' the cell value
    print(ws['A1'].formula)  # Would print 1713074675 

    ### To fix; Set the number format to General or other appropriate
    ws['A1'].number_format = 'General'
    print(ws['A1'].value) 

    wb.save('foo_out.xlsx')


0
投票

有一篇文章here建议使用

xlwings
加载数据,然后您可以将单元格格式更改为
'General'
并保存修改后的表格。当您通过
pandas
读取修改后的表时,应该可以正确加载该表。

© www.soinside.com 2019 - 2024. All rights reserved.