ColdFusion 8读取大型Excel文件

时间:2013-09-13 13:33:07

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

我已经能够创建我的应用程序,因此它可以获取具有多个工作表的Excel文件并将它们放入数据库中。但是我不知道我是如何使用大文件30mb +我尝试查看bufferedReader但是我不确定这是我想要的,因为它一次读取一部分并且我使用Apache POI来读取在多个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。

1 个答案:

答案 0 :(得分:1)

最好的办法是将数据导入临时表。然后使用ColdFusion将数据从临时表导入主表。通过这种方式,您可以使用ColdFusion简单地以块的形式导入数据,而不是一次性导入数据。要导入SQL Server,您需要做的就是使用导入工具,对于mySQL,有几种方法可以。我个人只是使​​用csv文件导入。我知道这个过程不那么直接,但它会减少你的ColdFusion进程的压力,并减少你的SQL服务器上的压力。

另一个建议是确保您的查询不会超时或您的页面。在您的网址后添加?requestTimeout=1000也可以阻止您的流程超时。我知道这是一个java错误,但是如果你的过程持续时间过长,那么可能会超时。