ExcelファイルやPDFファイルに出力してみよう(UWP編)
CompnentOneのほかのコンポーネントと組み合わせることで、バーコードを印刷したり、他の形式で保存したりできます。ここでは、ExcelファイルとPDFファイルへの出力を紹介します。
UWPで紹介していきますが、Windows Forms/WPFでもExcelコンポーネントやFlexReportコントロールなどの基本的な使い方は同じです。
Excelファイルを直接書き出す
Excelコンポーネントを使うと、Excelがインストールされていなくても、Excelファイルを書き出すことができます。前述した「ISBNバーコードをFlexGridに表示してみよう (UWP編)」のアプリに、Excelファイルへの書き出し機能を追加してみます。
ExcelファイルにはBarCodeコントロールを含められないので、バーコードは画像データとしてExcelファイルに貼り付けることになります。グリッドの中に自動生成されたBarCodeコントロールへアクセスするのはとても面倒なので、グリッドとは別にBarCodeコントロールを見えないところに配置しておきます(MainPage.xamlファイルの20行目付近)。
FlexGridに表示されているデータをExcelファイルに書き出すコードの概略は、次のようになります(コードの全体はMainPage.xaml.csファイルをご覧ください)。
private async void ExcelButton_Click(object sender, RoutedEventArgs e)
{
// FlexGrid に表示されているデータ
var currentData = this.flexgrid1.Rows.Select(r => r.DataItem).Cast<Book>();
// 新しい Excel ワークブックを作成
var xlBook = new C1XLBook();
// デフォルトで作成されたシートを取得
XLSheet sheet = xlBook.Sheets[0];
// シートの中身を書き込みます
int rowIndex = 0;
// ……省略……
foreach (var book in currentData)
{
rowIndex++;
// 見えないところに配置したBarCodeコントロールを使って、バーコードの画像を作る
this.HiddenBarCode.Text = book.IsbnWithoutCheckDigit;
C1Bitmap bitmap = new C1Bitmap();
using (var ms = new InMemoryRandomAccessStream().AsStream())
{
await this.HiddenBarCode.SaveAsync(ms, ImageFormat.Png);
bitmap.Load(ms);
}
// ……省略……
// 1行分のデータとバーコード画像をセット
sheet[rowIndex, 0].Value = book.Title;
sheet[rowIndex, 1].Value = book.Isbn;
sheet[rowIndex, 2].Value = bitmap; // 上で作成したバーコードの画像
sheet[rowIndex, 3].Value = book.Price;
}
// Excel ファイルへの書き出し
var picker = new FileSavePicker()
// ……省略……
var file = await picker.PickSaveFileAsync();
if (file != null)
{
var fileFormat = Path.GetExtension(file.Path).Equals(".xls")
? FileFormat.OpenXmlTemplate : FileFormat.OpenXml;
await xlBook.SaveAsync(file, fileFormat);
}
}
これで保存されたExcelファイルをExcelで開くと、次の画像のようになっています。
なお、次に説明するFlexReportコンポーネントを使っているときは、その出力先をPDFからExcelに変更するだけでExcelファイルに書き出せます。その場合は、バーコードの画像をいちいち作る必要はありません。FlexReportコンポーネントがやってくれます。
PDFファイルに書き出す
PDFファイルに書き出すには、PDFコンポーネントやFlexReportコンポーネントなどが使えます。PDFコンポーネントは、自前のコードで全てを描画しなければならないので、自由度は高いのですが少々面倒です。FlexReportコンポーネントは、デザイナで簡単に帳票などの定義が作れますし、PDFだけでなくExcel/Word/各種画像ファイルなどにも出力でき、また、直接印刷することも可能です。ここでは、前述した「ISBNバーコードをFlexGridに表示してみよう (UWP編)」のアプリに、FlexReportを使ってPDFファイルへの書き出し機能を追加する概要を紹介します。
まず、FlexReportデザイナで帳票を定義して、「.flxr」ファイルに書き出し、プロジェクトのAssetsフォルダに保存しておきます(プロパティペインのビルドアクションを[コンテンツ]に変えておいてください)。FlexReportデザイナは、Windows Forms用のComponentOneをインストールすると一緒に導入されます。
FlexReportは、内部的にBarCodeコントロールを利用できるようになっています。FlexReportデザイナで「バーコードフィールド」を定義すると、実行時に各プラットフォームのBarCodeコントロールに変換されます。FlexReportデザイナの使い方は割愛するので、詳しくはFlexReport for WinFormsの製品ヘルプを参照してください。
FlexReportの定義ファイルが準備できたら、あとは次のようなコードを書くだけです(MainPage.xaml.csファイル)。
private async void PdfButton_Click(object sender, RoutedEventArgs e)
{
// 現在、FlexGridに表示されているデータ
var currentData = this.flexgrid1.Rows.Select(r => r.DataItem).Cast<Book>();
// FlexReportの定義を読み込む
var rpt = new C1FlexReport();
using (var stream = File.OpenRead("Assets/BooksReport.flxr"))
rpt.Load(stream, "BooksReport");
// データを連結
rpt.DataSource.Recordset = currentData.ToList(); // IEnumerable<T>は不可
// レポートを生成
await rpt.RenderAsync();
// 印刷する場合
//await rpt.ShowPrintUIAsync();
// PDFファイルに直接保存する場合
var picker = new FileSavePicker()
// ……省略……
var file = await picker.PickSaveFileAsync();
if (file != null)
{
// 出力先となるPdfFilterオブジェクトを作成
var filter = new PdfFilter();
filter.StorageFile = file;
// Windows Formsなどでは、filter.FileName = file.Path;とする
// ファイルへ出力
await rpt.RenderToFilterAsync(filter);
}
}
これで保存されたPDFファイルをEdgeで開くと、次の画像のようになっています。
FlexReportデザイナに接続するデータ
UWPの場合、FlexReportコンポーネントに接続するデータはIList<T>コレクションでいいのですが、それではFlexReportデザイナに接続できません。FlexReportデザイナで読み込めるコレクションにするには、IC1FlexReportRecordsetインターフェイスとIC1FlexReportExternalRecordsetインターフェイスを実装する必要があります。
詳しくは公式ブログ記事「動的に生成されるサンプルデータを利用した帳票デザイン」の中の「カスタムデータソース」の項をご覧ください。

