C#

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

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

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

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

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

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

SpreadsheetLightについて

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

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

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

【C#】ExcelをSpreadsheetLightで操作する方法Excel(エクセル)の書き込み・読み込み・エクセル操作するならC#専用ライブラリ「SpreadsheetLight」がおすすめ。無料で利用できる上に、豊富なサンプルで導入が簡単です。この記事ではライブラリのインストールを始め、基本となるエクセルの操作方法について詳しく解説をしています。...

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

開発環境

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

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でアプリケーションを作成してみましょう。

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

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

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

【WPF】Material Designでオシャレな画面デザインに変更する方法WPFでオシャレなUI画面にするならMaterial Design In XAML Toolkitをオススメします。Material DesignとはGoogleが提唱したデザインシステムで、自作のUI画面に簡単に適用できます。Nugetからパッケージをインストールして適用するまでの手順とデモアプリのインストール方法を紹介します。...
コードは以下の通りです。
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のホームページには様々なサンプルコードが豊富に用意されているので、気になる方は閲覧してみることを勧めます。

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

【C#】Excelにグラフ(チャート)を挿入する方法(SpreadsheetLight)C#でExcelにグラフ(チャート)を挿入するなら、エクセル専用ライブラリ「SpreadsheetLight」がおすすめ。無料でライブラリが利用ができる上に、操作も簡単。この記事では棒グラフを挿入する方法を紹介していますので、参考にしてみてください。...
【C#】エクセルを読み込んで条件付き書式を適用する方法を紹介C#でエクセルを読み込んで条件付き書式を適用させたExcelファイルを出力する方法について紹介します。エクセルのインストールを必要としないライブラリ「SpreadsheetLight」を利用すると簡単に実装することができます。...
【C#】折れ線グラフをExcelファイルに表示する方法(SpreadsheetLight)折れ線グラフをC#のエクセルライブラリ「SpreadsheetLight」で表示する方法を紹介します。Excelに対して書き込み操作と読み込み操作が可能なライブラリです。本記事ではExcelファイルに折れ線グラフを表示する方法について解説しています。...

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

プログラミングを学習したいなら…

プログラミングスキルを身に付けるなら、プログラミングを効率良く学べる
プログラミングスクール」がオススメです。

特にこんな方にオススメ!!
これからエンジニアを目指したい
プログラミングの専門性を高めたい
プログラミングを学んで副業をしたい
エンジニアに転職して年収をアップさせたい

プログラミングを触ったことがない未経験からでも、プログラミングスクールで学習すれば、エンジニアへ就職・転職することも可能です。

あなたの「行動力」と「やる気」で、あなたの人生を大きく変えるチャンスになることでしょう。

プログラミングスクールに興味がある方は是非チェックしてみてください。

> プログラミングを学ぶ <

COMMENT

メールアドレスが公開されることはありません。

CAPTCHA