C#代码实现从PDF中提取表格并另存为Excel文件

 更新时间:2026年02月25日 08:23:54   作者:2501_93070778  
这篇文章主要为大家详细介绍了如何使用 Spire.Office for .NET将 PDF 中的表格提取并导出为 Excel 文件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

将 PDF 中的表格提取并转换为 Excel 格式具有诸多优势,例如可以在更灵活、更加熟悉的环境中对数据进行编辑、分析和可视化处理。这对于需要处理大量表格数据的研究人员、数据分析师以及各类专业人士来说尤为重要。

本文将介绍如何使用 Spire.Office for .NET,通过 C# 和 VB.NET 将 PDF 中的表格提取并导出为 Excel 文件。

安装 Spire.Office for .NET

首先,需要在 .NET 项目中引用 Spire.Office for .NET 包中的 Spire.Pdf.dllSpire.Xls.dll

其中:

  • Spire.PDF 用于从 PDF 表格中提取数据;
  • Spire.XLS 用于根据提取到的数据生成 Excel 文档。

你可以通过官网下载对应的 DLL 文件后手动添加引用,也可以直接通过 NuGet 进行安装,更加便捷高效。

PM> Install-Package Spire.Office

在 C#、VB.NET 中提取 PDF 文件中的表格并另存为Excel文件

Spire.PDF for .NET 提供了 PdfTableExtractor.ExtractTable(int pageIndex) 方法,用于从可搜索的 PDF 指定页面中提取表格。
通过 PdfTable.GetText(int rowIndex, int columnIndex) 方法,可以获取表格中指定单元格的文本内容。随后,借助 Spire.XLS for .NET 提供的 Worksheet.Range[row, column].Value 属性,即可将这些数据写入 Excel 工作表。

具体操作步骤如下:

  • 创建 PdfDocument 类的实例。
  • 使用 PdfDocument.LoadFromFile() 方法加载示例 PDF 文件。
  • 调用 PdfTableExtractor.ExtractTable() 方法,从指定页面提取表格。
  • 使用 PdfTable.GetText() 方法获取表格中指定单元格的文本内容。
  • 创建 Workbook 对象。
  • 通过 Worksheet.Range.Value 属性,将从 PDF 获取的单元格数据写入工作表。
  • 使用 Workbook.SaveToFile() 方法,将工作簿保存为 Excel 文件。

下面的代码示例演示了如何提取 PDF 文档中的所有表格,并将每个表格分别写入同一个工作簿中的独立工作表。

示例代码:

using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;

namespace ExtractTablesToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 PdfDocument 对象
            PdfDocument doc = new PdfDocument();

            // 加载示例 PDF 文件
            doc.LoadFromFile(@"C:\Users\Administrator\Desktop\table.pdf");

            // 创建 Workbook 对象
            Workbook workbook = new Workbook();

            // 清除默认的工作表
            workbook.Worksheets.Clear();

            // 初始化 PdfTableExtractor 类的实例
            PdfTableExtractor extractor = new PdfTableExtractor(doc);

            // 声明 PdfTable 数组
            PdfTable[] tableList = null;

            int sheetNumber = 1;

            // 遍历 PDF 的每一页
            for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++)
            {
                // 从指定页面提取表格
                tableList = extractor.ExtractTable(pageIndex);

                // 判断表格列表是否为空
                if (tableList != null && tableList.Length > 0)
                {
                    // 遍历当前页面中的每一个表格
                    foreach (PdfTable table in tableList)
                    {
                        // 添加一个新的工作表
                        Worksheet sheet = workbook.Worksheets.Add(
                            String.Format("sheet{0}", sheetNumber)
                        );

                        // 获取当前表格的行数和列数
                        int row = table.GetRowCount();
                        int column = table.GetColumnCount();

                        // 遍历表格的行和列
                        for (int i = 0; i < row; i++)
                        {
                            for (int j = 0; j < column; j++)
                            {
                                // 获取指定单元格的文本内容
                                string text = table.GetText(i, j);

                                // 将文本写入 Excel 指定单元格
                                sheet.Range[i + 1, j + 1].Value = text;
                            }
                        }

                        sheetNumber++;
                    }
                }
            }

            // 保存为 Excel 文件
            workbook.SaveToFile("ToExcel.xlsx", ExcelVersion.Version2013);
        }
    }
}

方法补充

C#提取PDF文件中的表格并转换为Excel和CSV表格

完整代码示例:

