如何使用Python 2.7自动检测通过ArcGIS 10.6/xlswriter/SpatiaLite生成的损坏Excel文件

izkcnapc  于 2023-03-13  发布在  Python
关注(0)|答案(1)|浏览(132)

我在ArcGIS 10.6中创建了一个Python工具箱,使用xlsxwriter库从SpatiaLite数据库生成Excel报表。
Excel文件也包括几个查询和照片的结果。它在大多数情况下工作正常,但对于某些功能会产生以下打开错误消息:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>error012280_01.xml</logFileName><summary>Errors were detected in file 'C:\Test\Data\ExcelReports\R90GGH.xlsx'</summary><removedRecords><removedRecord>Removed Records: Named range from /xl/workbook.xml part (Workbook)</removedRecord></removedRecords></recoveryLog>

Excel提示恢复数据,事实上它在接受一些数据丢失后打开文件,并在我保存修复的文件后,显然一切都是为了。
我没有发现有效报告和无效报告的数据之间有任何差异。
我使用了另存为zip的技巧,然后解压缩并检查XML,但我没有看到那里的错误(尽管由于XML的密度很大,很难检测到)
我认为这与打印区域的定义或重复文件或分页符有关,所以我测试了注解这些行,但错误仍然存在。
我可以接受保存坏报告,但问题是要找到哪一个是坏的,因为他们超过300。
我使用了一个脚本,我发现在这个网站上使用xlrd自动打开和检查错误,但根据脚本所有的Excel文件都可以。

def test_book(filename):
    try:
        book = open_workbook(filename)
        try:
            sheet = book.sheet_by_index(0)
            b6 = sheet.cell_value(rowx=5, colx=1) #b6 an internal code
            print "'"+ str(sheet.name) + "',"
            return True
        
        except XLRDError:
            return False
            print "error"
    except Exception as e:
        return False
        print "error"

我想找出错误,但我的问题是:我怎么能自动检测坏的Excel文件,因为手动检查我的300个文件,我花了一个多小时,这些报告是定期的。
我之前问过GIS Stack Exchange,但他们认为我的问题与GIS没有直接关系。
编辑:这是workbook.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workbook xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><fileVersion appName="xl" lastEdited="4" lowestEdited="4" rupBuild="4505"/><workbookPr defaultThemeVersion="124226"/><bookViews><workbookView xWindow="240" yWindow="15" windowWidth="16095" windowHeight="9660"/></bookViews><sheets><sheet name="R7MB22" sheetId="1" r:id="rId1"/></sheets><definedNames><definedName name="_xlnm.Print_Area" localSheetId="0">R7MB22!$A$1:$H$137</definedName><definedName name="_xlnm.Print_Titles" localSheetId="0">R7MB22!$1:$2</definedName></definedNames><calcPr calcId="124519" fullCalcOnLoad="1"/></workbook>
krcsximq

krcsximq1#

如果不使用Excel读取文件,将很难确定文件是否损坏,因为XlsxWriter生成的文件很少包含像XML错误这样的内容,而这些错误可能会被第三方工具捕获。通常,这些类型的问题是由于非常无效的公式等原因而发生的。在这种情况下,它看起来像是名称范围的问题,但可能与实际的名称范围或自动筛选范围或打印区域有关。
一个更好的方法是找出导致损坏的原因并避免这样做。XlsxWriter努力避免创建Excel认为有错误但可能发生错误的文件。
如果你打开一个bug report对XlsxWriter与损坏的文件之一,我会看看它。
更新:错误报告在这里:#963。此问题是由工作表名称引起的,该名称看起来像RC范围,应该用引号引起来。

相关问题