将大文本文件数据写入excel

srk*_*srk 6 java apache-poi aspose

我正在阅读一些用分隔符分隔的文本文件.

我的文本文件内容示例

Avc def efg jksjd
1 2 3 5
3 4 6 0

逐行使用散列映射将其保存在内存中,散列映射将行号作为整数类型的键,每行文本文件作为List对象

考虑一下,我的地图会存储这样的信息

整数列表

1 [Avc def efg jksjd]

我正在使用Apache POI写入excel.使用Apache POI写入excel时,我遵循这种方法,这是我的代码片段

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Sample sheet");
Map<Integer, List<Object>> excelDataHolder = new LinkedHashMap<Integer, List<Object>>();
int rownum = 0;
for (Integer key : keyset) {
            Row row = sheet.createRow(rownum++);
            List<Object> objList = excelHolder.get(key);//excelHolder is my map
            int cellnum = 0;
            for (Object obj : objList) {
                Cell cell = row.createCell(cellnum++);
                    cell.setCellValue((Date) obj);
            }
}
Run Code Online (Sandbox Code Playgroud)

如果要写入excel的行/记录的数量较少,则这很有效.想象一下,如果记录是十亿个数字,或者文本文件中有更多的行假设为100 000.我认为,我的方法失败了,因为createRow和createCell在堆中创建了超过10万个对象.无论java是excel api,我认为写入它(excel)是基于相同的方法,即如上所示的集合迭代.我也用aspose做了一些例子,因此aspose也有同样的问题.

  • createRow和createCell每次调用时都会创建新对象吗?
  • 如果是的话,还有什么选择?如何以更好的性能将大数据写入excel?

Jun*_*san 1

为什么不分块进行读取和写入呢?这是我可以考虑的方法:

  • 阅读您的 txt 文件几行,然后将信息放入地图中,就像您正在做的那样。假设您阅读了 100 行,并且地图中有 100 个条目。
  • 将这百条记录写入excel文件,第一次生成excel
  • 清空地图或重新初始化。
  • 现在阅读接下来的 100 行文本。据我了解,如果不读取前 100 行,就无法直接访问第 101 行。因此,您可能必须从头开始读取文件,但您可以避免前 100 行并在映射中创建条目。
  • 现在更新 Excel 文件。我认为您可以使用 POI 更新 excel,如此链接中提到的: 使用 jxl api / Apache POI 编辑现有的 excel 文件

如果你不断迭代这个过程。尽管我没有看到 cpu 消耗有什么重大差异,但您肯定会节省内存消耗。

希望能帮助到你!