使用 C# 提取 Word 文档中的表格数据

工具与环境准备

要实现 Word 表格提取,我们需要以下工具和组件:

  • 开发环境:Visual Studio(2022/2019 等)或任意 C# 开发工具
  • 第三方库:Free Spire.Doc(用于解析 Word 文档结构,处理表格数据)

Free Spire.Doc 是一个免费的 Word 文档处理库,支持读取、编辑、生成 Word 文档,尤其对表格、段落等元素的处理非常便捷。可以通过 NuGet 包管理器 安装它:

复制代码
Install-Package FreeSpire.Doc

或者在项目中右键"管理 NuGet 包",搜索 Spire.Doc 并安装。

⚠️ 注意:免费版单文档最多支持 25 个表格,适用于学习、测试和小型业务场景


提取 Word 表格实现思路

从 Word 中提取表格的核心思路是 逐层解析文档结构

  1. 加载 Word 文档,获取文档对象
  2. 遍历文档中的"节(Section)"(Word 文档的基本结构单位)
  3. 在每个节中获取表格集合,遍历所有表格
  4. 对每个表格,逐行、逐单元格提取文本内容
  5. 将提取的表格数据按格式(制表符分隔)保存到文本文件

完整代码

复制代码
using Spire.Doc;
using Spire.Doc.Collections;
using Spire.Doc.Interface;
using System.IO;
using System.Text;

namespace ExtractWordTable
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 创建文档对象
            Document doc = new Document();
            // 加载Word文档
            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");
                    File.WriteAllText(filePath, tableData, Encoding.UTF8);
                }
            }

            doc.Close();
        }
    }
}

代码核心逻辑解析

① 遍历文档结构

Word 文档的逻辑结构是:Document → Section → Table → Row → Cell

  • 节(Section) :一个文档可以有多个节(如不同页码格式、页眉页脚的区域)。通过 doc.Sections 获取。
  • 表格(Table) :每个节可以包含多个表格,通过 section.Tables 获取。

② 提取单元格文本

单元格 TableCell 内部可能包含多个段落(Paragraph),每个段落可能有不同的格式(加粗、颜色等)。我们只需提取纯文本内容:

  • 遍历 cell.Paragraphs,获取每个段落的 Text
  • 使用 Trim() 去除段落首尾空白,避免多余换行。
  • 多个段落之间用空格连接,保证可读性。

③ 保存为文本文件

  • 每个表格单独保存为一个 .txt 文件,文件名包含节索引和表格索引,便于区分。
  • 单元格之间用 制表符 \t 分隔,行末添加换行符。这种格式可直接复制到 Excel 中粘贴,或者被其他数据分析工具读取。

实用扩展方向

基于本文代码,可以轻松扩展以下功能:

1. 导出为 Excel 文件(使用 Free Spire.XLS)

复制代码
using Spire.Xls;
// 将 tableData 的二维数组写入 Workbook

2. 批量处理多个 Word 文档

复制代码
string[] files = Directory.GetFiles(@"C:\Docs", "*.docx");
foreach (string file in files)
{
    doc.LoadFromFile(file);
    // ... 提取逻辑
}

3. 文本清洗与格式化

  • 去除特殊符号(如 \r, \n 替换为空格)
  • 统一数字格式(如货币符号、百分比)
  • 使用正则表达式过滤无关字符

4. 直接导入数据库

相关推荐
傻啦嘿哟6 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670796 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh7 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界8 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
繁星蓝雨9 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进
Evand J9 小时前
【MATLAB例程,图像降噪滤波9】自适应维纳滑动窗口滤波(Wiener)图像降噪、方法对比,有中文注释
开发语言·图像处理·计算机视觉·matlab·滑动窗口·滤波·降噪
杜大哥9 小时前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk5559 小时前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python