如何在Windows Form中将含账单的Panel控件导出为非图片格式PDF和Excel
如何在C#中将Panel中的发票账单导出为结构化PDF和Excel(非图片格式)
嘿,我看你当前的代码是靠屏幕截图把Panel内容转成Bitmap,本质是生成图片格式的文件,没法实现真正可编辑、结构化的PDF/Excel导出。要搞定这个需求,我们得换个思路:直接提取Panel中控件里的文本和数据,再用专门的库来生成结构化文件。下面给你具体的实现方案:
一、导出为结构化PDF
推荐使用iTextSharp(或者更现代的iText7),这是.NET生态里很常用的PDF生成库。首先你需要通过NuGet安装对应的包:
- 旧版本(免费开源):
Install-Package iTextSharp - 新版本iText7:
Install-Package itext7
下面是适配你场景的代码示例,假设你的Panel里有Label、TextBox、DataGridView这些常用控件:
using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; using System.Windows.Forms; public void ExportPanelToPdf(Panel targetPanel, string outputFilePath) { // 初始化PDF文档,设置页面大小为A4 Document pdfDoc = new Document(PageSize.A4); PdfWriter.GetInstance(pdfDoc, new FileStream(outputFilePath, FileMode.Create)); pdfDoc.Open(); // 添加账单标题 pdfDoc.Add(new Paragraph("发票账单", FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 14))); pdfDoc.Add(Chunk.NEWLINE); // 遍历Panel里的所有控件,提取数据并写入PDF foreach (Control ctrl in targetPanel.Controls) { if (ctrl is Label label) { // 写入标签文本(加粗区分) pdfDoc.Add(new Paragraph($"{label.Text}:", FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12))); } else if (ctrl is TextBox textBox) { // 写入文本框的内容 pdfDoc.Add(new Paragraph(textBox.Text, FontFactory.GetFont(FontFactory.HELVETICA, 12))); pdfDoc.Add(Chunk.NEWLINE); } else if (ctrl is DataGridView dataGrid) { // 处理表格数据,生成PDF表格 PdfPTable pdfTable = new PdfPTable(dataGrid.Columns.Count); // 先写表头 foreach (DataGridViewColumn col in dataGrid.Columns) { pdfTable.AddCell(new Phrase(col.HeaderText, FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 10))); } // 再写表格行数据 foreach (DataGridViewRow row in dataGrid.Rows) { if (!row.IsNewRow) { foreach (DataGridViewCell cell in row.Cells) { pdfTable.AddCell(new Phrase(cell.Value?.ToString() ?? "", FontFactory.GetFont(FontFactory.HELVETICA, 10))); } } } pdfDoc.Add(pdfTable); pdfDoc.Add(Chunk.NEWLINE); } // 你可以根据Panel里的实际控件类型扩展,比如ComboBox、GroupBox等 } pdfDoc.Close(); MessageBox.Show("PDF导出完成!"); }
调用的时候直接传你的Panel和输出路径就行:
ExportPanelToPdf(panelInvoice, @"C:\Users\YourName\Documents\Invoice.pdf");
二、导出为结构化Excel
这里推荐用EPPlus库,操作Excel非常方便。注意EPPlus 5及以上版本需要商业授权,如果是非商业使用可以选旧版本,或者用NPOI替代(完全开源免费)。先通过NuGet安装:
- EPPlus:
Install-Package EPPlus - NPOI:
Install-Package NPOI
下面是EPPlus的实现代码:
using OfficeOpenXml; using System.IO; using System.Windows.Forms; public void ExportPanelToExcel(Panel targetPanel, string outputFilePath) { // 设置非商业许可证(如果用EPPlus 5+,非商业使用需要加这个) ExcelPackage.LicenseContext = LicenseContext.NonCommercial; using (ExcelPackage excelPackage = new ExcelPackage()) { // 创建一个工作表 ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("发票账单"); int currentRow = 1; // 添加标题 worksheet.Cells[currentRow, 1].Value = "发票账单"; worksheet.Cells[currentRow, 1].Style.Font.Bold = true; worksheet.Cells[currentRow, 1].Style.Font.Size = 14; currentRow += 2; // 遍历控件提取数据到Excel foreach (Control ctrl in targetPanel.Controls) { if (ctrl is Label label) { worksheet.Cells[currentRow, 1].Value = label.Text; worksheet.Cells[currentRow, 1].Style.Font.Bold = true; currentRow++; } else if (ctrl is TextBox textBox) { worksheet.Cells[currentRow, 1].Value = textBox.Text; currentRow += 2; } else if (ctrl is DataGridView dataGrid) { // 写入表头 for (int colIdx = 0; colIdx < dataGrid.Columns.Count; colIdx++) { worksheet.Cells[currentRow, colIdx + 1].Value = dataGrid.Columns[colIdx].HeaderText; worksheet.Cells[currentRow, colIdx + 1].Style.Font.Bold = true; } currentRow++; // 写入表格行数据 foreach (DataGridViewRow row in dataGrid.Rows) { if (!row.IsNewRow) { for (int colIdx = 0; colIdx < dataGrid.Columns.Count; colIdx++) { worksheet.Cells[currentRow, colIdx + 1].Value = row.Cells[colIdx].Value?.ToString() ?? ""; } currentRow++; } } currentRow += 2; } // 同样可以扩展其他控件类型的处理逻辑 } // 自动调整列宽,让内容更美观 worksheet.Cells.AutoFitColumns(); // 保存Excel文件 FileInfo excelFile = new FileInfo(outputFilePath); excelPackage.SaveAs(excelFile); MessageBox.Show("Excel导出完成!"); } }
调用方式:
ExportPanelToExcel(panelInvoice, @"C:\Users\YourName\Documents\Invoice.xlsx");
额外说明
- 你需要根据Panel里的实际控件类型(比如自定义控件、GroupBox嵌套等)调整遍历逻辑,确保所有需要的发票数据都被正确提取。
- 对比截图方式,结构化导出的文件支持编辑、搜索,数据还能被其他系统读取,完全符合业务场景的需求。
内容的提问来源于stack exchange,提问作者Sagar Parit
相关产品推荐
相关产品推荐

