web-dev-qa-db-ja.com

Apache POI3.6を使用してExcelシートで255を超える列を取得する方法

Excelでカレンダーを作成しています。列1は2010年1月1日(dd.MM.yyyy)、列2は2010年1月2日というように続きます。

これは私のコードです:

int day_cell = 0;

for(int i = 0; i < days.size(); i++)
{
     Date day = days.get(i);

     HSSFCell cell = row.createCell(day_cell++);
     cell.setCellValue(day.toString());
}

列256に到達すると、POIは次の例外をスローします。

Java.lang.IllegalArgumentException: Invalid column index (256).  Allowable column range for BIFF8 is (0..255) or ('A'..'IV')
at org.Apache.poi.hssf.usermodel.HSSFCell.checkBounds(HSSFCell.Java:926)
at org.Apache.poi.hssf.usermodel.HSSFCell.<init>(HSSFCell.Java:162)
at org.Apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.Java:141)
at org.Apache.poi.hssf.usermodel.HSSFRow.createCell(HSSFRow.Java:119)

このバグレポートは、3.6リリースで修正されたことを示唆していることがわかりました。 3.5を使用していましたが、3.6に変更しても効果がないようです。誰かが何かヒントを得ましたか?

https://issues.Apache.org/bugzilla/show_bug.cgi?id=46806

編集:バグの問題は数式に関するものだったようです。

19
Tommy

私はそれを考え出した。 org.Apache.poi.hssf.usermodelからorg.Apache.poi.ss.usermodelに切り替える必要がありました

これにより、16k列などを使用できます。

9
Tommy

2007年以前のExcelシートには、256列の制限がありました。これらのシートは、「。xls」拡張子も生成します。 Excel 2007以降は、16K列に対応でき、XML形式に基づいており、「。xlsx」形式を生成します。 2007年以前のシートのPOIオブジェクトモデルはorg.Apache.poi.hssf.usermodelですが、2007以降のシートのオブジェクトモデルはorg.Apache.poi.xssf.usermodelです。パッケージorg.Apache.poi.ss.usermodelは、両方のオブジェクトモデルをカバーする統一されたインターフェイスを提供します。したがって、256を超える列を作成するには、org.Apache.poi.xssf.usermodelパッケージ内またはorg.Apache.poi.ss.usermodel内のクラスを使用する必要があります。

25
kk1010

問題は、APIではなくExcelにある可能性があります。

Excel 2007より前のスプレッドシートの最大列数は256です

9
Ed Harper

1年のうち65k行を使用できるように、縦向きから横向きに切り替える(つまり、データを転置する)ことを検討してください。これは、多数の列と少数の行を必要とするレポートで行ったこととまったく同じです。

または、1年を6か月のサブ期間に分割し、それぞれを独自のシートに分割することもできます。

これらはどちらも一時的なソリューションですが、要件によっては「十分に優れた」ソリューションを提供する場合があります。

これは、Excelの列数が限られているためです。これを参照してください: http://office.Microsoft.com/en-us/Excel-help/Excel-specifications-and-limits-HP005199291.aspx

2
evilReiko

ApachePOIを使用してExcelシートで255を超える列を取得する方法
試してみてください

Workbook workbook = new XSSFWorkbook()

<dependency>
   <groupId>org.Apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>`enter code here`
   <version>3.15</version>
  </dependency>

  <dependency>
   <groupId>org.Apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.15</version>
  </dependency>
1
Rajendra