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

使用OpenXML读取Word表格时计数为0的问题求助

问题:读取Word文件表格时列表计数始终为0

我尝试将Word文件中的所有表格读取至列表中,但无论文件内实际存在多少表格,列表计数始终为0。以下是我的代码片段:

public void FindAndReplace(string DocPath) { 
    using (WordprocessingDocument doc = WordprocessingDocument.Open(DocPath, true)) { 
        using (StreamReader reader = new StreamReader(doc.MainDocumentPart.GetStream())) { 
            //Text titlePlaceholder = doc.MainDocumentPart.Document.Body.Descendants<Text>().Where((x) => x.Text == "Complianc...
        }
    }
}

嘿,问题出在你用了完全错误的方式获取表格!StreamReader是用来读取原始XML流的,这根本不是OpenXML SDK设计的使用方式,而且你代码里获取表格的逻辑看起来还没写完,但核心问题是找错了路径。

正确的做法是直接通过OpenXML的元素遍历获取表格:

你不需要StreamReader,直接通过文档的Body节点去查找所有Table元素就行,给你修正后的代码示例:

public void ReadWordTables(string DocPath)
{
    // 如果只是读取表格,这里设为false(只读模式)更安全,修改才用true
    using (WordprocessingDocument doc = WordprocessingDocument.Open(DocPath, false))
    {
        // 先做空值检查,避免空引用崩溃
        if (doc.MainDocumentPart?.Document?.Body == null)
        {
            Console.WriteLine("文档主体内容为空,无法读取表格");
            return;
        }

        // 这一步才是正确获取所有表格的方式
        var tables = doc.MainDocumentPart.Document.Body.Descendants<Table>().ToList();
        
        Console.WriteLine($"成功找到 {tables.Count} 个表格");

        // 额外给你加个遍历表格读取内容的示例,方便你参考
        foreach (var table in tables)
        {
            foreach (var row in table.Descendants<TableRow>())
            {
                foreach (var cell in row.Descendants<TableCell>())
                {
                    // 拼接单元格内的所有文本节点(因为OpenXML可能把一段文本拆成多个Text元素)
                    string cellContent = string.Join("", cell.Descendants<Text>().Select(t => t.Text));
                    Console.Write(cellContent + "\t");
                }
                Console.WriteLine();
            }
            Console.WriteLine("--- 表格分隔线 ---");
        }
    }
}

几个要注意的点:

  • 务必检查MainDocumentPart、Document、Body是否为null,Word文档可能存在结构不完整的情况,直接访问会抛出空引用异常
  • 如果你原本的需求是做文本替换(比如代码里的FindAndReplace),那也不需要StreamReader,直接通过Descendants<Text>()查找目标文本元素修改即可,和获取表格的逻辑是统一的
  • 确认你已经安装了正确的NuGet包:DocumentFormat.OpenXml,建议用最新的稳定版本,避免版本兼容问题

内容的提问来源于stack exchange,提问作者emsimpson92

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:12:00