首页 > 其他分享 >【原创】修正fpspreadsheet读某些复杂xlsx文件时出错的Bug

【原创】修正fpspreadsheet读某些复杂xlsx文件时出错的Bug

时间:2024-10-25 12:43:21浏览次数:1  
标签:FindNode DocumentElement xlsx Doc fpspreadsheet XMLStream Bug AStream

网友“海”在使用fpspreadsheet时遇到读取复杂的xlsx文件会出错:

 经跟踪发现运行到fpspreadsheet\source\common\xlsxooxml.pas的procedure TsSpreadOOXMLReader.ReadFromStream的ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames'))这行出错,查看早期(fpspreadsheet-1.10.1)代码发现这行已注释了的,不清楚新版本为什么又加上这行。
fpspreadsheet-1.10.1版本的:

    // process the workbook.xml file (1st run)
    XMLStream := CreateXMLStream;
    try
      if not UnzipToStream(AStream, OOXML_PATH_XL_WORKBOOK, XMLStream) then
        raise EFPSpreadsheetReader.CreateFmt(rsDefectiveInternalFileStructure, ['xlsx']);
      ReadXMLStream(Doc, XMLStream);
      ReadFileVersion(Doc.DocumentElement.FindNode('fileVersion'));
      ReadDateMode(Doc.DocumentElement.FindNode('workbookPr'));
      ReadWorkbookProtection(Doc.DocumentElement.FindNode('workbookProtection'));
      ReadSheetList(Doc.DocumentElement.FindNode('sheets'));
      //ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames'));  -- don't read here because sheets do not yet exist
      ReadActiveSheet(Doc.DocumentElement.FindNode('bookViews'), actSheetIndex);
      FreeAndNil(Doc);
    finally
      XMLStream.Free;
    end;

fpspreadsheet-1.17:

    // process the workbook.xml file (1st run)
    XMLStream := CreateXMLStream;
    try
      if not UnzipToStream(AStream, OOXML_PATH_XL_WORKBOOK, XMLStream) then
        raise EFPSpreadsheetReader.CreateFmt(rsDefectiveInternalFileStructure, ['xlsx']);
      ReadXMLStream(Doc, XMLStream);
      ReadFileVersion(Doc_FindNode('fileVersion'));
      ReadDateMode(Doc_FindNode('workbookPr'));
      ReadWorkbookProtection(Doc_FindNode('workbookProtection'));
      ReadSheetList(Doc_FindNode('sheets'));    // This creates the worksheets!
      ReadRels(AStream, OOXML_PATH_XL_RELS_RELS, FWorkbookRels);
      ReadSheetRels(AStream);
      ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames')); 
      ReadActiveSheet(Doc_FindNode('bookViews'), actSheetIndex);
      FreeAndNil(Doc);
    finally
      XMLStream.Free;
    end;

处理方法:
将这行注释就可以

    // process the workbook.xml file (1st run)
    XMLStream := CreateXMLStream;
    try
      if not UnzipToStream(AStream, OOXML_PATH_XL_WORKBOOK, XMLStream) then
        raise EFPSpreadsheetReader.CreateFmt(rsDefectiveInternalFileStructure, ['xlsx']);
      ReadXMLStream(Doc, XMLStream);
      ReadFileVersion(Doc_FindNode('fileVersion'));
      ReadDateMode(Doc_FindNode('workbookPr'));
      ReadWorkbookProtection(Doc_FindNode('workbookProtection'));
      ReadSheetList(Doc_FindNode('sheets'));    // This creates the worksheets!
      ReadRels(AStream, OOXML_PATH_XL_RELS_RELS, FWorkbookRels);
      ReadSheetRels(AStream);
      //ReadDefinedNames(Doc.DocumentElement.FindNode('definedNames')); //LBZ 2024-10-25
      ReadActiveSheet(Doc_FindNode('bookViews'), actSheetIndex);
      FreeAndNil(Doc);
    finally
      XMLStream.Free;
    end;

重新编译出现另一个错误:

同样是fpspreadsheet\source\common\xlsxooxml.pas这个文件。
procedure TsSpreadOOXMLReader.ReadPageSetup的StrToInt(s)这的integer超出范围

  // First page number
  s := GetAttrValue(ANode, 'firstPageNumber');
  if s <> '' then
    sheet.PageLayout.StartPageNumber := StrToInt(s);

