ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

だいたいなんでもExcelをPDFに変換する魔法

すみません、フリーレン風に言いたかっただけです。Nugetのライブラリです。
というわけで作りました。MITライセンスでサーバーでも、なんならWebAssemblyでブラウザ上でも使えます。
github.com

変換できるのは

  1. 文字(サイズ、太さ、色)
  2. セル(種類、色、マージ)
  3. 画像

これだけなんですけど、一般的に使う分にはこれだけいけたら十分じゃない?リクエストあればサクッと作れるものなら足していこうと思います。

GitHubのReadMeにも載せてますがこんな感じの変換ができます。

おまけ機能で簡単な文字置換ができます。これを使えば元ネタをExcelで作っておいて、それをデータに合わせて書き換えてPDFに変換ってことができます。

使い方なんですけど、Fontがちょっと面倒。これは内部的に使ってるPdfSharpの仕様です。Fontって勝手に再配布できないし、そもそもサイズが大きいのでライブラリには取り込めない。なので使う分だけ用意してもらう仕様です。とはいえ業務アプリで使う場合はそんなフォントこだわりないんじゃないかな?この例ではNotoSansで統一して太字だけ対応してます。用途に合わせて調整してみてください。

public class CustomFontResolver : IFontResolver
{
    public byte[] GetFont(string faceName)
        //Implement so that you can get as many fonts as you need.
        => faceName.EndsWith("#b") ? Resources.NotoSansJP_ExtraBold : Resources.NotoSansJP_Regular;

    public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
    {
        var faceName = familyName; 
        if (isBold) faceName += "#b";
        return new FontResolverInfo(faceName);
    }
}
GlobalFontSettings.FontResolver = new CustomFontResolver();

それが終わると後は変換するだけです。ファイルパスを渡すのと、Webアプリで使いやすいようにStreamを渡す版も作ってます。

using var outStream = ExcelConverter.ConvertToPdf(workbookPath, 1);
File.WriteAllBytes(pdfPath, outStream.ToArray());

作り方

ClosedXMLとOpenXmlで解析してPdfSharpで書いているだけです。だから意外と小規模なコードです。幅と高さの単位を合わせるのがめっちゃ大変だった・・・。そのへん@tmytに教えてもらいました。ありがとう!