Java ColdFusion 8读取大型Excel文件

Java ColdFusion 8读取大型Excel文件,java,excel,coldfusion,apache-poi,large-files,Java,Excel,Coldfusion,Apache Poi,Large Files,我已经能够创建我的应用程序,这样它就可以将包含多个工作表的Excel文件放入数据库。但是,我不确定如何处理大文件30mb+我尝试查看了bufferedReader,但我不确定这是我想要的,因为它一次读取一部分,我使用Apache POI读取多个Excel工作表 目前,如果我将一个文件发送到big,我会得到Java堆空间错误,这就是为什么我感觉文件太大的原因。在测试期间,它工作得很好,然后我使用了32mb的文件,但失败了 下面是代码,我感谢任何帮助提前。 myfile也是一个参数 ci_model

我已经能够创建我的应用程序,这样它就可以将包含多个工作表的Excel文件放入数据库。但是,我不确定如何处理大文件30mb+我尝试查看了
bufferedReader
,但我不确定这是我想要的,因为它一次读取一部分,我使用Apache POI读取多个Excel工作表

目前,如果我将一个文件发送到big,我会得到Java堆空间错误,这就是为什么我感觉文件太大的原因。在测试期间,它工作得很好,然后我使用了32mb的文件,但失败了

下面是代码,我感谢任何帮助提前。 myfile也是一个参数

ci_model = createObject("component", "com.data_feeds.models.ci.model_item_setup");
FileIn = createObject("java","java.io.FileInputStream").init(javacast("string", myfile));
wb = createObject("java","org.apache.poi.xssf.usermodel.XSSFWorkbook").init(FileIn);
workbook = createObject("java","org.apache.poi.xssf.streaming.SXSSFWorkbook").init(wb);
sheetCount = workbook.getNumberOfSheets();

for(sheetIndex = 0; sheetIndex LT sheetCount; sheetIndex = sheetIndex + 1)
{
    recordIndex = 1;
    sheet = workbook.getSheetAt(sheetIndex);

    rowHeader = sheet.getFirstRowNum();
    rowCount = sheet.getLastRowNum();

    for (rowIndex = 1; rowIndex LTE rowCount; rowIndex = rowIndex + 1)
    {
        row = sheet.getRow(rowIndex);
        columnCount = row.getLastCellNum();

        for(columnIndex = 0; columnIndex LT columnCount; columnIndex = columnIndex +1)
        {
            record[recordIndex][columnIndex+1] = row.getCell(columnIndex);
            if((columnIndex+1)==4)
            {
                record[recordIndex][columnIndex+1] = ci_model.boolean_number(row.getCell(columnIndex).toString());
            }
        }
        recordIndex = recordIndex + 1;
        if(recordIndex == 500)
        {
            this.insert_record(record);
            arrayClear(record);
            request.help.debug.collect_garbage();
            recordIndex = 1;
        }
    }
    this.insert_record(record);
    arrayClear(record);
}
FileIn.close();

我使用的是ColdFusion 8。

最好的办法是将数据导入临时表中。然后使用ColdFusion将数据从临时表导入主表。通过这种方式,您可以使用ColdFusion将数据分块导入,而不是一次导入所有数据。。要导入到SQL Server,只需使用导入工具,对于mySQL,有几种方法可以实现。我个人只是使用csv文件导入。我知道这个过程没有那么直接,但它会减少ColdFusion过程的压力,增加SQL server的压力


另一个建议是确保你的查询没有超时,或者你的页面没有超时。在URL之后添加
?requestTimeout=1000
,也可以阻止进程超时。我知道这是java错误,但如果进程持续时间过长,则可能会超时。

您可能必须采取措施限制所接受文件的大小。有几件事。首先,SXSSFWorkbook是用来写作的,不是用来阅读的。第二,尽管可以明显增加内存,但ColdFusion并不是大型导入的最佳工具。您应该考虑使用数据库工具进行导入。您使用的数据库/版本是什么?(RE:
collect_garbage()
作为旁白,你不能强制垃圾收集,只能建议它。最终,jvm会确定垃圾收集是否会发生以及何时发生。)是的,最好的办法是将处理移到比CF更好的数据库中。我想你没有提到你的DBMS,但是SQLServer有几个选项,例如。在完成导入到主表之前,可以使用临时表或工作表作为一个额外的层来验证数据。既然我们提供了替代的方法,您也可以考虑将文件转换为CSV,然后导入。使逐行读取文件变得容易,因此内存不会成为问题。