ASP.NET Core MVC中如何添加多行DataTable数据生成PDF?
解决ASP.NET Core MVC生成PDF表格仅显示最后一行的问题
核心问题原因
你遇到的问题大概率是创建DataRow后未将其添加到DataTable的Rows集合中,导致每次循环都覆盖了之前的行,最终只有最后一行数据被传递到PDF生成逻辑里。
正确实现步骤及代码示例
以下是完整的修正代码,包含从SQL Server取数、构建DataTable、生成PDF表格的流程(以iTextSharp为例,适配ASP.NET Core 5):
1. 安装必要的NuGet包
Install-Package iTextSharp.LGPLv2.Core Install-Package System.Data.SqlClient
2. 控制器代码
using Microsoft.AspNetCore.Mvc; using iTextSharp.text; using iTextSharp.text.pdf; using System.Data; using System.Data.SqlClient; using System.IO; public class PdfController : Controller { // 建议从appsettings.json读取连接字符串,避免硬编码 private readonly string _connectionString = "你的SQL Server连接字符串"; public IActionResult GenerateUserPdf() { // 1. 定义DataTable的列结构 DataTable userTable = new DataTable(); userTable.Columns.Add("姓名", typeof(string)); userTable.Columns.Add("地址", typeof(string)); userTable.Columns.Add("联系方式", typeof(string)); // 2. 从SQL Server查询数据 using (SqlConnection conn = new SqlConnection(_connectionString)) { string query = "SELECT UserName, UserAddress, UserPhone FROM UserInfo"; // 替换为你的实际查询语句 SqlCommand cmd = new SqlCommand(query, conn); conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); // 3. 遍历结果,创建行并添加到DataTable while (reader.Read()) { DataRow newRow = userTable.NewRow(); newRow["姓名"] = reader["UserName"].ToString(); newRow["地址"] = reader["UserAddress"].ToString(); newRow["联系方式"] = reader["UserPhone"].ToString(); // 关键操作:必须将新行添加到DataTable的Rows集合中 userTable.Rows.Add(newRow); } reader.Close(); } // 4. 生成PDF表格 MemoryStream ms = new MemoryStream(); Document document = new Document(PageSize.A4, 20, 20, 20, 20); PdfWriter.GetInstance(document, ms); document.Open(); // 创建PDF表格,列数与DataTable一致 PdfPTable pdfTable = new PdfPTable(userTable.Columns.Count); pdfTable.WidthPercentage = 100; // 添加表头 foreach (DataColumn col in userTable.Columns) { PdfPCell headerCell = new PdfPCell(new Phrase(col.ColumnName)); headerCell.BackgroundColor = BaseColor.LIGHT_GRAY; pdfTable.AddCell(headerCell); } // 添加表格内容(遍历DataTable所有行) foreach (DataRow row in userTable.Rows) { foreach (var cellValue in row.ItemArray) { pdfTable.AddCell(new Phrase(cellValue.ToString())); } } document.Add(pdfTable); document.Close(); // 返回生成的PDF文件 return File(ms.ToArray(), "application/pdf", "用户信息表.pdf"); } }
新手必看注意点
- 不可省略
userTable.Rows.Add(newRow):这是你之前的核心遗漏点,没有这一步,DataTable不会保存创建的行,每次循环都会生成新行覆盖之前的内容。 - 确保SQL查询返回的字段与DataTable列对应,也可以用索引取值(比如
reader[0])避免字段名不匹配问题。 - PDF生成时要遍历
userTable.Rows的所有行,不要只取最后一行。 - 生产环境中不要硬编码连接字符串,可通过
IConfiguration从appsettings.json读取。
内容的提问来源于stack exchange,提问作者新Acesyyy
相关产品推荐
相关产品推荐