using System.Text;
using Spire.Pdf;
using Spire.Pdf.Utilities;
using Spire.Xls;

namespace ExtractTablesToExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建 PdfDocument 对象并加载示例PDF文件
            PdfDocument doc = new PdfDocument();
            doc.LoadFromFile("示例.pdf");

            // 创建 Workbook 对象并清除默认工作表
            Workbook workbook = new Workbook();
            workbook.Worksheets.Clear();

            // 初始化 PdfTableExtractor 类的实例
            PdfTableExtractor extractor = new PdfTableExtractor(doc);

            // 声明 PdfTable 数组
            PdfTable[]? tableList = null;

            int sheetNumber = 1;

            // 循环遍历页面
            for (int pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++)
            {
                // 从特定页面提取表格
                tableList = extractor.ExtractTable(pageIndex);

                // 判断表格列表是否为空
                if (tableList != null && tableList.Length > 0)
                {
                    // 遍历列表中的表格
                    foreach (PdfTable table in tableList)
                    {
                        // 添加工作表
                        Worksheet sheet = workbook.Worksheets.Add(string.Format("Table_{0}", sheetNumber));

                        // 获取特定表格的行数和列数
                        int row = table.GetRowCount();
                        int column = table.GetColumnCount();

                        // 循环遍历行和列
                        for (int i = 0; i < row; i++)
                        {
                            for (int j = 0; j < column; j++)
                            {
                                // 从特定单元格获取文本
                                string text = table.GetText(i, j);

                                // 将文本写入指定单元格
                                sheet.Range[i + 1, j + 1].Value = text;
                            }
                        }
                        sheet.SaveToFile("output/表格/CSV表格.csv", ",", Encoding.UTF8);
                        sheetNumber++;
                    }
                }
            }

            // 保存为Excel工作簿
            workbook.SaveToFile("output/表格/Excel表格.xlsx", ExcelVersion.Version2013);
            doc.Close();
            workbook.Dispose();
        }
    }
}

C# 提取 PDF 中的表格

如果你需要快速预览表格数据(例如,开发调试或验证提取结果),可以直接通过控制台实时输出结果,无需生成额外文件,节省开发时间。

从 PDF 表格中提取数据的关键方法:

  • PdfDocument:表示一个 PDF 文件。
  • LoadFromFile:加载要处理的 PDF 文件。
  • PdfTableExtractor:基于视觉线索检测 PDF 中的表格。
  • ExtractTable(pageIndex):提取指定页码的所有表格,返回 PdfTable 数组。
  • GetRowCount()/GetColumnCount():检索每个表格的行数和列数。
  • GetText(rowIndex, columnIndex):从指定单元格中提取文本。
using Spire.Pdf;
using Spire.Pdf.Utilities;

namespace ExtractPdfTable
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument对象
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文件
            pdf.LoadFromFile("表格.pdf");

            // 初始化PdfTableExtractor类的实例
            PdfTableExtractor extractor = new PdfTableExtractor(pdf);


            // 循环遍历页面
            for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
            {
                // 从特定页面提取表格
                PdfTable[] tableList = extractor.ExtractTable(pageIndex);

                // 判断表格列表是否为空
                if (tableList != null && tableList.Length > 0)
                {
                    int tableNumber = 1;
                    // 循环遍历列表中的表格
                    foreach (PdfTable table in tableList)
                    {
                        Console.WriteLine($"\n第 {pageIndex + 1} 页的第 {tableNumber} 个表格:");
                        Console.WriteLine("-----------------------------------");

                        // 获取特定表格的行数和列数
                        int row = table.GetRowCount();
                        int column = table.GetColumnCount();

                        // 循环遍历行和列
                        for (int i = 0; i < row; i++)
                        {
                            for (int j = 0; j < column; j++)
                            {
                                // 从特定单元格获取文本
                                string text = table.GetText(i, j);

                                // 将单元格文本打印到控制台并带有分隔符
                                Console.Write($"{text}\t");
                            }
                            // 每行后换行
                            Console.WriteLine();
                        }
                        tableNumber++;
                    }
                }
            }

            // 关闭文档
            pdf.Close();
        }
    }
}

C# 将 PDF 表格导出为 CSV

CSV(逗号分隔值)是表格数据的行业标准,与 Excel、Google Sheets 和数据库兼容。此方法通过引用单元格和处理特殊字符,将提取的表格格式化为有效的 CSV 文件。

