1

我有以下静态方法,可以打印从 40.000 行 .xls 电子表格导入的数据。

现在,在控制台打印数据大约需要 27 秒,内存消耗巨大。

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            System.out.print(cell.toString());
            if (j < list.size() - 1) {
                System.out.print(", ");
            }
        }
        System.out.println("");
    }
}

免责声明:我知道,我知道大数据属于数据库,不要在控制台打印输出,过早优化是万恶之源……

4

2 回答 2

2

您是否尝试过使用 StringBuilder 创建大字符串,而不是一次打印出每一行,然后一次打印,或者在添加了这么多行之后?您将使用 StringBuilder 作为一种缓冲区。

例如,

public static void printSheetData(List<List<HSSFCell>> sheetData) {
    StringBuilder strBuilder = new StringBuilder();
    for (int i = 0; i < sheetData.size(); i++) {
        List<HSSFCell> list = (List<HSSFCell>) sheetData.get(i);
        for (int j = 0; j < list.size(); j++) {
            HSSFCell cell = (HSSFCell) list.get(j);
            // System.out.print(cell.toString());
            strBuilder.append(cell.toString());
            if (j < list.size() - 1) {
                // System.out.print(", ");
                strBuilder.append(", ");
            }
        }
        // System.out.println("");
        strBuilder.append("\n");

        // consider testing strBuilder size here and printing it out if
        // it is greater than some pre-set, then re-initializing the 
        // strBuilder variable.
    }
    System.out.println(strBuilder.toString());
}
于 2012-06-18T21:16:22.603 回答
0

试试 log4j。它会为你缓冲。此外,您可以在阅读时打印而不是将整个电子表格加载到内存中吗?

于 2012-06-18T22:33:01.463 回答