古いエクセルファイルを読み込みたい
上記の記事で紹介していましたが、路線・駅コード一覧・登録で配布されておられる、Suica/ICOCAなどの交通系ICカードで使用される路線・駅コードをxlsファイルから読み取りたいのです、できれば、Excelを起動せずに。。
結論
- 上記のやりたいことは、xlsフォーマットが古すぎるとだめ。
- NPOIはPOIと同じく、BIFF8 format (from Excel versions 97/2000/XP/2003)のみ対応。それより古い(BIFF5)とだめ。読み込めない。
- ExcelDataReaderを試行し、読み込めたが、文字化けが解消できなかった。
- 最終は、エクセルで一度xlsxに変換してから、NPOIで読み込むことにしました。
ライブラリの選択 NPOI
で以前に紹介しましたが、エクセルを起動せずに読み込む方法として、
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ファイルを読み込むことにしました。何事にも限界はありますから。