數據庫幾乎無處不在,可以存儲和管理數據。從數據庫中檢索數據並將其加載到應用程序中是程序員的常見做法。當以編程方式生成 PDF 文件時,可能需要用數據庫中的數據填充文檔。為了在 .NET 應用程序中實現這一點,本文展示瞭如何使用 C# 將數據從數據庫添加到 PDF 文件。
用於將數據從數據庫添加到 PDF 的 C# .NET API
我們將使用 Aspose.PDF for .NET 將數據庫中的數據添加到 PDF 文件。它是一種流行的 PDF 生成和操作 API,允許您無縫地創建簡單和復雜佈局的 PDF 文件。您可以 下載 API 的二進製文件或使用 NuGet 安裝它。
PM> Install-Package Aspose.PDF
在 C# 中將數據庫中的數據添加到 PDF
在大多數情況下,數據從數據庫表中提取到 DataTable 或 DataView 中。因此,為了演示,我們將使用 DataTable 將數據添加到 PDF 文件。為了使事情更簡單,我們將在不使用數據庫的情況下以編程方式創建和填充 DataTable。以下是在 C# 中將數據從數據庫添加到 PDF 文件的步驟。
- 將數據從數據庫加載到 DataTable 中。
- 使用 Document 類創建新的 PDF 或加載現有的 PDF。
- 創建 Table 類的實例並設置其屬性,即列寬、邊框等。
- 使用 Table.ImportDataTable() 方法將數據從數據庫導入到 PDF 表格。
- 使用 Document.Pages[index].Paragraphs.Add(Table) 方法將表格添加到頁面。
- 使用 Document.Save(string) 方法保存 PDF 文件。
以下代碼示例顯示瞭如何在 C# 中將數據從數據庫導入到 PDF。
// 從數據庫獲取數據到DataTable
DataTable dt = new DataTable("Employee");
dt.Columns.Add("Employee_ID", typeof(Int32));
dt.Columns.Add("Employee_Name", typeof(string));
dt.Columns.Add("Gender", typeof(string));
// 以編程方式將 2 行添加到 DataTable 對像中
DataRow dr = dt.NewRow();
dr[0] = 1;
dr[1] = "John Smith";
dr[2] = "Male";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = 2;
dr[1] = "Mary Miller";
dr[2] = "Female";
dt.Rows.Add(dr);
// 創建文檔實例
Document doc = new Document();
doc.Pages.Add();
// 初始化 Table 的新實例
Aspose.Pdf.Table table = new Aspose.Pdf.Table();
// 設置表格的列寬
table.ColumnWidths = "40 100 100 100";
// 將表格邊框顏色設置為 LightGray
table.Border = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));
// 設置表格單元格的邊框
table.DefaultCellBorder = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, .5f, Aspose.Pdf.Color.FromRgb(System.Drawing.Color.LightGray));
// 導入數據
table.ImportDataTable(dt, true, 0, 1, 3, 3);
// 將表格對象添加到輸入文檔的第一頁
doc.Pages[1].Paragraphs.Add(table);
// 保存包含表格對象的更新文檔
doc.Save("output.pdf");
以下是上述代碼示例的輸出。
在 Entity Framework 中將數據庫中的數據添加到 PDF
如今,開發人員普遍使用實體框架 (EF)。因此,擴展 Table 類以使用 EF 中的列表或分組數據填充 PDF 文檔會很方便。以下是如何使用列表和分組數據填充 PDF 表格的實現。在這兩種方法中,表和數據都作為方法的參數傳遞。
public static class PdfHelper
{
public static void ImportEntityList<TSource>(this Pdf.Table table, IList<TSource> data)
{
var headRow = table.Rows.Add();
var props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in props)
{
headRow.Cells.Add(prop.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute dd ? dd.Name : prop.Name);
}
foreach (var item in data)
{
// 向表中添加行
var row = table.Rows.Add();
// 添加表格單元格
foreach (var t in props)
{
var dataItem = t.GetValue(item, null);
if (t.GetCustomAttribute(typeof(DataTypeAttribute)) is DataTypeAttribute dataType)
switch (dataType.DataType)
{
case DataType.Currency:
row.Cells.Add(string.Format("{0:C}", dataItem));
break;
case DataType.Date:
var dateTime = (DateTime)dataItem;
if (t.GetCustomAttribute(typeof(DisplayFormatAttribute)) is DisplayFormatAttribute df)
{
row.Cells.Add(string.IsNullOrEmpty(df.DataFormatString)
? dateTime.ToShortDateString()
: string.Format(df.DataFormatString, dateTime));
}
break;
default:
row.Cells.Add(dataItem.ToString());
break;
}
else
{
row.Cells.Add(dataItem.ToString());
}
}
}
}
public static void ImportGroupedData<TKey,TValue>(this Pdf.Table table, IEnumerable<Models.GroupViewModel<TKey, TValue>> groupedData)
{
var headRow = table.Rows.Add();
var props = typeof(TValue).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in props)
{
headRow.Cells.Add(prop.GetCustomAttribute(typeof(DisplayAttribute)) is DisplayAttribute dd ? dd.Name : prop.Name);
}
foreach (var group in groupedData)
{
// 向表中添加組行
var row = table.Rows.Add();
var cell = row.Cells.Add(group.Key.ToString());
cell.ColSpan = props.Length;
cell.BackgroundColor = Pdf.Color.DarkGray;
cell.DefaultCellTextState.ForegroundColor = Pdf.Color.White;
foreach (var item in group.Values)
{
// 向表中添加數據行
var dataRow = table.Rows.Add();
// 添加單元格
foreach (var t in props)
{
var dataItem = t.GetValue(item, null);
if (t.GetCustomAttribute(typeof(DataTypeAttribute)) is DataTypeAttribute dataType)
switch (dataType.DataType)
{
case DataType.Currency:
dataRow.Cells.Add(string.Format("{0:C}", dataItem));
break;
case DataType.Date:
var dateTime = (DateTime)dataItem;
if (t.GetCustomAttribute(typeof(DisplayFormatAttribute)) is DisplayFormatAttribute df)
{
dataRow.Cells.Add(string.IsNullOrEmpty(df.DataFormatString)
? dateTime.ToShortDateString()
: string.Format(df.DataFormatString, dateTime));
}
break;
default:
dataRow.Cells.Add(dataItem.ToString());
break;
}
else
{
dataRow.Cells.Add(dataItem.ToString());
}
}
}
}
}
}
public class GroupViewModel<K,T>
{
public K Key;
public IEnumerable<T> Values;
}
獲得免費許可證
您可以獲得免費的臨時許可證,以便在沒有評估限制的情況下使用 Aspose.PDF for .NET。
結論
在本文中,您學習瞭如何使用 C# 將數據庫中的數據添加到 PDF 文件中。您已經了解瞭如何將數據從 DataTable 導入到 PDF 文件中的表中。此外,我們還介紹了使用 Entity Framework 將數據導入 PDF 的實現。此外,您可以使用 文檔 探索有關 C# PDF API 的更多信息。如果您有任何問題或疑問,可以通過我們的論壇 聯繫我們。