3

255 列を超えたときにクラッシュが発生しました。この質問は POI に直接送信する必要があるかもしれませんが、非常に便利な API をさらに開発しようとする彼らの努力を邪魔したくありません。;-)制限ページは信じられないほど詳細ではありません。

では、出力が Excel で読み取り可能であると仮定すると、実際の制限についてどのような経験がありますか? POI を使用して、POI で生成された Excel ファイルのソフト制限とハード制限をベンチマークおよび調査したことのある人はいますか?

POI インターフェースですぐに見つけられる唯一の制限は、以下のとおりです。Microsoft は、POI でカバーされていないように見える Excel のさらなる制限をリストしています。

編集:おっと。過去 5 年間、POI を更新していないことに気付きました。そのため、以下のコードはそれ以来 100 回以上置き換えられている可能性があります。

編集: 以下のコードは、2008 年 10 月 19 日のバージョン 3.2 以降変更されていません。

/**
 * @throws RuntimeException if the bounds are exceeded.
 */
private void checkBounds(int cellNum) {
  if (cellNum > 255) {
      throw new RuntimeException("You cannot have more than 255 columns "+
                "in a given row (IV).  Because Excel can't handle it");
  }
  else if (cellNum < 0) {
      throw new RuntimeException("You cannot reference columns with an index of less then 0.");
  }
}
4

7 に答える 7

3

ワークブック内の HSSFCellStyles の数の制限に関して、スタイル マネージャーを構築するよりも簡単な方法を見つけました。POI CellUtils クラスには setCellStyleProperty() メソッドがあり、ワークブック内のスタイルを見つけて使用するか、存在しない場合は作成します。

この例では、POI 3.7 を使用して日付を書き込み、すべての日付セルに 1 つの形式のみを使用します (基になるセルがすべて同じスタイルである場合)。

   public void writeFormattedDate(Workbook wb, Cell cell, Date date) {
            CellUtil.setCellStyleProperty(cell, wb, CellUtil.DATA_FORMAT, wb.getCreationHelper().createDataFormat().getFormat("dd-MMM-yyyy"));
            cell.setCellValue(date)
    }

setCellStyleProperty() の主な注意点は、一度に 1 つのプロパティしか設定できないことです。プロパティと値のリストを取得するように簡単に書き直すことができます。

私のテストでは、制限は約 4030 スタイルに見え、ワークブックを開くとエラーが発生し、余分なフォーマットが削除されます。

于 2011-02-01T05:37:49.323 に答える
2

Excel ファイルを書き込む際に POI で見つけた最大の制限の 1 つは、ファイルに書き込まれる前にファイルの内容全体をメモリに保持することでした。非常に大きなファイル (行数が多い) の場合、これは実際の問題となり、OutOfMemory 例外が頻繁に発生しました。

ただし、あなたと同じように、これは非常に古いバージョンの POI でした。新しいバージョンがより効率的にメモリを使用するかどうかはわかりません。

于 2009-03-09T03:38:39.063 に答える
1

CellStyleCacheManager に関する paulgreg: これはスタイルを再利用する方法であることは事実ですが、 setCellStyle() メソッドは HSSFCellStyle パラメータを想定しており、私が知っている HSSFCellStyle を作成する唯一の方法は、呼び出してワークブックに登録することですそれは createCellStyle() メソッドです。

セルが実際に使用するスタイルは少なくなりますが、キャッシュがない場合と同じ数のスタイルがワークブックに登録されることになりませんか? それとも、私が気付いていない HSSF で使用されていないスタイルのパージのようなものがありますか?

于 2009-04-30T13:39:59.090 に答える
1

もう 1 つの重大な制限 (私の意見ではあまり説明されていません) は、HSSFCellStyle がワークブック内で制限されていることです (これは Excel の制限だと思います)。

すべてのセルに新しいスタイルを作成するべきではありません (その場合、Excel はワークブックを開くことができなくなるため) が、それらへの参照を保持し、セル スタイルが類似している場合はそれらを再適用する必要があります。

したがって、たとえば次のように、HSSFCellStyle の内部キャッシュを管理する必要があります: CellStyleCacheManager

于 2009-03-19T14:48:52.433 に答える
1

@albfan

私はあなたのキャッシュ クラスが気に入り、それらを に変換しました.NET。私はバグを見つけたと思います。

getGeneralStyle()は、次の呼び出しがあります。

copyCellStyle(workbook, cellStyle, defaultValuesCellStyle);

この呼び出しは、値を cellStyle オブジェクトから defaultValuesCellStyle にコピーして、デフォルトを上書きします。

反対のことが必要だと思うので、次のように変更する必要があります。

copyCellStyle(workbook, defaultValuesCellStyle, cellStyle);
于 2009-08-26T09:06:37.430 に答える
0

本当にちょっと奇妙に思えますが、コードを使用する方法では hashCode は必要ないので、そのコードをそこに残しました。それはポールグレッグが始めたものの、まだ終わっていないものだと思います。

于 2009-07-27T09:41:30.793 に答える