【问题标题】:ColdFusion 8 Reading large Excel filesColdFusion 8 读取大型 Excel 文件
【发布时间】:2016-01-23 17:06:56
【问题描述】:

我已经能够创建我的应用程序,以便它可以获取包含多个工作表的 Excel 文件并将它们放入数据库中。但是我不确定如何使用 30mb+ 的大文件执行此操作Excel 工作表。

目前,如果我将文件发送到大文件,我会收到 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。

【问题讨论】:

  • 您可能需要做一些事情来限制您接受的文件的大小。
  • 几件事。首先,SXSSFWorkbook 是用来写的,不是用来读的。其次,虽然可以明显增加内存,但 ColdFusion 确实不是大型导入的最佳工具。您应该考虑使用您的数据库工具进行导入。您使用的是什么数据库/版本? (RE: collect_garbage() 顺便说一句,你不能强制垃圾收集,只能建议它。最终 jvm 决定 if 以及何时进行垃圾收集。)

标签: java excel coldfusion apache-poi large-files


【解决方案1】:

最好的办法是将数据导入临时表中。然后使用 ColdFusion 将临时表中的数据导入到主表中。这样,您可以使用 ColdFusion 简单地以块的形式导入数据,而不是一次全部导入。要导入 SQL Server,您需要做的就是使用导入工具,对于 mySQL,您可以使用多种方法。我个人只是使​​用 csv 文件导入。我知道这个过程不那么直接,但它会给您的 ColdFusion 过程带来更少的压力,而对您的 SQL 服务器造成更多的压力。

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

【讨论】:

  • 是的,最好的办法是将处理转移到比 CF 设计得更好的数据库。我认为您没有提到您的 DBMS,但 SQL Server 有几个选项,例如SSIS, linked servers, openrowset, etcetera。临时表或工作表可用作额外层,在完成导入主表之前验证数据。
  • 由于我们提供替代方法,您还可以考虑将文件转换为 csv,然后将其导入。 github.com/uniVocity/univocity-parsers 可以轻松地逐行读取文件,因此内存不会成为问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多