Apache POI 3.8リリース

3月26日、Apache POIライブラリの新しいリリース-バージョン3.8がリリースされました。

Apache POIは、Microsoft Officeドキュメントを読み書きするためのJavaライブラリです。
Excel、PowerPoint、Wordなど。 POIを使用すると、プログラムでPOIを作成できます。
または既存のドキュメントの変更、テキストのインデックス作成、ネストされたプロセス
(埋め込み)オブジェクト(ドキュメント、写真など)など。

Apache POIの以前の安定バージョンは、1年半前の2010年10月にリリースされました。
したがって、変更は適切に蓄積されています。 200を超えるバグが修正され、多数のバグが追加されました
新機能と全体的なパフォーマンスの向上。


POI 3.8の新機能



大きな.xlsxファイルを作成するためのSXSSF Spreadsheet APIの実装
(> 100Kエントリ)、メモリが制限されています。



.xlsxファイルジェネレーター(XSSF)の標準実装は、メモリ内のドキュメント全体のモデルを構築し、
つまり メモリー内の各レコード(行)とセル(セル)には、modelkaがあります。 .xlsx形式はベースであるため
XMLでは、各モデルの背後にXML Beanがあり、かなり広範な構造が取得されます
大量のデータを生成すると、OutOfMemoryErrorが発生する可能性があります。

SXSSFは、それぞれの最後のNエントリのみを保存することにより、この問題を解決します
ワークシート、および残りは、蓄積されると、一時ファイルに保存され、保存されるときに
これらの一時ファイルの内容は、メイン文書にコピーされます。

小さな例:-Xmx128Mスイッチで開始すると、以下のコードはおおよそOutOfMemoryErrorでクラッシュします
200,000個のセルを生成した後:

Workbook workbook = new XSSFWorkbook(); // keep the whole model in memory Sheet sheet = workbook.createSheet(); // generate a grid of 1M rows x 256 columns for(int i = 0; i < 1000000; i++) { Row row = sheet.createRow(i); for(int j = 0; j < 256; j++){ Cell cell = row.createCell(j); cell.setCellValue(i*j); } } // the code never gets to this point because of OutOfMemoryError FileOutputStream out = new FileOutputStream("workbook.xlsx"); workbook.write(out); out.close(); 


同じですが、SXSSFを使用しても、-Xmx64Mスイッチを使用しても問題なく機能します。
  // keep last 100 rows in memory, flush older rows to disk Workbook workbook = new SXSSFWorkbook(100); Sheet sheet = workbook.createSheet(); // generate a grid of 1M rows x 256 columns for(int i = 0; i < 1000000; i++) { Row row = sheet.createRow(i); for(int j = 0; j < 256; j++){ Cell cell = row.createCell(j); cell.setCellValue(i*j); } } // Voila! FileOutputStream out = new FileOutputStream("workbook.xlsx"); workbook.write(out); out.close(); 


Formula Evaluatorの更新



新機能のサポート:

IRR,NPV,MROUND,VAR,VARP,CLEAN,CHAR,ADDRESS,HOUR,MINUTE,SECOND,RATE,WORKDAY,NETWORKDAYS,SUMIFS,RANK

合計で、POIはExcel 2010でサポートされている約300の機能のうち140の機能をサポートしています。
サポートされている機能の完全なリストはこちらにあります。

ユーザー定義関数

数式にサポートされていない関数が含まれている場合はどうなりますか?
デフォルトでは、式計算機はNotImplementedExceptionをスローします。これは次の2つの場合に発生します。


POI 3.8は、必要な機能をプログラムで実装する機能を提供します
計算機に登録します。 このようなもの:

  /** * CUBEMEMBER:   OLAP ,    POI-3.8 */ FreeRefFunction CUBEMEMBER = new FreeRefFunction() { public ValueEval evaluate(ValueEval[] args, OperationEvaluationContext ec) { if(args.length != 3) { //  CUBEMEMBER  3  return ErrorEval.VALUE_INVALID; } // TODO: implement me //      #NUM! return ErrorEval.NUM_ERROR; } }; WorkbookEvaluator.registerFunction("CUBEMEMBER", CUBEMEMBER); //   NotImplementedException      


Excel Antタスク

Antの拡張機能は、Javaコードを記述せずに式を再計算および検証するように設計されています。
この機能には興味深い話があります。Excelファイルを使用する科学プロジェクトから来ました
POIではなく、サードパーティソフトウェアによって作成されます。 ファイルにはデータ自体と式の両方が含まれており、必要です
検証者はプログラマーではありませんが、サーバー側でそれらの正当性を確認してください
Javaで、わずかなAnt構文のみを知っています。
Excel Antタスクを使用して、タスクはビルドファイルを作成します。 相互作用するターゲット
POIでは次のようになります。

  <target name="Habratest"> <excelant fileName="habratest.xls"> <test > <evaluate cell="'Habratest'!$B$4" expectedValue="790.7936" precision="1.0e-4" /> </test> </excelant> </target> 


Ant出力では、次のように表示されます。

 Habratest: [excelant] Using input file: habratest.xls [test] setting globalPrecision to 0.0010 in the evaluator [evaluate] test precision = 1.0E-4 global precision = 0.0010 [evaluate] Using evaluate precision of 1.0E-4 over the global precision of 0.0010 [excelant] 1/1 tests passed. 


XSLF -.pptxファイルを操作するためのJava API(PowerPoint 2007-2010)



POIは、.pptxファイルを操作するための完全に機能するユーザーAPIをサポートするようになりました。
プログラムで新しい.pptxファイルを作成したり、既存の.pptxファイルを編集したりできます。
スライド、テキスト、写真、表などを挿入または変更します。

以下は、サポートされている機能の不完全なリストです。



最後の機能であるPPTX2PNGに注目したいと思います。Javaメイン()インターフェースを備えたこのユーティリティ
スライドをPNG画像に変換しますが、このコードを基礎として、コンバーターを作成できます
他のグラフィック形式(SVG、Flash、HTML5 Canvasなど)に。 転送するだけです
java.awt.Graphics2Dからslide.drawメソッド(Graphics2Dグラフィックス)へのサブクラス。

たとえば、 この例は、 Apache Batikの SVGGraphics2Dドライバーを使用して、.pptxスライドをSVGに変換する方法を示しています。

MS Word .docからHTML、XSL-FO、およびテキストコンバーター


この機能はすでにHabréで言及されているため、メインのみに注目します。



バグ修正、バグ修正、さらに多くのバグ修正....


図書館全体の安定性を向上させるために多大な作業が行われた
-以前のバージョン3.7からの250以上の変更。 これは主にドキュメントの読みやすさに関連しています。
「POIがファイルを読み取らず、例外でクラッシュする」などのバグレポートはまれであり、すぐに完全に消えることを期待しています

バグを発見したか、プロジェクトの改善方法に関するアイデアを共有したいですか? http://poi.apache.org/にアクセスして、メーリングリストを購読し、送信してください。
Bugzilへのパッチ。 いつでも大歓迎です!

Source: https://habr.com/ru/post/J140898/


All Articles