我的一些用户(都使用Mac)已经将Excel上传到我的应用程序中,然后我的应用程序拒绝了它,因为该文件似乎是空的。经过一些调试后,我确定该文件是以严格的Open XML Spreedsheet格式保存的,并且openpyxl(2.6.0)不会发出错误,而是向stderr打印一条警告
若要复制,请打开一个文件,添加几行,然后另存为严格的open XML Speedsheet(*.xlsx)格式
import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
workbook = openpyxl.load_workbook(filename=f)
这将打印以下警告,但不会引发任何异常:
UserWarning: File contains an invalid specification for Sheet1. This will be removed
此外,工作簿似乎没有工作表:
assert workbook.get_sheet_names() == []
我现在有三个Mac用户遇到过这个问题。看起来Mac有时会默认使用这种严格的开放XML Spreedsheet格式。如果这是正常情况,那么openpyxl应该能够处理它。否则,如果openpyxl只抛出一个异常就好了。作为一种解决方法,我似乎可以做到以下几点:
import openpyxl
with open('excel_open_strict.xlsx', 'rb') as f:
workbook = openpyxl.load_workbook(filename=f)
if not workbook.get_sheet_names():
raise Exception("The Excel was saved in an incorrect format")
使用R库openxlsx创建的XLSX文件也有类似的问题。来自一个简单python程序的示例错误消息,用于打开文件并从工作表中检索单个值:
警告(来自警告模块): 文件“C:\Python38\lib\site packages\openpyxl\reader\workbook.py”,第88行 警告(msg) UserWarning:文件包含无效的作物规范。这将被删除
我的第一个非常笨拙的解决方案:
如果您只需要读取文件,我的第二个解决方案就可以工作:
wb = load_workbook(filename = 'CAF_LTAR_crops_out_0.3.xlsx', read_only=True)
广泛的教训似乎是XLSX文件规范没有在编程语言之间统一(正确地?)实现
相关问题 更多 >
编程相关推荐