JaspreReportsのExcel出力で内容がページ内におさまらない

JaspreReportsのxls形式での出力にて、作成したファイルをExcelで開き、印刷プレビューでみると1ページに収まらず横幅がはみ出してしまっているという問題がありました(データが多いのでページが分かれたという意味ではないです)。同じテンプレートを使ってPDF形式で出力した場合には問題ありません。フォーラムのこのトピックと同じ問題のようです。

これは、JasperReportsがページ設定の余白を正しく設定していないことが原因のようです(JRXlsExporterの場合)。そのため、Excelで開くとデフォルトの余白になり、これがJasperReportsのテンプレートの余白よりも広い場合に発生します。また、JExcelApiExporterを使用した場合には、余白がすべて"0"となっておりページ内に収まらないということはありませんが、印刷した際に位置が左上によってしまいます。

私が調査した範囲ではJasperReports経由でExcelの余白を設定する方法を見つけることができませんでしたので、ちょっと強引かもしれませんが出力したxlsファイルをPOIで読み込んで余白を設定してみます。例外処理などなどは省略してます。

//
// JasperReportsで出力したファイルを読み込む
//
HSSFWorkbook wb = new HSSFWorkbook(new FileOutputStream("temp.xls"));
HSSFSheet sheet = wb.getSheetAt(0);

//
// 余白の設定(pixel -> inch)
//
JasperReport jasperReport = (JasperReport)JRLoader.loadObject(getTemplateFile());
sheet.setMargin(HSSFSheet.LeftMargin, (double) jasperReport.getLeftMargin() / 72);
sheet.setMargin(HSSFSheet.RightMargin, (double) jasperReport.getRightMargin() / 72);
sheet.setMargin(HSSFSheet.TopMargin, (double) jasperReport.getTopMargin() / 72);
sheet.setMargin(HSSFSheet.BottomMargin, (double) jasperReport.getBottomMargin() / 72);

//
// ファイルに書き出し
//
FileOutputStream fout = new FileOutputStream("out.xls");
wb.write(fout);

1ページしかないのであれば、印刷時に1ページにおさまるようにズームする設定にする方が簡単かもしれません。

sheet .setAutobreaks(true);
HSSFPrintSetup ps = sheet.getPrintSetup();
ps.setFitHeight((short)1);
ps.setFitWidth((short)1);