.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
をインストールしました。
実際に製品として使う場合にはライセンスの購入が必要ですが、ライセンスがなくても試用ができます。
□ テンプレートの Excel
次の様なテンプレートの Excel を用意しました。計算式や書式の設定が可能なので次のような設定をしています。
- 合計のセルは計算式を設定
- 価格のセルには書式を設定
□ コード
<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/
■ 実行
実行します。メニューと価格を入力して。
[ 印刷 ] すると次の様な完璧な PDF が Edge で表示されました。