C# WinForm实现点击按钮导出DataGridView单行至PDF(iTextSharp)
导出DataGridView特定行到PDF(含表头)
核心思路
先提取目标行数据,搭配原DataGridView的表头构建临时数据源,再用iTextSharp将这个临时数据源导出为PDF,复用你已有的导出逻辑即可。
实现步骤与代码
1. 按钮点击事件:获取目标行并构建临时数据源
假设你需要导出选中的行,按钮点击事件代码如下:
private void btnExportSelectedRow_Click(object sender, EventArgs e) { // 校验是否选中行 if (dataGridView1.SelectedRows.Count == 0) { MessageBox.Show("请先选中一行数据"); return; } // 获取选中的目标行 DataGridViewRow targetRow = dataGridView1.SelectedRows[0]; // 创建临时DataTable,用于存放表头和目标行 DataTable tempTable = new DataTable(); // 复制原DataGridView的表头列 foreach (DataGridViewColumn col in dataGridView1.Columns) { tempTable.Columns.Add(col.HeaderText); } // 将目标行数据填入临时表 DataRow newRow = tempTable.NewRow(); for (int i = 0; i < dataGridView1.Columns.Count; i++) { // 处理空值,避免导出异常 newRow[i] = targetRow.Cells[i].Value ?? DBNull.Value; } tempTable.Rows.Add(newRow); // 调用导出方法 ExportToPdf(tempTable, "特定行数据.pdf"); }
如果需要导出指定索引的行(比如第3行,索引从0开始),把dataGridView1.SelectedRows[0]替换成dataGridView1.Rows[2]即可。
2. 通用导出方法(适配完整/特定行导出)
修改你原有的导出方法,让它接受DataTable作为参数,这样既可以传入完整数据源导出全部,也可以传入临时表导出特定行:
private void ExportToPdf(DataTable dataTable, string savePath) { // 初始化PDF文档 Document pdfDoc = new Document(PageSize.A4, 10f, 10f, 10f, 0f); PdfWriter.GetInstance(pdfDoc, new FileStream(savePath, FileMode.Create)); pdfDoc.Open(); // 添加标题(可选,可根据需求修改) Paragraph title = new Paragraph("特定行导出数据", new Font(Font.FontFamily.TIMES_ROMAN, 12f, Font.BOLD)); title.Alignment = Element.ALIGN_CENTER; pdfDoc.Add(title); pdfDoc.Add(Chunk.NEWLINE); // 创建PDF表格,列数与DataTable一致 PdfPTable pdfTable = new PdfPTable(dataTable.Columns.Count); pdfTable.WidthPercentage = 100; // 添加表头单元格 foreach (DataColumn col in dataTable.Columns) { PdfPCell headerCell = new PdfPCell(new Phrase(col.ColumnName, new Font(Font.FontFamily.TIMES_ROMAN, 10f, Font.BOLD))); headerCell.BackgroundColor = new BaseColor(240, 240, 240); pdfTable.AddCell(headerCell); } // 添加数据行 foreach (DataRow row in dataTable.Rows) { foreach (var cellValue in row.ItemArray) { pdfTable.AddCell(new Phrase(cellValue.ToString(), new Font(Font.FontFamily.TIMES_ROMAN, 10f))); } } pdfDoc.Add(pdfTable); pdfDoc.Close(); MessageBox.Show("导出完成!"); }
关键说明
- 临时表构建:严格保留原DataGridView的表头文本,只添加目标行数据,确保导出格式和完整导出一致
- 空值处理:用
?? DBNull.Value避免单元格为空时抛出异常 - 复用逻辑:将导出逻辑与数据源解耦,既支持完整导出也支持特定行导出,减少冗余代码
内容的提问来源于stack exchange,提问作者Shubham Jadhav
相关产品推荐
相关产品推荐

