LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

使用 C# 从 PDF 文档自动提取表格并导出到 Excel 文件

admin
2025年8月27日 10:52 本文热度 30

采用 Aspose.PDF for .NET 来提取 PDF 表格,并使用 EPPlus 来生成 Excel 文件。下面是完整的实现步骤和代码。

步骤概述

  1. 创建项目:创建一个 Windows Forms 项目。

  2. 安装必要的 NuGet 包:安装 Aspose.PDF 和 EPPlus

  3. 设计界面:添加按钮和对话框控件。

  4. 实现逻辑:编写代码处理 PDF 提取和 Excel 导出。

  5. 保存文件:使用 SaveFileDialog 选择保存位置。

完整代码实现

1. 安装所需的 NuGet 包

通过 NuGet 包管理器安装以下包:

  • Aspose.PDF:用于从 PDF 提取表格。

  • EPPlus:用于生成 Excel 文件。

  • 如果你使用的是 .NET Core/.NET 5+,请安装 EPPlus 的相应版本。

2. 界面设计(Windows Forms)

在窗体上添加以下控件:

  • 一个 Button(命名为 btnUploadPDF,文本为“上传 PDF”)

  • 一个 Button(命名为 btnExportExcel,文本为“导出 Excel”,初始状态为禁用)

  • 一个 SaveFileDialog(命名为 saveFileDialog1,Filter 设置为 Excel Files|*.xlsx

3. 代码实现

using System;

using System.IO;

using System.Windows.Forms;

using Aspose.Pdf;

using Aspose.Pdf.Text;

using OfficeOpenXml;


namespace PDFTableExtractor

{

    public partial class MainForm : Form

    {

        private string pdfFilePath = string.Empty;

        private System.Data.DataTable extractedTable = null;


        public MainForm()

        {

            InitializeComponent();

            // 设置 EPPlus 许可证上下文(如果是非商业用途,可以使用社区许可证)

            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

        }


        // 上传 PDF 按钮点击事件

        private void btnUploadPDF_Click(object sender, EventArgs e)

        {

            using (OpenFileDialog openFileDialog = new OpenFileDialog())

            {

                openFileDialog.Filter = "PDF Files|*.pdf";

                openFileDialog.Title = "选择 PDF 文件";


                if (openFileDialog.ShowDialog() == DialogResult.OK)

                {

                    pdfFilePath = openFileDialog.FileName;

                    try

                    {

                        // 提取表格数据

                        extractedTable = ExtractTablesFromPDF(pdfFilePath);

                        

                        if (extractedTable != null && extractedTable.Rows.Count > 0)

                        {

                            MessageBox.Show($"成功从 PDF 提取 {extractedTable.Rows.Count} 行数据!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);

                            btnExportExcel.Enabled = true;

                        }

                        else

                        {

                            MessageBox.Show("未从 PDF 中提取到表格数据。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                            btnExportExcel.Enabled = false;

                        }

                    }

                    catch (Exception ex)

                    {

                        MessageBox.Show($"提取表格时发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    }

                }

            }

        }


        // 从 PDF 提取表格数据

        private System.Data.DataTable ExtractTablesFromPDF(string filePath)

        {

            System.Data.DataTable dataTable = new System.Data.DataTable("PDFTable");

            bool tableInitialized = false;


            // 加载 PDF 文档

            Document pdfDocument = new Document(filePath);


            // 初始化 TableAbsorber

            TableAbsorber absorber = new TableAbsorber();

            

            // 遍历所有页面

            foreach (Page page in pdfDocument.Pages)

            {

                // 访问页面并提取表格

                absorber.Visit(page);


                // 遍历所有找到的表格

                foreach (AbsorbedTable table in absorber.TableList)

                {

                    // 遍历行

                    foreach (AbsorbedRow row in table.RowList)

                    {

                        // 如果是第一次处理表格,则创建列

                        if (!tableInitialized)

                        {

                            foreach (AbsorbedCell cell in row.CellList)

                            {

                                dataTable.Columns.Add(); // 可以根据需要设置列名

                            }

                            tableInitialized = true;

                        }


                        // 创建新行

                        System.Data.DataRow dataRow = dataTable.NewRow();

                        int colIndex = 0;


                        // 遍历单元格

                        foreach (AbsorbedCell cell in row.CellList)

                        {

                            string cellText = "";

                            // 提取单元格中的文本片段

                            foreach (TextFragment textFragment in cell.TextFragments)

                            {

                                cellText += textFragment.Text;

                            }

                            dataRow[colIndex++] = cellText.Trim();

                        }


                        dataTable.Rows.Add(dataRow);

                    }

                }

            }


            return dataTable;

        }


        // 导出到 Excel 按钮点击事件

        private void btnExportExcel_Click(object sender, EventArgs e)

        {

            if (extractedTable == null || extractedTable.Rows.Count == 0)

            {

                MessageBox.Show("没有数据可导出。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);

                return;

            }


            // 选择保存位置

            saveFileDialog1.FileName = $"PDF_Extracted_Table_{DateTime.Now:yyyyMMddHHmmss}.xlsx";

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)

            {

                try

                {

                    SaveTableToExcel(extractedTable, saveFileDialog1.FileName);

                    MessageBox.Show($"数据已成功导出到:{saveFileDialog1.FileName}", "成功", MessageBoxButtons.OK, MessageBoxIcon.Information);

                }

                catch (Exception ex)

                {

                    MessageBox.Show($"导出 Excel 时发生错误:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

                }

            }

        }


        // 将 DataTable 保存到 Excel

        private void SaveTableToExcel(System.Data.DataTable dataTable, string filePath)

        {

            using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(filePath)))

            {

                ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets.Add("提取的数据");


                // 设置列头

                for (int i = 0; i < dataTable.Columns.Count; i++)

                {

                    worksheet.Cells[1, i + 1].Value = dataTable.Columns[i].ColumnName;

                    worksheet.Cells[1, i + 1].Style.Font.Bold = true;

                }


                // 填充数据

                for (int row = 0; row < dataTable.Rows.Count; row++)

                {

                    for (int col = 0; col < dataTable.Columns.Count; col++)

                    {

                        worksheet.Cells[row + 2, col + 1].Value = dataTable.Rows[row][col];

                    }

                }


                // 自动调整列宽

                worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();


                excelPackage.Save();

            }

        }

    }

}

关键代码说明

1、提取表格数据

  • 使用 Aspose.PDF 的 TableAbsorber 类来识别和提取 PDF 中的表格110

  • 遍历每个页面、每个表格、每行和每个单元格,将内容提取到 DataTable 中。

2、导出到 Excel

  • 使用 EPPlus 库创建 Excel 文件。

  • 将 DataTable 的数据写入 Excel 工作表,并自动调整列宽。

3、保存文件

  • 使用 SaveFileDialog 让用户选择 Excel 文件的保存位置和名称9

注意事项

  • Aspose.PDF 许可证:Aspose.PDF 是商业库,需要购买许可证用于生产环境。你可以申请临时许可证用于测试8

  • 表格复杂性:对于结构复杂的 PDF 表格(如合并单元格),可能需要额外的处理逻辑。上面的代码提供了基础提取功能。

  • 错误处理:代码中包含了基本的异常处理,在实际应用中可能需要更完善的错误处理机制。

  • 性能:处理大型 PDF 文件时,可能需要优化内存使用或添加进度指示。

替代方案

如果希望使用其他库,可以考虑:

  • iTextSharp:另一个处理 PDF 的强大库,但学习曲线较陡。

  • Spire.PDF for .NET:类似 Aspose.PDF 的商业库,也提供表格提取功能7

  • Python 集成:如果确实需要在 .NET 中使用 pdfplumber,可以通过 IronPython 调用,但配置较复杂,且可能不如原生 C# 方案稳定。

这个方案应该能够满足你使用 C# 从 PDF 提取表格并导出到 Excel 的需求。


该文章在 2025/8/28 16:29:33 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved