rksoftware

Visual Studio とか C# とかが好きです

.NET Core デスクトップアプリケーションから DioDocs を使って帳票を PDF 出力する

.NET Core 3.0 で Windows デスクトップアプリ(WPF/WinForms)が .NET Core で作れるようになりました。
しかし、実際にデスクトップアプリを作る際には様々なライブラリを導入することが多いものです。その中でもいわゆる帳票出力コンポーネントは日本では非常に人気の高い要件でしょう。これがなければどんなに WPF の .NET Core 対応が完璧でも採用できないケースも多いはずです。

そこで DioDocs です。 .NET Standard 2.0 なので .NET Core 3.0 で動作します。詳しくは次の素晴らしい記事を読んでください。

■ 試してみる

実際に .NET Core の WPF から PDF を出力してみましょう。

□ プロジェクトの作成

いつもの様に dotnet コマンドでプロジェクトとソリューションを作成します。今回は dotnetcorediodocs という名前で作成しました。

プロジェクトの作成

>dotnet new wpf -n dotnetcorediodocs

プロジェクトのディレクトリへ移動

>cd dotnetcorediodocs

空のソリューションを作成

>dotnet new sln

ソリューションにプロジェクトを追加

>dotnet sln add dotnetcorediodocs.csproj

作成したソリューションを Visual Studio 2019 (Preview) で開きます。

□ NuGet パッケージのインストール

DioDocs は NuGet パッケージになっています。今回は GrapeCity.DioDocs.Excel.ja をインストールしました。
f:id:rksoftware:20190126192713j:plain

実際に製品として使う場合にはライセンスの購入が必要ですが、ライセンスがなくても試用ができます。

□ テンプレートの Excel

次の様なテンプレートの Excel を用意しました。計算式や書式の設定が可能なので次のような設定をしています。

  • 合計のセルは計算式を設定
  • 価格のセルには書式を設定

f:id:rksoftware:20190126192651j:plain

□ コード

<Window x:Class="dotnetcorediodocs.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:dotnetcorediodocs"
        mc:Ignorable="d"
        Title="MainWindow" Height="300" Width="300">
    <StackPanel HorizontalAlignment="Center" Margin="20">
        
        <Label Content="メニュー" FontSize="20"/>
        <TextBox HorizontalAlignment="Stretch" x:Name="menuText"/>
        
        <Label Content="価格"  FontSize="20"/>
        <TextBox HorizontalAlignment="Stretch" x:Name="priceText"/>
        
        <Button Content="印刷" FontSize="20" Click="Button_Click"/>
    </StackPanel>
</Window>
using System.Linq;
using System.Windows;

namespace dotnetcorediodocs
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // 入力文字列を数値にパース
            if (!int.TryParse(priceText.Text, out var price)) return;

            // テンプレート Excel を読み込む
            var workbook = new GrapeCity.Documents.Excel.Workbook();
            workbook.Open("template.xlsx");
            var activesheet = workbook.ActiveSheet;

            // データを書き込む
            foreach (var row in Enumerable.Range(4, 7))
            {
                activesheet.Range[row, 2].Value = menuText.Text;
                activesheet.Range[row, 3].Value = price;
            }

            // PDF ファイルを保存
            workbook.Save("weekdinner.pdf");

            // PDF ファイルをブラウザで
            // System.Diagnostics.Process.Start("weekdinner.pdf"); // .NET Framework ではこう書けた
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo("cmd", "/c start weekdinner.pdf") { CreateNoWindow = true });
        }
    }
}

□ .NET Core アプリケーションからファイルを開く

前述のコードでは作成した PDF ファイルを開くために、cmd を実行して start コマンドを実行しています。
コメントにもあるように .NET Framework では Process.Start( メソッドにファイル名を開くだけで適切なアプリケーションで開いてくれたのですが、.NET Core ではそうはいかないようです。ならば Edge を実行して...とも考えましたが、Process.Start( で直接 Edge と書いても Edge は実行できませんでした。

スマートではないですが、今のところコマンドプロンプトを介しての実行がコード量が少なくて済みそうです。

この件に関して、次の記事を参考にさせていただきました。
http://oita.oika.me/2017/09/17/dotnet-core-process-start-with-url/

■ 実行

実行します。メニューと価格を入力して。
f:id:rksoftware:20190126192510j:plain

[ 印刷 ] すると次の様な完璧な PDF が Edge で表示されました。
f:id:rksoftware:20190126192453j:plain