> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】Excelを操作して帳票を出力するアプリを作成

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

C# でプログラミングをしていると、Excel ファイルを出力する機能があればと思うことがあります。

Excel ファイルの出力機能を備えれば、データベースに蓄積された大量のデータを入力してファイルの出力をできるようになります。Excel なら多くの人が使用するファイルなので、後からファイルを開いてデータの参照や編集、グラフを表示して解析したりすることが可能です。

ファイルを出力する際、予め決まったテンプレートへデータを入力すれば情報を整理して表示することができ、どこに情報があるか分かりやすくなります

大量のデータはあいにく持ち合わせていないので、例として何かいい案がないかを考えた末、帳票関係をテンプレートで出力するアプリを作成することにしました。ここでは領収書を例としてテンプレートを作成することにします。

作成したアプリを起動しようとした時に、「パソコンにエクセルがインストールされてなくて動かない」ということがないように、今回はエクセル不要で動作する「SpreadsheetLight」というライブラリを利用して作成します。

オススメの参考書

C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。

SpreadsheetLightについて

Microsoft が提供するExcel(2007以降)および LibreOffice Calc と互換性があるオープンソースのライブラリです。無料で利用できる MIT ライセンスで商用利用も可能です。

Excel に依存せず独自エンジンで動作するので、エクセルがなくても動かすことができます。Office のインストールが不要というのは大きなメリットの1つでしょう。

このライブラリはNuGetでインストールすることが可能です。インストールの方法や使用方法についてはこちらの記事で紹介しますので、参考にしてみてくださいね。

ここからはライブラリーのインストールが完了していることを前提に進めていきます。

この記事では次の環境で作成を行います。

項目スペック
OSWindows10
IDEVisual Studio 2019
フレームワーク.NET 5.0
UIフレームワークWPFアプリ
ライブラリSpreadsheetLight

UI フレームワークは WPF を利用していますが、UI との相互関係はないので WPF 以外でも利用可能です。

ソースコード

先に完成したテンプレートを表示しています。この画像内にあるエクセルの行列の数値を当てはめて確認してみてくださいね。

このテンプレートを出力するCreateExcelTemplateメソッド内に、セルに文字列を入力やスタイルの変更、罫線を引くなどの処理をします。

さっそくソースコードをみてみましょう。

private SLDocument CreateExcelTemplate(SLDocument sl)
{
    sl.RenameWorksheet(SLDocument.DefaultFirstSheetName, "領収書テンプレ");

    // スタイル作成
    SLStyle style = null;

    // 外枠罫線の形式と色を設定
    style = sl.CreateStyle();
    style.SetTopBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
    sl.SetCellStyle("B2", "O2", style);

    style = sl.CreateStyle();
    style.SetBottomBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
    sl.SetCellStyle("B17", "O17", style);

    style = sl.CreateStyle();
    style.SetLeftBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
    sl.SetCellStyle("B2", "B17", style);

    style = sl.CreateStyle();
    style.SetRightBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
    sl.SetCellStyle("O2", "O17", style);

    // 「領収書」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 20);
    style.SetFontBold(true);
    sl.SetCellStyle("H2", style);
    sl.SetRowHeight(2, 38);
    sl.SetCellValue("H2", "領 収 書");

    // 「No」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 11);
    sl.SetCellStyle("L3", "L4", style);
    sl.SetCellValue("L3", "No.");
    sl.SetCellValue("L4", "発行日");

    // 「御中」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 11);
    style.SetVerticalAlignment(VerticalAlignmentValues.Center);
    style.SetHorizontalAlignment(HorizontalAlignmentValues.Left);
    style.SetBottomBorder(BorderStyleValues.Thin, System.Drawing.Color.Black);
    sl.SetCellStyle("C5", "G5", style);
    sl.SetRowHeight(5, 30);
    sl.SetCellValue("G5", "御中");

    // 「文字」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 11);
    sl.SetCellStyle("C7", style);
    sl.SetCellValue("C7", "下記、正に領収致しました。");

    // 「金額」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 14);
    style.SetVerticalAlignment(VerticalAlignmentValues.Center);
    style.SetHorizontalAlignment(HorizontalAlignmentValues.Center);
    style.SetBottomBorder(BorderStyleValues.Thick, System.Drawing.Color.Black);
    style.Fill.SetPatternType(PatternValues.Solid);
    style.Fill.SetPatternForegroundColor(System.Drawing.Color.FromArgb(215, 228, 242));
    sl.SetCellStyle("C8", "N8", style);
    sl.SetRowHeight(8, 38);
    sl.SetCellValue("D8", "金額:");
    sl.SetCellValue("F8", "¥");

    // 「文字」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 11);
    sl.SetCellStyle("D9", "D12", style);
    sl.SetCellValue("D9", "但");
    sl.SetCellValue("D11", "内訳");
    sl.SetCellValue("D12", "消費税");

    // 「文字」を入力
    style = sl.CreateStyle();
    style.SetFont("Meiryo UI", 11);
    sl.SetCellStyle("L11", "L15", style);
    sl.SetCellValue("L11", "〇〇株式会社");
    sl.SetCellValue("L12", "〒");
    sl.SetCellValue("L13", "東京都渋谷区〇〇〇〇");
    sl.SetCellValue("L14", "△△△△ビル10階");
    sl.SetCellValue("L15", "TEL(電話番号):");

    return sl;
}

