当前位置: 首页 > 面试题库 >

与POI相关的代码块运行缓慢

龚浩宕
2023-03-14
问题内容

我下面有一段包含循环的代码块:

Row row = null;
Cell cell = null;
String dataVal = null;
String[] temp = null;

for (int j = 0; j < this.myDataValues.size(); j++) {
  row = sheet.createRow(rownum++);
  temp = this.finalRowValues.get(j);

   for (int i = 0; i < 4; i++) {
       cell = row.createCell(i);

       dataVal = temp[i];

            if (NumberUtils.isNumber(dataVal)) {
                double d = Double.valueOf(dataVal);
                cell.setCellValue(d);
                cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                cell.setCellStyle(styles.get("currency"));
            } else if (isValidDate(dataVal)) {
                cell.setCellValue(dataVal);
                cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                cell.setCellStyle(styles.get("date"));
            } else {
                cell.setCellValue(temp[i]);
                cell.setCellType(Cell.CELL_TYPE_STRING);
                cell.setCellStyle(styles.get("data"));
            }
            sheet.autoSizeColumn(i);
        }
    }

其中每个对象包含4个值myDataValuesListof 是。String[]``String[]

我正在Rational Application Developer版本8和Apache POI 3.8中运行它。

myDataValues我认为大约有5500个元素的价值很小。

但是,此代码块需要花费一个多小时才能运行。

我认为这有问题。5500个元素(每个元素包含4个元素)应该运行得很快,并且应该是几分钟的问题。可能是什么原因?有没有办法使此块运行更快?

机器的可用内存或其他任何此类问题都没有错。一切都按预期进行,我已经验证了。问题仅在此块中。


问题答案:

您的处理非常缓慢,因为您要调用autoSizeColumn每一行。从Javadocs中获取autoSizeColumn方法:

在大张纸上,此过程可能相对较慢,因此,通常在处理结束时,每列仅应调用一次。

将调用autoSizeColumn放在创建行的for循环之外,仅在列上自己的循环中。这将最大程度地减少对此方法的调用并提高您的性能。



 类似资料:
  • 我正面临一个问题,比如我使用apache POI生成pptx powerpoint演示文稿,所以生成的ppt可以用libra office打开,但当我试图在ms powerpoint中打开时,它产生了一些问题,比如我在演示文稿中插入的图像无法显示。我将json数组中的字节编码字符串传递给我的服务。有人能帮我吗?有什么问题吗?谢谢

  • 我已经为我的项目创建了一个oauth模块。它具有授权服务器机制、Spring Security机制和资源服务器机制。 我需要某些endpoint只有通过授权才能访问,因此我在资源服务器中配置了安全性: 在不同于OAuth的模块中进行是否可取?如果是,我如何保护呼叫并验证令牌?如何在另一个模块中使用资源服务器。

  • 运行相关 bin/mn 主运行文件,安装后执行 mn 即调用的本程序,是 Python 程序。 mnexec.c 执行一些快速命令,比如关闭文件描述符等,是 C 程序,编译后生成二进制文件 mnexec 被 Python 库调用。

  • 考虑以下一段代码,它生成数组[1,2,3,...,n]的大小为k的所有子集: 例如,将生成[1,2,3,4]的长度为2的所有子集。代码中有两行生成一个删除了最后一个元素的列表。我尝试用来实现,并通过切掉最后一个元素(即)来创建一个全新的列表。带有的版本会生成正确的结果。但是,带有的版本没有。没有运行时错误;只是一个逻辑错误(即不正确的结果)。 我怀疑这与在进行切片时创建新列表和使用保持相同列表有关

  • 问题内容: 当我尝试运行以下代码时,出现与错误有关的信息。 我对此 并不陌生, 但是 我可以看到代码到达了第11行,但随后失败了 。 线程“主”中的异常java.lang.IllegalStateException:驱动程序可执行文件不存在:org上位于com.google.common.base.Preconditions.checkState(Preconditions.java:199)的C

  • 问题内容: 我有下面的代码。我只想检查代码块的运行时间。错误地,我再次复制并粘贴了相同的代码,并得到了有趣的结果。尽管代码块相同,但运行时间不同。而且 比其他人花费更多的时间。如果我切换代码块,则代码块4将比其他代码花费更多时间。 我在代码块中使用了两种不同类型的数组来检查它是否依赖于此。结果是一样的。如果代码块具有相同类型的数组,则最上面的代码块将花费更多时间。参见下面的代码和给出的输出。 运行