テンプレートから出力ファイルに出力するシートを選択できないのでしょうか?

612 views
Skip to first unread message

cozyk100

unread,
Jan 2, 2010, 8:40:05 PM1/2/10
to excella
いつもお世話になります、cozyk100と申します。

例えば、テンプレートにシートが3つ
sheet1
sheet2
sheet3
があったとして、条件によって、出力ファイルには
sheet1
sheet2
とか
sheet1
sheet3
だけを出力するというのはできないのでしょうか。実際にやってみるとexcella自体の処理は
正常終了するのですが、Excelで開くと壊れたファイルだと言われます。(添付ファイルのoops.zip参照)
Excelだと壊れていると言われるのですが、OpenOfficeだとそれなりに開けてしまうところが
不思議です。

ReportBook book = new ReportBook(templateFilePath,
baseDir + baseName , ExcelExporter.FORMAT_TYPE);
List<ReportSheet> sheets = new ArrayList<ReportSheet>();

sheets.add(new ReportSheet("sheet1","sheet1"));
sheets.add(new ReportSheet("sheet2","sheet2"));
sheets.add(new ReportSheet("sheet3","sheet3"));
・・・
configBook.addReportSheets(sheets);
ReportProcessor reportProcessor = new ReportProcessor();
reportProcessor.process(book);


と、いった感じで実行していますが。

以上、よろしくお願いします


tomo

unread,
Jan 3, 2010, 10:35:01 PM1/3/10
to excella
柴田です。

出力ファイルはReportSheetを作成したもののみを出力する仕様になっています。

テンプレートにシートが3つの場合、
(sheet1、sheet2、sheet3)
ReportSheetを2つ作成すると
(sheet1、sheet3)
出力ファイルは2つのシートになります。
(sheet1、sheet3)
ですので、条件によってReportSheetの作成有無で出力するシートを選択することが可能です。

シート名を変更すると、内部的にPOIを使用してclonesheetしているのですが、
すべての情報をコピーできていません。
そのためコピーできない情報があるテンプレートの場合、
Excelで開くと壊れたファイルを認識してしまいます。
OpenOfficeでそれなりに開くのは、完全互換ではないため
コピーできない情報を処理していないからだと思われます。

使用したテンプレートファイルをいただければ、
詳細な情報を提供できるかもしれません。

以上、よろしくお願いいたします。

tomo

unread,
Jan 3, 2010, 9:10:47 PM1/3/10
to excella
柴田です。

ReportSheetを作成したシートのみを出力する仕様になっています。

テンプレートにシートが3つある場合に
(sheet1、sheet2、sheet3)
ReportSheetを2つ作成すると
(sheet1、sheet2)
出力Excelのシート数は2つになります。
(sheet1、sheet2)
ですので、ReportSheetの作成有無で出力するシートを選択することが可能です。

シート名を変更している場合、内部的にPOIでcloneSheetしているのですが、
すべてコピーできていません。
そのコピーされない情報をテンプレートに使用していると、
Excelで開くと壊れたファイルとされてしまいます。

OpenOfficeでそれなりに開くことができるのは、
Excel完全互換ではないため、コピーされない情報を読み取っていないから
だと思われます。

使用したテンプレートをいただければ、詳細な情報を提供することが可能か
と思います。


以上、よろしくお願いします。


On 1月3日, 午前10:40, cozyk100 <cozyk...@gmail.com> wrote:

cozyk100

unread,
Jan 8, 2010, 8:50:35 AM1/8/10
to excella
いつもお世話になります、cozyk100と申します

わかりました。確かに、指定したシートだけ出力することは可能でした。
壊れたExcelができる原因はシート名の文字数によります。添付ファイルの

MultipleSheetSample.zip


をご覧ください。テンプレートに長~いシート名がある場合は壊れたExcelファイル
ができてしまいます。


以上、よろしくお願いします

tomo

unread,
Jan 11, 2010, 9:18:50 PM1/11/10
to excella
柴田です。

シート名の文字数なのですね。
こちらでも調査しました。10バイトより長い文字だと壊れるようです。

内部的に確認しました。
シート名=テンプレート名の場合シートのコピーはせず、シート順を最後尾に移動しています。
POIでWorkbookのsetSheetOrderメソッドを呼んでいるのですが、
setSheetOrderメソッド呼出し後、長い名前のシートを削除するとExcelが壊れます。
おそらくシート順変更時に長い名前のシートがある場合、情報を保持してしまっているのだろうと思います。
(ExCellaでは、setSheetOrderメソッドはシート名=テンプレート名の場合しか使用していません)

テンプレートのシート名は10バイト以下でお願いするということで対応させていただきます。


以上、よろしくお願いいたします。

> > > 以上、よろしくお願いします- 引用テキストを表示しない -
>
> - 引用テキストを表示 -

Reply all
Reply to author
Forward
0 new messages