C#从Word文档中提取表格数据的常见方法详解

 更新时间:2026年09月18日 11:49:20   作者:咕白m625  
在日常开发中,从 Word 文档中提取表格数据是一个高频需求,本文主要介绍了如何使用 Free Spire.Doc for .NET 在 C# 中读取 Word 表格数据,感兴趣的小伙伴可以了解下

在日常开发中,从 Word 文档中提取表格数据是一个高频需求——无论是数据导入、报表迁移,还是将合同中的结构化信息入库。手动复制粘贴效率低下,调用 Office COM 组件又面临环境依赖和版本兼容问题。本文介绍一种轻量方案:使用 Free Spire.Doc for .NET 在 C# 中读取 Word 表格数据。

说明:Free Spire.Doc 是 Spire.Doc 的免费社区版,无需安装 Microsoft Word,支持 .doc 和 .docx 格式的读写。安装方式:Install-Package FreeSpire.Doc

核心对象模型

Free Spire.Doc 解析 Word 表格时,文档的层级结构如下:

对象对应结构获取方式
Document整个 Word 文档new Document() + LoadFromFile()
Section文档中的“节”doc.Sections[i]
Table表格section.Tables[i]
TableRow表格行table.Rows[i]
TableCell单元格row.Cells[i]
Paragraph单元格内的段落cell.Paragraphs[i]

核心遍历路径是:Document → Section → Table → Row → Cell → Paragraph。一个文档可以包含多个节,每个节可以包含多个表格。

基础读取代码

以下代码读取 Word 文档中所有表格的数据,输出到控制台:

using Spire.Doc;
using System;

namespace ReadWordTable
{
    class Program
    {
        static void Main(string[] args)
        {
            Document doc = new Document();
            doc.LoadFromFile(@"E:\sample.docx");

            foreach (Section section in doc.Sections)
            {
                foreach (Table table in section.Tables)
                {
                    Console.WriteLine("=== 表格开始 ===");
                    foreach (TableRow row in table.Rows)
                    {
                        foreach (TableCell cell in row.Cells)
                        {
                            string cellText = cell.Paragraphs[0].Text.Trim();
                            Console.Write(cellText + "\t");
                        }
                        Console.WriteLine();
                    }
                }
            }

            doc.Close();
        }
    }
}

这段代码的逻辑是:加载文档后,依次遍历每个节的每个表格,再逐行逐单元格提取文本,用制表符分隔单元格、换行符分隔行。

几个容易被忽略的细节

单元格包含多个段落时只取第一段会丢数据。 Word 表格的一个单元格内可能有多个段落(例如多行说明文字)。上面的基础代码只读取了 Paragraphs[0],如果单元格内容较多,会遗漏后续段落。更稳妥的做法是遍历所有段落:

string cellText = "";
for (int i = 0; i < cell.Paragraphs.Count; i++)
{
    cellText += cell.Paragraphs[i].Text.Trim() + " ";
}
cellText = cellText.Trim();

合并单元格在遍历时会出现重复内容。 当表格中存在水平或垂直合并的单元格时,TableRow.Cells 的索引可能对应到同一个逻辑单元格对象。遍历时如果直接按索引读取,合并区域的数据会被重复提取。实践中需要根据业务需求判断是否对合并单元格做去重处理,或者使用库提供的合并信息判断方法。

嵌套表格需要递归处理。 如果单元格内嵌入了另一个表格,上面的遍历不会进入嵌套表格。此时需要检查 cell.ChildObjects,找出其中类型为 Table 的对象并递归遍历。

提取到文本文件的完整写法

将每个表格保存为独立的文本文件,单元格用制表符分隔,行用换行符分隔,可以直接粘贴到 Excel 中:

using Spire.Doc;
using Spire.Doc.Collections;
using System.IO;
using System.Text;

