如何使用java拆分Excel文件?

如何使用java拆分Excel文件?,java,excel,apache-poi,Java,Excel,Apache Poi,我有200000行的Excel工作表。我想为每50000条记录拆分Excel文件。 我正在使用Apache POI API读取和写入Excel文件。如果行数达到定义的记录大小,是否可以拆分文件。请帮助我获取该问题的解决方案 代码: 发生异常: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at org.apache.xmlbeans.impl.store.Locale$ScrubBuffer.

我有200000行的Excel工作表。我想为每50000条记录拆分Excel文件。 我正在使用Apache POI API读取和写入Excel文件。如果行数达到定义的记录大小,是否可以拆分文件。请帮助我获取该问题的解决方案

代码:

发生异常:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at org.apache.xmlbeans.impl.store.Locale$ScrubBuffer.<init>(Locale.java:1885)
    at org.apache.xmlbeans.impl.store.Locale.getScrubBuffer(Locale.java:1904)
    at org.apache.xmlbeans.impl.store.Xobj.getValueAsString(Xobj.java:1205)
    at org.apache.xmlbeans.impl.store.Xobj.fetch_text(Xobj.java:1796)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.get_wscanon_text(XmlObjectBase.java:1332)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1269)
    at org.apache.xmlbeans.impl.values.JavaLongHolder.longValue(JavaLongHolder.java:53)
    at org.apache.xmlbeans.impl.values.XmlObjectBase.getLongValue(XmlObjectBase.java:1502)
    at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(Unknown Source)
    at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:321)
    at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:180)
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:147)
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:189)
    at com.arosys.excelReading.ReadXLSX.loadFile(ReadXLSX.java:49)
    at com.arosys.excelReading.ReadXLSX.getNumberOfSheet(ReadXLSX.java:121)
    at com.arosys.excelReading.ReadXLSX.main(ReadXLSX.java:324)
    Java Result: 1
线程“main”java.lang.OutOfMemoryError中的异常:java堆空间 位于org.apache.xmlbeans.impl.store.Locale$scrwabuffer.(Locale.java:1885) 位于org.apache.xmlbeans.impl.store.Locale.getScrubBuffer(Locale.java:1904) 位于org.apache.xmlbeans.impl.store.Xobj.getValueAsString(Xobj.java:1205) 位于org.apache.xmlbeans.impl.store.Xobj.fetch_text(Xobj.java:1796) 位于org.apache.xmlbeans.impl.values.XmlObjectBase.get_wscanon_text(XmlObjectBase.java:1332) 位于org.apache.xmlbeans.impl.values.XmlObjectBase.check_日期(XmlObjectBase.java:1269) 位于org.apache.xmlbeans.impl.values.JavaLongHolder.longValue(JavaLongHolder.java:53) 位于org.apache.xmlbeans.impl.values.XmlObjectBase.getLongValue(XmlObjectBase.java:1502) 位于org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(未知源) 位于org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:321) 位于org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:180) 位于org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:147) 位于org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134) 在org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235)上 在org.apache.poi.POIXMLDocument.load上(POIXMLDocument.java:190) 位于org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:189) 在com.arosys.excelReading.ReadXLSX.loadFile(ReadXLSX.java:49)上 在com.arosys.excelReading.ReadXLSX.getNumberOfSheet上(ReadXLSX.java:121) 在com.arosys.excelReading.ReadXLSX.main上(ReadXLSX.java:324) Java结果:1
谢谢

如果您无法使用POI阅读此文档,但表格很简单,我建议您使用Excel打开它,将其另存为CSV文件,然后将此文件拆分为多个片段。这甚至可以使用shell脚本/批处理文件来完成


如果您有一个大文件并且必须拆分它,则此建议有效。但是,如果您正在实施一项应接收此类excel文件并将其分离的服务,请寻找其他解决方案。

如果您无法使用POI阅读此文档,但表格很简单,我建议您使用excel打开它,将其另存为CSV文件,然后将此文件分离为片段。这甚至可以使用shell脚本/批处理文件来完成


