C#で古いエクセルファイル(xls)をエクセルを起動せずに読み込みたい

技術メモ
スポンサーリンク
スポンサーリンク

古いエクセルファイルを読み込みたい

C#でNFC(Felica/Mifare)の読み取り - 実践編 その2 - Suica/ICOCA履歴情報読み取り
今回の到達点 Suica/ICOCAの履歴情報を読み取れるようになる。 Felicaのどの領域がSuica/ICOCAの履歴情報に当たるかを知る。 基礎知識 Suica/ICOCA等の交通系のカードは、Felicaの技術が用...

上記の記事で紹介していましたが、路線・駅コード一覧・登録で配布されておられる、Suica/ICOCAなどの交通系ICカードで使用される路線・駅コードをxlsファイルから読み取りたいのです、できれば、Excelを起動せずに。。

結論

  • 上記のやりたいことは、xlsフォーマットが古すぎるとだめ。
  • NPOIはPOIと同じく、BIFF8 format (from Excel versions 97/2000/XP/2003)のみ対応。それより古い(BIFF5)とだめ。読み込めない。
  • ExcelDataReaderを試行し、読み込めたが、文字化けが解消できなかった。
  • 最終は、エクセルで一度xlsxに変換してから、NPOIで読み込むことにしました。

ライブラリの選択 NPOI

VSTO Excelでシートに画像を挿入・追加する
したいこと C#のBitmapオブジェクトを直接使用して、Excelに画像を追加したい。C#のImage オブジェクトを直接使用して、Excelに画像を追加したい。VSTOでExcelに画像を追加したい。関連セルの中に画...

で以前に紹介しましたが、エクセルを起動せずに読み込む方法として、

EPPlus , ClosedXML, NPOI, OpenXml などがあります。

今回は、StationCode.xlsファイルを読み込みたいので、NPOI一択。(記事投稿時点 2018/10/22)

とりあえず【C#】NPOIを使ってExcelファイルを作成・編集するを参考に、Nugetでインストールを行いました。

NPOIの読み込み方のコードを参考にして、読み込んでみましたが、例外が発生。。

NPOI.HSSF.OldExcelFormatException
HResult=0x80131500
Message=The supplied spreadsheet seems to be Excel 5.0/7.0 (BIFF5) format. POI only supports BIFF8 format (from Excel versions 97/2000/XP/2003)
Source=NPOI
スタック トレース:
場所 NPOI.HSSF.UserModel.HSSFWorkbook.GetWorkbookDirEntryName(DirectoryNode directory)
場所 NPOI.HSSF.UserModel.HSSFWorkbook..ctor(DirectoryNode directory, Boolean preserveNodes)
場所 NPOI.SS.UserModel.WorkbookFactory.Create(String file)
場所 UnitTestProject_ReadAndConvertStationCode.UnitTest1.TestMethod1()

たぶんですが、あなたのExcelは 5.0/7.0 (BIFF5) formatなので、古い。 POI は BIFF8 format (from Excel versions 97/2000/XP/2003)だけサポートしますよとのこと。まぁ、古すぎたんですね。戦略を練り直しです。

ライブラリの選択 ExcelDataReader

上記の結果を受けて、再調査しました。(2018/10/23)

ExcelDataReaderの”Supported file formats and versions”には、BIFF2~BIFF5も使用可能の様子。

C# の Excel ファイル操作ライブラリーの内容を参考にして、テストしてみました。読み込めました。

ただし、上記サンプルコード読み取り&書き込みをやってみましたが、下記画像の右側(出力結果)のように、日本語が正しく読めませんでした。

ちなみに、UTF8など(Unicode)で行けるかどうかを

var readerConfig = new ExcelReaderConfiguration();
readerConfig.FallbackEncoding = Encoding.GetEncoding(12000); 

を使用して、CreateReader(stream)の第二引数に入れて試してみましたが、ことごとく文字化けしたままでした。試したコードページは”65000″, “65001”, “1200” ,”1201″ ,”12000″, “12001” すべて意味なし。 “Encoding.UTF8″も試してみましたが、効果なし。

ダウンロードしてきたStationCode.xlsをエクセルで開くときに、出るエラーと何か関係でもあるのだろうか??

さて、再度戦略を変える必要がありそうです。

結局NPOIを選択

何をやってもうまくいかず、Excelを使用して一度.xlsから.xlsxに変換・保存してから、.xlsxファイルを読み込むことにしました。何事にも限界はありますから。

その他

Excelファイルを C# と VB.NET で読み込む “正しい” 方法は必読です。

タイトルとURLをコピーしました