はじめに
最近戯れに Teratail の C# に関する質問で、答えられそうなものを答えてみる、ということをしています。
今回は↓を解決したかったのですが、
何故か別の問題がでてしまい、それを解決したときのメモです。
とあるライブラリがMacで使えない、という話で、「普通にインストールしたら使えますよ(ドヤァ)」てやろうとする
— 縄文土器(Masui Masanori) (@masanori_msl) 2018年8月2日
↓
別のエラーで無事死亡
↓
涙目で解決方法を調べる←イマココ
環境
- Visual Studio for Mac ver.7.5.4
- .NET Core ver.2.1
- ClosedXML ver.9.3.0
発生した問題
まず以下のようなコードを実行しようとしました。
(なお Windows 環境では問題なく動作することは確認しています)
Program.cs
class Program { private const string FilePath = @"HelloWorld.xlsx"; private const string SheetName = "Sample Sheet"; static void Main(string[] args) { using (var workbook = GetWorkbook()) { using (var worksheet = GetWorksheet(workbook)) { for (var i = 1; i <= 50; i++) { // 空のセルが見つかるまでスキップし、値を入れたらそこで処理を終了. if (worksheet.Cell("A" + i).Value.ToString() == "") { worksheet.Cell("A" + i).Value = "Hello world"; break; } } } workbook.Save(); } } static XLWorkbook GetWorkbook() { if (File.Exists(FilePath)) { return new XLWorkbook(FilePath); } // ファイルが存在しなければ新規作成. var workbook = new XLWorkbook(); // 1つ以上シートが存在する必要があるのでシートを追加. workbook.Worksheets.Add(SheetName); // ここでエラー. workbook.SaveAs(FilePath); return workbook; } static IXLWorksheet GetWorksheet(XLWorkbook workbook) { if (workbook.TryGetWorksheet(SheetName, out var worksheet)) { return worksheet; } // シートが存在しなければ追加. return workbook.Worksheets.Add(SheetName); } }
これを実行すると、 workbook.SaveAs(FilePath); の部分で TypeInitializationException が発生しました。
更に原因を追っていくと、どうやら libgdiplus というライブラリファイルが見つからないことが原因となっているようでした。
homebrewで起きた問題
libgdiplus は GitHub で開発が進められており、 README を基に、依存ファイルを homebrew でインストールし、 make install してみることにしました。
そして動かない homebrew orz
どうやら OS をアップデートした影響で、下記の問題が発生している様子。
ということで手順に従って権限を変更しようとしたのですが、エラーで失敗しましたorz
仕方がないので、 homebrew を再インストールすることにしました。
再インストール後、自動・手動で求められた依存ファイルのインストールを行い、なんとか homebrew が動作するようになりました。
解決
晴れて libgdiplus がインストールできるぞ! と思ったものの、 git clone した libgdiplus のディレクトリ上で make install を実行してもインストールするものはないよ。とエラーになってしまいました。
結果としては、 homebrew で libgdiplus を検索したときに見つけた、 mono-libgdiplus をインストールすることで解決しました。
いやぁ長かった。
おわりに
ともあれこれで Mac でも C# で Excel 操作ができるようになったわけですね。
Enjoy Excel Life!
ってどんな締めや。