2

ループを含む以下のコード ブロックがあります。

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);
        }
    }

各オブジェクトにmyDataValuesは4 つの値が含まれています。ListString[]String[]

これを Rational Application Developer バージョン 8 と Apache POI 3.8 で実行しています。

約 5500 の要素がmyDataValuesあり、かなり小さい値だと思います。

ただし、このコード ブロックの実行には 1 時間以上かかります。

これには何か問題があると思います。それぞれが 4 つの要素を含む 5500 の要素は、かなり高速に実行され、数分で実行されるはずです。考えられる原因は何ですか?このブロックをより速く実行する方法はありますか?

マシンの使用可能なメモリやその他の問題に問題はありません。すべてが期待どおりに機能しており、確認済みです。問題はこのブロックのみです。

4

3 に答える 3

8

autoSizeColumnすべての行を呼び出しているため、処理が非常に遅くなります。メソッドJavadocautoSizeColumnから:

このプロセスは大きなシートでは比較的遅くなる可能性があるため、通常は処理の最後に列ごとに 1 回だけ呼び出す必要があります。

行を作成するループの外側に呼び出しを配置し​​、列のみautoSizeColumnの独自のforループに配置します。これにより、このメソッドの呼び出しが最小限に抑えられ、パフォーマンスが向上します。

于 2013-09-24T16:03:37.767 に答える
0

これを試して...

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"));
            }
        }
    }
    for (int i = 0; i < 4; i++) {
      sheet.autoSizeColumn(i);
    }
于 2013-09-24T15:46:57.960 に答える