You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:45:32