使用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
相关产品推荐
相关产品推荐

