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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:22:12