テンプレートに入力する文字列や罫線をブロック単位に分けて、ブロック毎にスタイルと文字列、罫線を使い分けをしています。領収書のテンプレートを作成する為に8個のブロックに分割をしました。

ブロックで適用する文字列のフォントやサイズ、罫線など書式設定をするには「SLStyle型のオブジェクト」を生成し、文字や罫線の種類・色など設定をしていきます。この書式設定は適用させるセルの範囲を設定できるので、SetCellStyleメソッドでセルの行列を指定しましょう。

SpreadsheetLight は上述の通り、セルのフォントやサイズ、背景色、罫線など様々な調整が可能です。

文字のフォントサイズを大きくしてしまうと、デフォルトの行の高さでは文字がセルに隠れてしまします。こういう場合は、SetRowHeightで行の高さを調整し、SetColumnWidthで列の幅を調整することができます。ライブラリを上手に扱うことで出力したエクセルファイルの見た目を綺麗にすることができちゃいます。

アプリの作成

テンプレートを出力するCreateExcelTemplateメソッドを使って、WPF でアプリケーションを作成してみましょう。

領収書のテンプレートファイルを作成するボタンと領収書に記載する項目(ここでは宛名と購入金額、内容)を入力したら、その文字をテンプレートに追加してファイルを出力するボタンがあります。

画面はマテリアルデザインを適用させてオシャレな画面に仕上げました。

マテリアルデザインの適用方法については、以下の記事で詳しく記載しています。

コードは以下の通りです。

public partial class MainWindow : Window
{
    private readonly string filepath = @"C:\Sample.xlsx";

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnCreateTemplate_Click(object sender, RoutedEventArgs e)
    {
        SLDocument sl = new SLDocument();

        // テンプレート作成
        sl = CreateExcelTemplate(sl);

        // ファイルを保存
        sl.SaveAs(filepath);
    }

    private void btnOutput_Click(object sender, RoutedEventArgs e)
    {
        SLDocument sl = new SLDocument();

        // テンプレート作成
        sl = CreateExcelTemplate(sl);

        // 入力文字列を追加
        sl = AddExcel(sl, txtName.Text, txtMoney.Text, txtExplanation.Text);

        // ファイルを保存
        sl.SaveAs(filepath);
    }

    private SLDocument AddExcel(SLDocument sl, string name, string money, string explanation)
    {
        // スタイル作成
        SLStyle style = null;
        style = sl.CreateStyle();
        style.SetFont("Meiryo UI", 11);
        style.SetVerticalAlignment(VerticalAlignmentValues.Center);
        style.SetHorizontalAlignment(HorizontalAlignmentValues.Left);

        // 「No」を入力
        sl.SetCellStyle("M3", style);
        sl.SetCellValue("M3", "000001");

        // 「発行日」を入力
        sl.SetCellStyle("M4", style);
        sl.SetCellValue("M4", DateTime.Now.ToString("yyyy/MM/dd"));

        // 「但し」を入力
        sl.SetCellStyle("E9", style);
        sl.SetCellValue("E9", explanation);

        style = sl.CreateStyle();
        style.SetFont("Meiryo UI", 14);
        style.SetVerticalAlignment(VerticalAlignmentValues.Center);
        style.SetHorizontalAlignment(HorizontalAlignmentValues.Left);

        // 「宛名」を入力
        sl.SetCellStyle("C5", style);
        sl.SetCellValue("C5", name);

        sl.SetCellStyle("H8", style);
        sl.SetCellValue("H8", money);

        return sl;
    }
}

さっそく動かしてみましょう。次のようにファイルが出力されたら完成です。

実際に領収書として使えそうですね!

まとめ

エクセルのインストール不要の SpreadsheetLight を使用して、エクセルの帳票を出力する方法を紹介しました。

セルの行列を指定して文字の入力と書式設定を行ったので、予想以上にコードを書く時間がかかってしまいました。今度はエクセルのフォーマットファイルを読み出して、必要な情報を C# で入力してみようかなと思います。

SpreadsheetLight のホームページには様々なサンプルコードが豊富に用意されているので、気になる方は閲覧してみることを勧めます。

本記事のサンプルはライブラリの使い方の参考になると思いますので、ライブラリを利用する機会があれば、またこの記事を見にきてください。

以上、最後まで読んでいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!