提取 PDF 表格到 CSV 的主要特点:

  • StreamWriter:增量写入数据到 CSV 文件,减少大型 PDF 文件的内存占用。
  • 特殊字符处理:按 CSV 标准转义单元格中的逗号和双引号,避免列错位。
  • 工具兼容:生成的 CSV 可直接用 Excel 打开,无需手动调整格式,减少后续操作成本。
  • 编码兼容:UTF-8 编码确保中文、特殊符号在 Excel 中正常显示(避免打开时乱码)。
using Spire.Pdf;
using Spire.Pdf.Utilities;
using System.Text;

namespace ExtractTableToCsv
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建PdfDocument对象
            PdfDocument pdf = new PdfDocument();

            // 加载PDF文件
            pdf.LoadFromFile("表格.pdf");

            // 创建StreamWriter对象以高效写入CSV
            using (StreamWriter csvWriter = new StreamWriter("PDF表格.csv", false, Encoding.UTF8))
            {
                // 创建PdfTableExtractor对象
                PdfTableExtractor extractor = new PdfTableExtractor(pdf);

                // 循环遍历页面
                for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
                {
                    // 从特定页面提取表格
                    PdfTable[] tableList = extractor.ExtractTable(pageIndex);

                    // 判断表格列表是否为空
                    if (tableList != null && tableList.Length > 0)
                    {
                        // 循环遍历列表中的表格
                        foreach (PdfTable table in tableList)
                        {
                            // 获取特定表格的行数和列数
                            int row = table.GetRowCount();
                            int column = table.GetColumnCount();

                            // 循环遍历行
                            for (int i = 0; i < row; i++)
                            {
                                // 创建列表存储数据
                                List<string> rowData = new List<string>();
                                // 循环遍历列
                                for (int j = 0; j < column; j++)
                                {
                                    // 从表格单元格检索文本
                                    string cellText = table.GetText(i, j).Replace("\"", "\"\"");
                                    // 将单元格文本添加到列表并用双引号括起来
                                    rowData.Add($"\"{cellText}\"");
                                }
                                // 用逗号连接单元格并写入CSV
                                csvWriter.WriteLine(string.Join(",", rowData));
                            }
                        }
                    }
                }
            }
        }
    }
}

到此这篇关于C#代码实现从PDF中提取表格并另存为Excel文件的文章就介绍到这了,更多相关C#提取PDF表格并存为Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c#对xml增删改查操作示例

    c#对xml增删改查操作示例

    本文主要介绍c#对xml增删改查操作的示例,大家参考使用吧
    2014-01-01
  • C# EventHandler的使用详解(最新整理)

    C# EventHandler的使用详解(最新整理)

    在C#中,EventHandler是一种特殊的委托类型,专门用于事件处理,它定义在System命名空间中,并且通常用来实现发布-订阅模式,这是 .NET 框架中处理事件的标准方式,下面通过本文给大家介绍C# EventHandler的使用,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Unity实现鼠标点2D转3D进行旋转

    Unity实现鼠标点2D转3D进行旋转

    这篇文章主要为大家详细介绍了Unity实现鼠标点2D转3D进行旋转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 基于WPF实现步骤控件的示例代码

    基于WPF实现步骤控件的示例代码

    这篇文章主要为大家详细介绍了WPF实现简单的步骤控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-01-01
  • C#基于百度AI实现机器翻译功能

    C#基于百度AI实现机器翻译功能

    众所周知,基于百度ai开发平台我们可以实现了人脸识别、文字识别 、语音识别等功能。本文将介绍它的另一个功能,即实现机器翻译,感兴趣的可以了解一下
    2022-01-01
  • C# CefSharp 根据输入日期段自动选择日期的操作代码

    C# CefSharp 根据输入日期段自动选择日期的操作代码

    这篇文章主要介绍了C# CefSharp 根据输入日期段自动选择日期的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • C#获取进程或线程相关信息的方法

    C#获取进程或线程相关信息的方法

    这篇文章主要介绍了C#获取进程或线程相关信息的方法,涉及C#操作进程及线程的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • C# Onnx实现DIS高精度图像二类分割

    C# Onnx实现DIS高精度图像二类分割

    这篇文章主要为大家详细介绍了C# Onnx实现DIS高精度图像二类分割的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • C#实现加密与解密详解

    C#实现加密与解密详解

    本文详细讲解了C#实现加密与解密详解的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C# 创建MDB数据库、并存放表格数据的案例

    C# 创建MDB数据库、并存放表格数据的案例

    这篇文章主要介绍了C# 创建MDB数据库、并存放表格数据的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01

最新评论