- PR -

POIで読み、そのまま出力したxlsがexcelで開けない

1
投稿者投稿内容
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2007-11-15 16:48
コントロールを多数持つxlsファイルは、poiで正しく出力できないようです。

既存のxlsファイルを開き、セルに値を入力、保存するツールを作成しています。
poi-3.0.1でまずは基本的な部分を作成し、単純に読み込んでそのまま書き込む機能をテストしたところ、例外も発生せず処理は正常に終了するのですが、出力されたxlsファイルがExcelで開けません(読み込めませんと叱られる)。

既存のxlsファイルにはチェックボックスなどのコントロールが複数存在するのですが、その総数が58以上になると上記現象になることが判りました(57以下なら出力xlsファイルはExcelで開けた)。
poiのバグかと思いwebを漁ってみましたが、関連するような情報が見つかりません。

このままだとこれまでのコーディングが全てパー、新たにVBAで組み直すことになるため、なんとかpoiで解決を図りたいのですが、何かアドバイス or 情報をいただけると幸いです。


コントロール数を数え間違えていたので修正しました。
xlsファイルを新規作成し、チェックボックスを大量に貼り付けても、上記と同じ数字になりました。

[ メッセージ編集済み 編集者: やじゅう 編集日時 2007-11-15 17:41 ]
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-11-15 17:54
直接の回答ではないのですが、下記の手順で試したところ、やじゅうさんのおっしゃるような現象は発生せず、Excel (2002 SP3) で開くことができました。
コントロールの数が直接の原因ではなく、その総数が38を超えるあたりで別のトリガを引いているのかもしれませんね。

  1. 1シートにコマンドボタンを39個貼り付けただけのワークブックを作成
  2. POI で 1. のワークブックを読み込む。
  3. A1 セルに文字列を挿入
  4. POI で別のファイルに出力
  5. 4. のファイルを Excel (2002 SP3) で開く

Excel で開こうとしたときに表示されるメッセージの詳細とか Excel のバージョンなんかも書き込んでおくと回答が付きやすいかもしれません。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-11-15 17:55
ASF Bugzillaに同じような情報が載ってましたよ、POI2.5で発生したという
ことみたいですけどね。

Can have no more than 60 form controls on a sheet
http://issues.apache.org/bugzilla/show_bug.cgi?id=39512

なんか2006/5から放置されているっぽいですが、ASF Bugzillaに登録して
検索すると、もしかしたら良い情報が得られるかもしれませんよ。


でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-11-15 18:01
うはww
コメント書いてる途中でコントロール総数の閾値が 39 から 58 に修正されてる・・・。orz

58 個では試してないです。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2007-11-15 18:35
乗りかかった船なので、数を増やして試してみました。
私の場合は58個までは大丈夫でしたが59個で 「ファイルを読み込めません。」のメッセージが表示されました。

「ファイルを読み込めません。」って表示されるんですね・・・。orz
メッセージの詳細を書いた方がいいとかいっちゃってごめんなさい。
こんな無愛想なメッセージが表示されているとは思いませんでした。

あと、POI でいじる前のファイルを org.apache.poi.hssf.dev.BiffViewer でチェックしてみたんですが、以下のような例外がスローされました。
コード:
lang.ArrayIndexOutOfBoundsException: illegal index: 8224 into array of length 8224
	at org.apache.poi.util.HexDump.dump(HexDump.java:184)
	at org.apache.poi.hssf.dev.BiffViewer$BiffviewRecordInputStream.dumpBytes(BiffViewer.java:624)
	at org.apache.poi.hssf.dev.BiffViewer.createRecords(BiffViewer.java:109)
	at org.apache.poi.hssf.dev.BiffViewer.run(BiffViewer.java:72)
	at poitest.BiffViewerRunner.main(BiffViewerRunner.java:22)


関係ないかもしれませんが、一応参考まで。
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2007-11-16 17:02
情報ありがとうございます。

ASF Bugzillaも早速登録し、過去メールを漁りましたが、解決につながる情報はなさそうでした。一応バグレポートは投げておきました(稚拙な英語で)。
自力で解決すべくPOIのソースも覗いてみましたが、5分で挫折しました。
JExcelAPIで逃げられないか試してみたところ、保存したXLSは開けたのですが、シート上のコントロールが全て消えてしまいました。(新規作成したxlsに、チェックボックスを60個貼り付けたデータではOKでした。何が違うのかは調査中です)

結局VBAでやることになりそうです。とほほ…
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2007-11-19 10:07
追加情報です。
JExcelAPIで消えてしまうのは「フォーム」コントロールで、「コントロールボックス」のコントロールは大丈夫のようです。
ということなら運用で回避できそうだと思ったのですが、トラブルが発覚したxlsファイルはお客さんのユーザが作っているものなので、それも難しいとのことでした。
1

スキルアップ/キャリアアップ(JOB@IT)