首页 > 其他分享 >读取xls文件时报错 Initialisation of record 0x203(NumberRecord) left 4 bytes remaining still to be read.

读取xls文件时报错 Initialisation of record 0x203(NumberRecord) left 4 bytes remaining still to be read.

时间:2023-08-18 14:36:44浏览次数:44  
标签:xlsx process 文件 read xls -- path still 0x203

项目背景 :公司的一个客户报告项目需要同步及抽取客户方的文件数据,文件类型为xls格式,文件为客户方的第三方厂商系统批量生成,工具及方法不明

问题 读取该类xls文件后,无法成功创建Workbook,报错提示“Initialisation of record 0x203(NumberRecord) left 4 bytes remaining still to be read.”,该文件可通过Excel/WPS打开,并且重新保存后不会再次报错

工具库 :Apache POI  --  在C#中通过NPOI/EPPlus工具库测试同样报错

解决方案 实际情况,大批量文件,让客户重新另存不现实,最终通过多方查询及讨论,通过应用LibreOffiec无头转换,将问题文件转换为xlsx格式后重新进行其余相关操作

 

具体解决方式 :

1. 下载安装对应系统的LibreOffice

2. 执行转换命令进行转换

  2.1. 命令行方式

  确保LibreOffice安装目录已成功添加到系统环境变量中,而后执行libreoffice --headless --convert-to xlsx /path/to/source.xls --outdir /path/to/output/     (Windows系统示例)

  2.2. JAVA方式

  public static void main(String[] args) {

          String sourceFilePath = "/path/to/source.xls";

          String targetFilePath = "/path/to/target.xlsx";

          try {

              Process process = Runtime.getRuntime().exec("libreoffice --headless --convert-to xlsx " + sourceFilePath + " --outdir " + targetFilePath);

              process.waitFor();

              System.out.println("File converted successfully.");

          } catch (IOException | InterruptedException e) {

              e.printStackTrace();

          }

      }

  2.3. C#方式

  static void Main(string[] args) {

          string sourceFilePath = "/path/to/source.xls";

          string targetFilePath = "/path/to/target.xlsx";

          try {

              Process process = new Process();

              process.StartInfo.FileName = "libreoffice";

              process.StartInfo.Arguments = $"--headless --convert-to xlsx {sourceFilePath} --outdir {targetFilePath}";

              process.Start();

              process.WaitForExit();

              Console.WriteLine("File converted successfully.");

          } catch (Exception ex) {

              Console.WriteLine(ex.Message);

          }

      }

3. 正常读取或写入转换后文件

 

备注 :

  1. 可转换源文件格式为xls即xls-->xls,但转换后仍存在初始错误,故而需转换为xlsx格式解决问题
  2. Apache POI提供xls转xlsx方式,但针对如上问题文件,在通过文件流创建workbook即WorkbookFactory.create(fis)已经报错,故而无法进行后续转换
  3. 针对初始报错,NPOI官方回复Resaving File解决问题,现实情况可能无法重存;网路可查询解决方案,为更新NPOI源码,在RecordInputStream处进行相应的代码变更,并规避掉后续的EOF异常,不推荐
  4. LibreOffice官网 - LibreOffice官网     NPOI GitHub Issue - Issue About

标签:xlsx,process,文件,read,xls,--,path,still,0x203
From: https://www.cnblogs.com/JustSoSoSo/p/17640399.html

相关文章

  • UVA10812 Beat the Spread! 题解
    题目链接思路大家应该都知道绝对值是什么吧?那么,我们不妨直接设\(a\gtb\),这样就省去了一次分类讨论的麻烦,大大降低了程序的复杂度。即可得到此二元一次含参方程组:\[\begin{cases} a+b=s\\ a-b=t\end{cases}\]运用二元一次方程的消元法,解得:\[\begin{cases} a=\frac{s+t}......
  • 数据库连接池为什么要用threadlocal呢?不用会怎样?
    数据库连接池使用ThreadLocal的主要原因是为了保证每个线程都有其独立的数据库连接,这样可以避免多个线程之间的连接干扰,提高系统的稳定性和性能。为什么使用ThreadLocal?线程安全:ThreadLocal可以为每个线程提供一个独立的数据库连接,确保多个线程操作数据库时不会出现资源竞争的......
  • csv reader utf-8报错:strict 改为ignore
    classBufferedIncrementalDecoder(IncrementalDecoder):"""ThissubclassofIncrementalDecodercanbeusedasthebaseclassforanincrementaldecoderifthedecodermustbeabletohandleincompletebytesequences."......
  • [BitSail] Connector开发详解系列三:SourceReader
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群SourceConnector本文将主要介绍负责数据读取的组件SourceReader:SourceReader每个SourceReader都在独立的线程中执行,只要我们保证SourceSplitCoordinator分配给不同SourceReader的切片没有交集,在S......
  • [BitSail] Connector开发详解系列三:SourceReader
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群SourceConnector本文将主要介绍负责数据读取的组件SourceReader:SourceReader每个SourceReader都在独立的线程中执行,只要我们保证SourceSplitCoordinator分配给不同SourceReader的切......
  • jmeter详解-线程组详解(1)-Thread Group
    Jmeterplugin插件的分类StandardSet组件:对线程组进行了扩展,扩充了许多丰富图表的监听器,可以用Jmeter来监控服务器ExtrasSet组件:支持远程监控,图表展示更加丰富ExtraswithLibsSet组件:提供对JSON的支持,新增了JMS取样器WebDriverSet组件:与WebDriver进行了集成,进行自动化测......
  • 在core项目下通过Dapper对mysql执行批量操作 报at MySql.Data.MySqlClient.MySqlComma
     在core项目下通过Dapper对mysql执行批量操作一直报异常  报PushService=>UpdateKeyWordProductCountTask=>错误信息:Fatalerrorencounteredduringcommandexecution.;;;堆栈信息:atMySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehaviorbehavior)at......
  • shell 用户输入值REPLY变量值传递给 read 变量
    shell变量值传递给read变量readselChoices<<<"$REPLY"echo$selChoices"$REPLY"是用户输入的值,它通过here-string(<<<)传递给read命令参考:https://qa.1r1g.com/sf/ask/2128520901/......
  • 报错TypeError: Cannot read properties of null (reading 'length')
    可能是某个数组属性不存在,但是判断了他的长度,比如下方代码<templatev-if="arr.length"><divv-for="(item,idx)inarr":key="idx">{{item}}</div></template>解决方法  v-if="arr......
  • the-c-programming-language-reading-notes
    TheCProgrammingReadingNotesCreated:2023-06-06T15:59+08:00Published:2023-08-16T12:14+08:00Categories:C|ReadingNotes我看的是第二版,解决了初学C语言和OS课程的时候的一些疑惑,比如:extern的使用,原来function和object没有什么区别,比如下面的代码,将a和......