0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C# を使用してデータベースデータを PDF にエクスポートする

0
Posted at

エンタープライズアプリケーションの開発において、データベースのクエリ結果を PDF 形式でエクスポートすることは、レポート機能における一般的な要件です。PDF はレイアウトが固定されており、クロスプラットフォームに対応し、アーカイブや配布が容易であるため、業務データの正式な出力形式として非常に適しています。

本稿では、無償ライブラリ Free Spire.XLS for .NET を利用した実装方法を紹介します。「データベース → DataTable → Excel ワークシート → PDF」という一連の流れでデータをエクスポートし、Microsoft Office 環境を一切必要としない点が特徴です。

1. 実装の考え方と技術的アプローチ

全体の実装は、以下の 3 つの主要フェーズに分かれます。

  1. データの読み取り:ADO.NET を使用してデータベースに接続し、SQL クエリを実行して結果セットを DataTable オブジェクトに格納します。
  2. データの書き込み:Free Spire.XLS の InsertDataTable メソッドを呼び出し、DataTable のデータを Excel ワークシートに一括挿入します。
  3. 形式の変換:組み込みの変換エンジンを使用して、ワークシートを直接 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 への明確かつ実践的なエクスポートパスを示したソリューションです。コード構造はシンプルでありながら拡張性に優れており、開発者はこのベースコードを出発点として、ヘッダーの結合、条件付き書式、合計行の追加など、ビジネス要件に応じた高度なレポート機能を容易に実装できます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?