====== Excel操作 ======
===== はじめに =====
Excel操作するには、「Microsoft.Office.Interop.Excel」を使ったCOM参照による方法が多いですが、Excel2003のサポートが切れたことでオープンソースのライブラリを使ってもいい環境になってきました。\\
「Microsoft.Office.Interop.Excel」を使った場合、Excelのインストールが必須だったりプロセス解放漏れのリスクなどのデメリットがあります。
参考:[[http://qiita.com/midori44/items/acab9106e6dad9653e73|Excelファイルを C# と VB.NET で読み込む "正しい" 方法]]
===== オープンソースライブラリ =====
オープンソースライブラリは下記3点が有力候補となります。
* EPPlus
* NPOI
* ClosedXML
* Spire.XLS
* SpreadsheetLight
この中でお勧めは「EPPlus」となります。但し、xlsはサポート対象外です。\\
逆に「NPOI」は「xls」もサポートしているので、必要ならNPOIでも構いません。\\
SpreadsheetLightは、最近開発された。
==== EPPlus ====
EPPlusはVer.4系までは[[https://wa3.i-3-i.info/word13201.html|LGPLライセンス]]、Ver.5以上はライセンスが変更され商用利用は有償となった。\\
Ver.4系の最新版(2022/02/21時点 4.5.3.3)を使用する。
メリットとして、コードの書き方が直感的、グラフなどにも対応している。\\
デメリットとして、xlsはサポート対象外となっている。
* [[http://chawatoyo.blog.fc2.com/blog-entry-15.html|EPPlusの使い方(目次)]]
=== コメント出力 ===
コメント出力すると、可能な限り回復するようにというダイアログボックスが表示されてしまう場合\\
[[https://stackoverflow.com/questions/41884454/epplus-adding-comment-results-error-opening-excel-file|EPPLUS adding comment results error opening excel file - stackoverflow]]
AddCommentの第2引数(author)が空文字だと駄目なので、何か文字をセットする。
range.AddComment("no data", "");
↓
range.AddComment("no data", "REF");
=== 数式の扱い ===
Excelファイルに出力する分には問題ないが、Excelファイルを読込みした際の数式は限定的である。\\
https://www.epplussoftware.com/de/Developers/FormulaCalc
Calculate()メソッド実行で、SUM(A2,A3)は正しく結果が出力されるが、1+1 や SUM(1,1)などは #VALUE になってしまう。
Trouble shooting/Logging でログを出力することができる。\\
https://github.com/EPPlusSoftware/EPPlus/wiki/Formula-Calculation
* ローカライズされた関数名は使用しないでください。英語の名前 (SUM、IF、VLOOKUP など) のみがサポートされています。
* 関数の引数間の区切り文字としてセミコロンを使用しないでください。コンマのみがサポートされています。
* 数式の先頭に = 記号を追加しないでください。"=SUM(A1:A2)" は間違っており、"SUM(A1:A2)" は正しいです。
==== NPOI ====
Javaで使われていたExcelファイル読み書き用ライブラリである「POI」を .NET に移植したものです。\\
POIの由来は、”Poor Obfuscation Implementation” (質の悪い難読な実装)の頭文字から来ているとの事で、Officeのファイル形式を調べた結果、非常に分かり難くなっていたことから、皮肉を込めて命名された。\\
ライセンスは [[https://reikawatanabe.com/whats-apache-license-v2/|Apache License 2.0]] です。
NPOIは他のライブラリーと比較して、コードの書き方が少々難しく直感的ではありません。\\
(行のオブジェクトを作成し、その中の列の要素にデータを代入して・・・など)
メリットとしてExcel 2003 以前の形式(.xls)をサポートしている。他のオープンソースライブラリより比較的処理が速い。長年の実績があるため、枯れたライブラリと言えるでしょう。
* [[https://tech-and-investment.com/excel-speedcomp/|【C#】エクセルライブラリの速度の比較 ClosedXML・NPOI・SpreadSheetLight 【書き込み編】]]
* [[https://redwarrior.hateblo.jp/entry/2018/08/30/090000|Excel読込でNPOIをEPPlusのように使うため拡張メソッドを作成した]]
* [[http://clubcsharp.seesaa.net/article/155393916.html|NPOIの再計算]]
==== ClosedXML ====
ClosedXMLは使いにくいと評されるMicrosoft Open XML Format SDKをラップし使い易くしたもの。MicrosoftがOpen XMLなので、Closed XML と名づけられました。\\
ライセンスは [[https://yamory.io/blog/about-mit-License/|MIT License]] です。
メリットとして、コードの書き方が直感的となっている。\\
デメリットとして、xlsはサポート対象外となっている。グラフの生成機能がない。
===== 参照 =====
* [[http://nnspaces.sblo.jp/article/88907504.html|NPOIもEPPLUSもClosedXMLもなんかいまいち。]]
* [[https://www.ka-net.org/blog/?p=6894|ClosedXMLやEPPlusでExcelファイルを読み書きしてみた。]]
* [[https://marunaka-blog.com/csharp-excel-read-compare/2849/|【C#】エクセルの読み込み速度比較 ~高速でおすすめのライブラリとは~]]