vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

MacでClosedXMLを使ってExcel開こうとしたらエラーになった話

はじめに

最近戯れに Teratail の C# に関する質問で、答えられそうなものを答えてみる、ということをしています。

今回は↓を解決したかったのですが、

teratail.com

何故か別の問題がでてしまい、それを解決したときのメモです。

環境

発生した問題

まず以下のようなコードを実行しようとしました。
(なお 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 してみることにしました。

github.com

そして動かない homebrew orz

どうやら OS をアップデートした影響で、下記の問題が発生している様子。

qiita.com

ということで手順に従って権限を変更しようとしたのですが、エラーで失敗しましたorz

仕方がないので、 homebrew を再インストールすることにしました。

再インストール後、自動・手動で求められた依存ファイルのインストールを行い、なんとか homebrew が動作するようになりました。

解決

晴れて libgdiplus がインストールできるぞ! と思ったものの、 git clone した libgdiplus のディレクトリ上で make install を実行してもインストールするものはないよ。とエラーになってしまいました。

結果としては、 homebrew で libgdiplus を検索したときに見つけた、 mono-libgdiplus をインストールすることで解決しました。

いやぁ長かった。

おわりに

ともあれこれで Mac でも C#Excel 操作ができるようになったわけですね。

Enjoy Excel Life!

ってどんな締めや。