namespace ExtractWordTable
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Document doc = new Document();
            doc.LoadFromFile("表格.docx");

            for (int sectionIndex = 0; sectionIndex < doc.Sections.Count; sectionIndex++)
            {
                Section section = doc.Sections[sectionIndex];
                TableCollection tables = section.Tables;

                for (int tableIndex = 0; tableIndex < tables.Count; tableIndex++)
                {
                    ITable table = tables[tableIndex];
                    string tableData = "";

                    for (int rowIndex = 0; rowIndex < table.Rows.Count; rowIndex++)
                    {
                        TableRow row = table.Rows[rowIndex];

                        for (int cellIndex = 0; cellIndex < row.Cells.Count; cellIndex++)
                        {
                            TableCell cell = row.Cells[cellIndex];
                            string cellText = "";

                            for (int paraIndex = 0; paraIndex < cell.Paragraphs.Count; paraIndex++)
                            {
                                cellText += cell.Paragraphs[paraIndex].Text.Trim() + " ";
                            }

                            tableData += cellText.Trim();
                            if (cellIndex < row.Cells.Count - 1)
                                tableData += "\t";
                        }
                        tableData += "\n";
                    }

                    string filePath = Path.Combine(
                        "Tables",
                        $"Section{sectionIndex + 1}_Table{tableIndex + 1}.txt");
                    Directory.CreateDirectory("Tables");
                    File.WriteAllText(filePath, tableData, Encoding.UTF8);
                }
            }
            doc.Close();
        }
    }
}

这份代码将每个表格保存为 Tables/Section1_Table1.txt 等文件,单元格间用 \t 分隔,行末用 \n 结束,输出格式兼容 Excel 的直接粘贴。

免费版限制提醒

Free Spire.Doc 免费版在读取文档时存在硬性限制:单个文档最多处理 500 个段落和 25 个表格。该限制在读取文件时即被强制执行,超出部分的表格数据不会被加载。

对于大多数中小型场景——比如从合同模板、配置表、简单的数据报表中提取表格——25 个表格的上限通常够用。建议在正式集成前先确认目标文档的实际表格数量。

到此这篇关于C#从Word文档中提取表格数据的常见方法详解的文章就介绍到这了,更多相关C#提取Word表格数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#实现简单聊天程序的方法

    C#实现简单聊天程序的方法

    这篇文章主要介绍了C#实现简单聊天程序的方法,实例分析了C#聊天程序的原理与客户端、服务器端的实现技巧,需要的朋友可以参考下
    2015-06-06
  • Unity游戏开发中的设计模式之策略模式

    Unity游戏开发中的设计模式之策略模式

    策略模式是Unity游戏开发中常用的设计模式之一,用于封装一系列算法或行为,并使这些算法或行为可以相互替换。通过策略模式,可以在运行时动态地选择算法或行为,实现游戏中的多样性和可扩展性。常见的应用包括AI行为、武器攻击、移动方式等
    2023-05-05
  • C#对称加密与非对称加密实例

    C#对称加密与非对称加密实例

    这篇文章主要介绍了C#对称加密与非对称加密实例,详细分析了对称加密与非对称加密的原理与具体实现方法,具有一定的实用价值,需要的朋友可以参考下
    2014-10-10
  • 三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • WPF Trigger改变属性无效问题排查示例详解

    WPF Trigger改变属性无效问题排查示例详解

    这篇文章主要为大家介绍了WPF Trigger改变属性无效问题排查示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C#实现左截取和右截取字符串实例

    C#实现左截取和右截取字符串实例

    这篇文章主要介绍了C#实现左截取和右截取字符串实例,是针对字符串的常用操作,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C#静态变量与实例变量实例分析

    C#静态变量与实例变量实例分析

    这篇文章主要介绍了C#静态变量与实例变量,是深入掌握PHP程序设计所必须掌握的重要概念,需要的朋友可以参考下
    2014-09-09
  • C#多接口实现、重名成员、显式实现、接口继承+抽象类和接口区别说明

    C#多接口实现、重名成员、显式实现、接口继承+抽象类和接口区别说明

    这段SEO描述融合了“接口显式实现”、“接口冲突”、“接口继承”三个核心关键词,详细概括了文章关于Java接口相关知识点的讲解,包括显式实现规则、冲突接口处理方法、接口继承规则等内容,适合准备相关考试或项目开发的读者
    2026-06-06
  • 再议C#中的装箱与拆箱的问题详解

    再议C#中的装箱与拆箱的问题详解

    本篇文章再次介绍了C#中的装箱与拆箱,这次们看下使用泛型和不使用泛型引发装箱拆箱的情况
    2013-05-05
  • C#实现关机重启及注销实例代码

    C#实现关机重启及注销实例代码

    这篇文章主要介绍了C#实现关机重启及注销实例代码,适合新手参考学习之用,需要的朋友可以参考下
    2014-07-07

最新评论