如果您有一个大文件并且必须拆分它,则此建议有效。但是,如果您正在实现一个应该接收此类excel文件并将其分离的服务,请寻找其他解决方案。

默认Java堆大小非常小,尤其是在处理大型xml文件时


你只需要增加你的内存大小,你就会没事的。运行Java时,为
-Xmx
设置一个合适的大小,默认的Java堆大小非常小,尤其是在处理大型xml文件时

你只需要增加你的内存大小,你就会没事的。运行Java时,为
-Xmx
设置一个合适的大小

  • 首先,使用Gagravarr的推荐,并最大限度地增加您的内存占用。如果您的平台允许,请切换到64位JVM。这种暴力手段本身就可以解决你的问题

  • 如果可能,避免使用.xlsx文件-POI在.xlsx上比在.xls上消耗更多内存

  • 建议使用eventmodel进行读取(这里是消耗大部分内存的地方),您也可以尝试使用新的SXSSF API进行写入(仍处于测试阶段),该API内存占用较小

  • 首先,使用Gagravarr的推荐,并最大限度地增加您的内存占用。如果您的平台允许,请切换到64位JVM。这种暴力手段本身就可以解决你的问题

  • 如果可能,避免使用.xlsx文件-POI在.xlsx上比在.xls上消耗更多内存

  • 建议使用eventmodel进行读取(这里是消耗大部分内存的地方),您也可以尝试使用新的SXSSF API进行写入(仍处于测试阶段),该API内存占用较小


  • 你能看懂整张纸吗?如果是,则显示当前代码。是的,我读取了整个工作表中的记录。当我尝试获取记录时,我的异常堆内存超出范围。您能读取整个工作表吗?如果是,则显示当前代码。是的,我读取了整张工作表中的记录。当我尝试获取记录时,我得到了一个异常堆内存超出范围。谢谢。我有一个服务,该服务应接收此类excel文件并将其分离,以寻找其他解决方案。我拆分一个文件,因为当我尝试读取最大数量的记录时,会将错误堆内存超出范围,当我分割文件时,每个文件的记录数较少,那么可能这个问题不会出现,我不确定我认为的是正确的,当没有文件来自服务时,我还有一个困惑,这个问题再次出现。谢谢。我有一个服务,应该接收这样的excel文件并将其分离,然后寻找其他解决方案。我拆分文件是因为当我尝试读取最大记录数时,它会将错误堆内存抛出范围之外,当我拆分文件时,每个文件都有较少的记录,那么可能这个问题不会出现,我不确定我认为什么是正确的,我还有一个困惑,当没有来自服务的文件时,这个问题再次出现。
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at org.apache.xmlbeans.impl.store.Locale$ScrubBuffer.<init>(Locale.java:1885)
        at org.apache.xmlbeans.impl.store.Locale.getScrubBuffer(Locale.java:1904)
        at org.apache.xmlbeans.impl.store.Xobj.getValueAsString(Xobj.java:1205)
        at org.apache.xmlbeans.impl.store.Xobj.fetch_text(Xobj.java:1796)
        at org.apache.xmlbeans.impl.values.XmlObjectBase.get_wscanon_text(XmlObjectBase.java:1332)
        at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1269)
        at org.apache.xmlbeans.impl.values.JavaLongHolder.longValue(JavaLongHolder.java:53)
        at org.apache.xmlbeans.impl.values.XmlObjectBase.getLongValue(XmlObjectBase.java:1502)
        at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(Unknown Source)
        at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:321)
        at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:180)
        at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:147)
        at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235)
        at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:189)
        at com.arosys.excelReading.ReadXLSX.loadFile(ReadXLSX.java:49)
        at com.arosys.excelReading.ReadXLSX.getNumberOfSheet(ReadXLSX.java:121)
        at com.arosys.excelReading.ReadXLSX.main(ReadXLSX.java:324)
        Java Result: 1