エンタープライズアプリケーションの開発において、データベースのクエリ結果を PDF 形式でエクスポートすることは、レポート機能における一般的な要件です。PDF はレイアウトが固定されており、クロスプラットフォームに対応し、アーカイブや配布が容易であるため、業務データの正式な出力形式として非常に適しています。
本稿では、無償ライブラリ Free Spire.XLS for .NET を利用した実装方法を紹介します。「データベース → DataTable → Excel ワークシート → PDF」という一連の流れでデータをエクスポートし、Microsoft Office 環境を一切必要としない点が特徴です。
1. 実装の考え方と技術的アプローチ
全体の実装は、以下の 3 つの主要フェーズに分かれます。
-
データの読み取り:ADO.NET を使用してデータベースに接続し、SQL クエリを実行して結果セットを
DataTableオブジェクトに格納します。 -
データの書き込み:Free Spire.XLS の
InsertDataTableメソッドを呼び出し、DataTableのデータを Excel ワークシートに一括挿入します。 - 形式の変換:組み込みの変換エンジンを使用して、ワークシートを直接 PDF ファイルとして出力します。
この方式の利点は、Excel を中間形式として活用することで、ヘッダーのスタイル、列幅、枠線などの書式設定を柔軟に行える点にあります。それらを一括で PDF に変換できるため、PDF に直接テーブルを描画する場合と比較して、開発効率が大幅に向上します。
🛠️ 2. 環境準備
2.1 依存ライブラリのインストール
Visual Studio の NuGet パッケージマネージャーを使用して、以下の 2 つのパッケージをインストールします。
- 表処理ライブラリ:
FreeSpire.XLS - SQL Server データプロバイダー:
Microsoft.Data.SqlClient(他のデータベースを使用する場合は、対応するドライバパッケージに適宜置き換えてください)
パッケージマネージャーコンソールでのインストールコマンドは以下のとおりです。
Install-Package FreeSpire.XLS
Install-Package Microsoft.Data.SqlClient
2.2 名前空間のインポート
コードファイルの先頭で、必要な名前空間をインポートします。
using Spire.Xls;
using System.Data;
using Microsoft.Data.SqlClient;
using System.Drawing;
2.3 バージョンに関する補足
本稿で使用する無償版は、基本的な Excel 編集機能および PDF 変換機能をサポートしています。ただし、無償版にはページ数制限があり、PDF 出力は最初の 3 ページまでに限定されます。そのため、小規模なデータセットを対象としたレポートシナリオに適しています。
3. 完全なコード実装
次のサンプルコードは、SQL Server データベースから製品テーブルのデータを読み取り、Excel に書き込んで基本スタイルを適用し、最終的に PDF ファイルとしてエクスポートする一連の流れを示します。
3.1 データベース接続とデータクエリ
/// <summary>
/// データベースからデータを取得し、DataTable に格納します
/// </summary>
/// <param name="connectionString">データベース接続文字列</param>
/// <param name="sqlQuery">実行する SQL クエリ</param>
/// <returns>データが格納された DataTable インスタンス</returns>
private static DataTable GetDataFromDatabase(string connectionString, string sqlQuery)
{
DataTable dataTable = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString))
{
SqlDataAdapter adapter = new SqlDataAdapter(sqlQuery, conn);
try
{
adapter.Fill(dataTable);
}
catch (Exception ex)
{
Console.WriteLine($"データの読み取りに失敗しました:{ex.Message}");
throw;
}
}
return dataTable;
}
3.2 Excel への書き込みと PDF エクスポート
/// <summary>
/// DataTable の内容を PDF ファイルとしてエクスポートします
/// </summary>
/// <param name="dataTable">データソースとなる DataTable</param>
/// <param name="outputPdfPath">出力先の PDF ファイルパス</param>
public static void ExportDataTableToPdf(DataTable dataTable, string outputPdfPath)
{
using (Workbook workbook = new Workbook())
{
Worksheet sheet = workbook.Worksheets[0];
sheet.Name = "データレポート";
// DataTable をワークシートに挿入(引数:データソース、列名の有無、開始行、開始列)
sheet.InsertDataTable(dataTable, true, 1, 1);
// データが格納されているセル範囲を自動取得
CellRange usedRange = sheet.AllocatedRange;
// ヘッダー行(1 行目)のスタイルを設定
CellRange headerRange = sheet.Range[1, 1, 1, dataTable.Columns.Count];
headerRange.Style.Font.IsBold = true;
headerRange.Style.Font.Size = 11;
headerRange.Style.Color = Color.LightSkyBlue;
headerRange.Style.HorizontalAlignment = HorizontalAlignType.Center;
headerRange.Style.VerticalAlignment = VerticalAlignType.Center;
// データ全体に枠線を設定(外枠+内部の区切り線)
usedRange.BorderAround(LineStyleType.Thin);
usedRange.BorderInside(LineStyleType.Thin);
// データ全体を中央揃えに設定
usedRange.Style.HorizontalAlignment = HorizontalAlignType.Center;
usedRange.Style.VerticalAlignment = VerticalAlignType.Center;
// データが存在する列に対してのみオートフィットを適用(パフォーマンス向上)
usedRange.AutoFitColumns();
// ページ設定:表をページの水平方向の中央に配置
sheet.PageSetup.CenterHorizontally = true;
// PDF として保存
workbook.SaveToFile(outputPdfPath, FileFormat.PDF);
}
}
3.3 メインメソッドからの呼び出し例
static void Main(string[] args)
{
// データベース接続文字列
string connString = "Server=localhost\\SQLEXPRESS;Database=SalesDB;User ID=demouser;Password=YourPassword;Encrypt=true;TrustServerCertificate=true;";
// 実行する SQL クエリ
string sql = @"
SELECT
o.OrderID AS 注文番号,
c.CustomerName AS 顧客名,
o.OrderDate AS 注文日,
o.TotalAmount AS 注文金額
FROM Orders o
JOIN Customers c ON o.CustomerID = c.CustomerID
WHERE YEAR(o.OrderDate) = 2026;
";
// PDF の出力パス
string outputPath = @"D:\Reports\SalesReport_2026.pdf";
try
{
DataTable data = GetDataFromDatabase(connString, sql);
ExportDataTableToPdf(data, outputPath);
Console.WriteLine($"PDF のエクスポートに成功しました。ファイルは {outputPath} に保存されています。");
}
catch (Exception ex)
{
Console.WriteLine($"エクスポート処理中にエラーが発生しました:{ex.Message}");
}
Console.ReadKey();
}
4. PDF 出力の最適化に関するアドバイス
4.1 ページの向きと用紙サイズ
列数が多い広めのテーブルでは、横向き印刷を設定することで内容が途切れるのを防げます。
sheet.PageSetup.Orientation = PageOrientationType.Landscape;
sheet.PageSetup.PaperSize = PaperSizeType.PaperA4;
4.2 拡大縮小の自動適合
すべての列が 1 ページ幅に収まるように、自動適合を有効にすることも有効です。
workbook.ConverterSetting.SheetFitToWidth = 1;
workbook.ConverterSetting.SheetFitToPage = false;
5. まとめ
以上が、データベースから PDF への明確かつ実践的なエクスポートパスを示したソリューションです。コード構造はシンプルでありながら拡張性に優れており、開発者はこのベースコードを出発点として、ヘッダーの結合、条件付き書式、合計行の追加など、ビジネス要件に応じた高度なレポート機能を容易に実装できます。