JETT は、すべてのスプレッドシート操作を実行するために Apache POI に依存しています。テンプレート シートをコピーするには、Workbook
のcloneSheet
メソッドを呼び出します。この方法は、可能な限りすべてをコピーするように見えますが、チャートはまったくコピーしません。テンプレートシートで複製するシート上のチャートで「シート固有のBean」を使用してテストしました。.xls と .xlsx の両方のテンプレートをテストし、Apache POI 3.9、3.10、および 3.11 を試しました。私は最新バージョンの JETT を使用しました。この記事の執筆時点では 0.9.0 です。
使用した Apache POI のバージョンに関係なく、結果は同じでした。.xls (HSSF) と .xlsx (XSSF) のどちらを使用したかによって結果が異なりましたが、どちらも良い結果ではありませんでした。
cloneSheet
メソッドが呼び出されると、Apache RuntimeException
POI からのメッセージが表示されます。
Exception in thread "main" java.lang.RuntimeException: The class
org.apache.poi.hssf.record.chart.ChartFRTInfoRecord needs to define a clone method
at org.apache.poi.hssf.record.Record.clone(Record.java:73)
at org.apache.poi.hssf.model.InternalSheet.cloneSheet(InternalSheet.java:418)
at org.apache.poi.hssf.usermodel.HSSFSheet.cloneSheet(HSSFSheet.java:142)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.cloneSheet(HSSFWorkbook.java:749)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.cloneSheet(HSSFWorkbook.java:100)
at net.sf.jett.transform.ExcelTransformer.transform(ExcelTransformer.java:549)
この例外により、結果のスプレッドシートが生成されなくなります。
への呼び出しはcloneSheet
成功しますが、結果のスプレッドシートは破損します。Excel でスプレッドシートを開くと、「読み取り不能なコンテンツ」というメッセージが表示され、元のシートを除いて、複製された各シートからグラフ オブジェクトが削除されます。元のシートの名前が変わらない場合、そのチャートはそのまま残ります。ただし、元のテンプレート シートの名前が変更された場合、チャートの系列参照は変更されず、失われます。
残念ながら、JETT はこれについて何もできません。これは Apache POI の問題です。Apache POI がチャートの API サポートを作成するとき、これが改善されることを願っています。Apache POI のバグ データベースに新しいバグを自由に追加してください。