处理方法很简单:
将StrToInt改为StrToInt64就可以

  // First page number
  s := GetAttrValue(ANode, 'firstPageNumber');
  if s <> '' then
    sheet.PageLayout.StartPageNumber := StrToInt64(s);//lbz 2024-10-25

经上述修改后的fpspreadsheet已能正常读xlsx

 

标签:FindNode,DocumentElement,xlsx,Doc,fpspreadsheet,XMLStream,Bug,AStream
From: https://www.cnblogs.com/qiufeng2014/p/18502273

相关文章

  • vscode+phpstudy+xdebug无法断点(踩坑记)
    参考文档:https://zhuanlan.zhihu.com/p/113171737安装vscode、下载phpstudy最新版这2步都不说了,网上大把教程。本文主要把phpstudy的一个坑点记录一下配置网站配置伪静态location/{if(!-e$request_filename){rewrite^(.*)$/index.php?s=$1las......
  • 使用debugserver方法
    lazarus最大的缺点我认为是Debug,如需要查看View:Width的值,lazarus是无法直接看到的,但用debugserver+SendDebug可以显示。使用方法:1、首先编译debugserver,打开编译lazarus\tools\debugserver\debugserver.lpi2、运行地debugserver3、unit的uses加入dbugintf4、在需要debug的地方插......
  • 什么是 SAP ABAP Debugger Script
    SAPABAPDebuggerScript是SAP提供的一种工具,允许开发人员在调试ABAP程序时编写脚本来自动化调试过程。这些脚本可以帮助简化复杂的调试任务,例如批量数据断点设置、变量监控、内存分析等。Debugging本身是开发流程中非常重要的环节,而SAPABAPDebuggerScript的目......
  • 开源背书神器anki的安卓端bug-如何实现卡片正反面的值传递
    0.最近学习需要,下载了anki的安卓端,但是在使用选择题的卡片模板的时候,遇到了bug(因为这个软件免费,所以作者也没有花很多时间维护吧=_=.IOS端是没有这个bug的,但是IOS需要128软妹币,好贵。。)。1.bug内容:这个卡片模板,正面是题干和选项,点击显示答案之后,会显示卡片背面,背面也是题干和选项......
  • ng-zorro(Ant Design) nzPageIndex分页器bug
    原文链接:ng-zorro(AntDesign)nzPageIndex分页器bug–每天进步一点点0.背景前台使用nz-table配置上分页器,传入后台每次取固定量数据。调试的时候出现下面的bug也就是点相应的页数,显示的页数是错误的。错误的代码如下:查阅了一些资料,加上自己尝试了几次,终于找到了问题所在......
  • K8S 调整请求头大小限制:一次debug灾难的随手记录
    事情的起因2024.10.19,OpenAIChatGPT突然将CR的Token长度变长,并且长的超出我的想象。由于业务需求,镜像站的Response回显为400BadRequest。查看了一下日志,发现中间出现了几条Arkose的请求日志,我心想,丸辣,怎么Arkose回来了。由于2024.10.18也就是昨天,基本上手上的......
  • tonkeeper的toogo库的Hashmap序列化有bug
    packagetonapiserviceimport( "fmt" "testing" "github.com/tonkeeper/tongo/boc" "github.com/tonkeeper/tongo/tlb")funcTestHashmapE(t*testing.T){ //Hashmap的序列化有bug,数据一样的情况下,有时候会提示notenouthbits. c:=......
  • VSCode + Python + Shell 调试 (Debug) : debugpy
    场境:使用VSCode对一个用Shell脚本启动的Python程序进行Debug.1.debugpy安装在激活了相应的conda虚拟环境后,安装debugpy库:pipinstalldebugpy2.查看可用端口运行forportin{5000..6000};do(echo>/dev/tcp/localhost/$port)>/dev/null2>&1||echo"$portis......
  • phpstorm+phpstudy快速配置xdebug
    1.下载安装小皮面板2.下载安装phpstorm3.开启phpxdebug默认php环境是7.3.4,一般不需要洞这个,本文也是使用这个版本的php进行快速配置,如果PHP5.X版本的配置此方法可能不同4.配置php文件访问\phpstudy_pro\Extensions\php\php7.3.4nts\php.ini最下面会看到如下配置......
  • pear-admin-layui-main 4.0 admin.js bug 修复
    pearAdmin.instances.tabPage=tabPage.render({ elem:'content', session:param.tab.session, index:0, tabMax:param.tab.max, preload:param.tab.preload, closeEvent:function(id){ pearAdmin.instan......