記事のディレクトリ
序文
最近、Javaを使用して大きなファイルXlsx(10MBを超えるExcelドキュメント)を読み取り、データベースにインポートするように依頼されました。BaiduはPOIを見つけました。
当初はPOIのことをよく知らなかったので、POIのユーザーモデルを使って簡単に最初のバージョンを開発しましたが、ファイルが5MBを超える限り、ユーザーモデルのメモリ要件が高すぎて起動しませんGC overhead limit exceeded
。
(そして、6MBのxlsxファイルを読み取ると、実際には3Gのメモリを消費する可能性がありますか??)
そこで、イベントモデルモードを使用することにしましたが、Excelの式のため、開発するコードの量が非常に多く、Baiduでイベントモデルを使用したPOIのケースを見つけるのは困難です。BaiduとGoogleは探していませんでした。一日中適切なケースを見つけた後、私はついに下から始めて、この知識を少しずつ噛み砕くことに決めました。ちなみに、ドキュメント、入出力、フォーマン学習方法を整理します。
次のような市場の他のツールを検討していないわけではありません。
- easyexcel
- hutool操作poi
- エクセルストリーミングリーダー
- gridexcel
- jxl
ただし、これらのツールのいずれも、次の特性を同時に満たすことはできません。
- 低メモリ消費(少なくとも、、
GC overhead limit exceeded
またはを引き起こさないOOM
) - 複雑な数式を自動的に処理します(最も不快なのは、2020/12/20、ABC / BCS-DS / BUCなどの日付文字列を数式として読み取ることです。つまり、既存のライブラリは十分な数式をサポートしていません)
- 非常に大きなファイルを読み取ります(インクリメンタルデータは20MB以上、フルデータは500MB近く)
easyexcelでできるかもしれませんが、ガチョウのブラックボックスはあえて使用しません。easyexcelの抽象化レベルが高すぎ、柔軟性が不十分で、ドキュメントがなく、学習コストが高すぎて、プロジェクトのニーズを満たすことができません。
ExcelのXlsx形式の詳細な説明
次のコンテンツの一部は次のリンクからのものであり、そのコンテンツは部分的に変更されています。
https://www.loc.gov/preservation/digital/formats/fdd/fdd000398.shtml
XLSXについて知る(Office Open XML、Spreadsheet ML)
Office Open XMLは、xlsx形式の標準であるOOXMLと略され、ECMA-376で作成されています。
次のリンクは、ECMA-376のドキュメントダウンロードアドレスです。
http://www.ecma-international.org/publications/standards/Ecma-376.htm
およびOOXMLについては、wikihttps ://en.wikipedia.org/wiki/Office_Open_XMLに詳細な紹介があります
。
ファイル拡張子として.xlsxを使用するOpenOffice XMLベースのスプレッドシート形式は、Excel2007以降のバージョンのMicrosoftExcelによって新しいドキュメント用に作成されたデフォルトの形式です。
この形式は、以前のバージョンのMicrosoft Excelで生成されたバイナリ.xls形式と同等になるように設計されています(MS-XLSを参照)。
便宜上、この形式の説明ではXLSXを使用して対応する形式を識別します。
XLSXファイルの主要なコンテンツはSpreadsheetMLでマークアップされます。これは、ISO / IEC 29500のパート1および4、情報技術–ドキュメントの説明と処理言語– Office Open XMLファイル形式(OOXML)で指定されています。
この説明は、ISO / IEC 29500:2012の仕様に焦点を当てており、「トランジショナル」と呼ばれるフォーマットバリアントを表しています。
ISO 29500のエディションは、2008年、2011年、2012年、および2016年に発行されましたが、SpreadsheetMLが2006年にECMA-376、パート1で最初に標準化されて以来、仕様は、ドキュメントの実際の使用法に一致するように明確化と修正を除いてほとんど変更されていません。
この説明は、ECMAInternationalおよびISO / IECによって2016年までに公開されたすべてのSpreadsheetMLバージョンに適用されるものとして読むことができます。
時系列のバージョンと違いの詳細については、以下の注を参照してください。
XLSX形式は、SpreadsheetMLマークアップ言語とスキーマを使用してスプレッドシートの「ドキュメント」を表します。
概念的には、ISO / IEC29500-1のSpreadsheetML仕様の用語を使用して、ドキュメントはワークブック内の1つ以上のワークシートで構成されます。
ワークシートは通常、セルの長方形グリッドで構成されます。
各セルには、値の計算に使用される値または数式を含めることができます。キャッシュされた値は通常、次の再計算まで保存されます。
単一のスプレッドシートドキュメントは、いくつかの目的に役立ちます。データ値のコンテナとして。
これらの値の分析を実行するためのプログラムコード(セル内の数式に基づく)として。分析の1つ以上のフォーマットされたレポート(チャートを含む)として。
基本を超えて、スプレッドシートアプリケーションは、時間の経過とともにより高度な機能のサポートを導入してきました。
これらには、外部ソースから動的にデータを抽出し、共同作業をサポートし、一時的なサブセットを表示するためのテーブル内のエントリの並べ替えやフィルタリングなど、これまでデータベースアプリケーションを必要としていた機能の数を増やすメカニズムが含まれます。 。
マークアップ仕様は、ユーザーが期待する堅牢なパフォーマンスをサポートする構造で、基本機能とより高度な機能の両方をサポートする必要があります。
その構造を見てください:
XLSXファイルは、Open Packaging Conventions(OPC / OOXML_2012、それ自体はZIP_6_2_0に基づく)を使用してパッケージ化されます。
パッケージは、ZIPソフトウェアで開くか、通常はファイル拡張子をに変更することで調べることができます.zip
。
最小限のパッケージのトップレベルは、一般的に3つのフォルダ(なければならない_rels
、docProps
とxl
)と1つのファイルの部分を([Content_Types].xml
)。
このxl
フォルダーには、ファイルパーツworkbook.xml
、worksheets
各ワークシートのファイルを含むフォルダー、および機能(計算順序の制御など)と表示(セルの書式設定スタイルなど)をサポートするその他のファイルとフォルダーを含む、ドキュメントの主要コンテンツが保持されます。スプレッドシート用。
埋め込まれたグラフィックもxl
、追加パーツとしてフォルダーに保存されます。
パッケージのトップレベルにある他のフォルダとパーツは、パッケージの効率的なナビゲーションと操作をサポートします。
_rels
_rels
はRelationshipsフォルダーであり、単一のファイルが含まれています.rels
(オペレーティングシステムと設定によっては、ファイルリストから非表示になる場合があります)。
パッケージ内の主要部分を一覧表示してリンクし、URIs
各主要部分とパッケージの関係のタイプを識別するために使用します。
特に、プライマリofficeDocument(通常は名前が付けられます/xl/workbook.xml
)との関係、および通常はdocProps
コアプロパティと拡張プロパティとしての内部のパーツとの関係を指定します。
docProps
docProps
は、ドキュメント全体のプロパティを含むフォルダです。通常、コアプロパティのセット、拡張プロパティまたはアプリケーション固有のプロパティのセット、およびドキュメントのサムネイルプレビューが含まれます。
[Content_Types] .xml
[Content_Types].xml
はファイルパーツであり、任意の必須パーツであり、パッケージ内のパーツOPC package
のコンテンツタイプ(MIME Internet Media Types
RFC 6838で定義されているように使用)を一覧表示します。
このフォーマットを指定する標準ドキュメントは、6000ページを超えます。
XLSXフォーマットの便利な紹介は次の場所にあります。
ロイターのダニエル・ディックによるSpreadsheetMLファイルの構造。
Open XMLSDKドキュメントからのSpreadsheetMLドキュメントの構造。典型的なスプレッドシートドキュメントパーツを示す図が含まれています。
次へ:Apache POIはeventmodelを使用して大きなファイルを読み取りますExcel(2)Xlsx形式のコンテンツの詳細な説明