【问题标题】:How to read values from a table in a word doc using C#如何使用 C# 从 word doc 中的表中读取值
【发布时间】:2017-08-09 05:04:07
【问题描述】:

我正在尝试连接到 Microsoft Word 文档 (.docx) 以从位于 .docx 中的表中读取值。我正在使用 Open-XML SDK 2.0 连接到 .docx 文件。到目前为止,在寻找示例和想法之后,我有了这个,

public static string TextFromWord(string file)
{
  const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

    StringBuilder textBuilder = new StringBuilder();
    using (WordprocessingDocument wDoc = WordprocessingDocument.Open(filename,false))
      {
          //Manage namespaces to perform Xpath queries
          NameTable nt = new NameTable();
          XmlNamespaceManager nsManger = new XmlNamespaceManger(nt);
          nsManager.AddNamespace("w", wordmlNamespace);

          //Get the document part from the package.
          //Load the XML in the document part into an XmlDocument instance.
          XmlDocument xdoc = new XmlDocument(nt);
          xdoc.Load(wdDoc.MainDocumentPart.GetStream());

          XmlNodeList paragraphNodes = xdoc.SelectNodes("//w:p", nsManager);
          foreach (XmlNode paragraphNode in paragraphNodes)
          {
            XmlNodeList textNodes = paragraphNode.SelectNodes(".//w:t", nsmanager);
            foreach (System.Xml.XmlNode textNode in textNodes)
            {
              textBuilder.Append(textNode.InnerText);
            }
            textBuilder.Append(Environment.NewLine);
          }

         }
      return textBuilder.ToString();
}

当 .docx 中只有文本时代码有效,但当文本在表格中时代码失败。有没有办法解决这个问题,以便它可以与 .docx 中的表格一起使用?

【问题讨论】:

    标签: c# openxml-sdk


    【解决方案1】:

    尝试以下简单重写您的方法。它将您的 System.XML 调用和命名空间项替换为 OpenXML elements (Document, Body, Paragraph, Table, Row, Cell, Descendants, etc) 。请install and use the OpenXML 2.5 SDK

        public static string TextFromWord(string filename)
        {
            StringBuilder textBuilder = new StringBuilder();
            using (WordprocessingDocument wDoc = WordprocessingDocument.Open(filename, false))
            {
                var parts = wDoc.MainDocumentPart.Document.Descendants().FirstOrDefault();
                if (parts != null)
                {
                    foreach (var node in parts.ChildElements)
                    {
                        if(node is Paragraph)
                        {
                            ProcessParagraph((Paragraph)node, textBuilder);
                            textBuilder.AppendLine("");
                        }
    
                        if (node is Table)
                        {
                            ProcessTable((Table)node, textBuilder);
                        }
                    }
                }
            }
            return textBuilder.ToString();
        }
    
        private static void ProcessTable(Table node, StringBuilder textBuilder)
        {
            foreach (var row in node.Descendants<TableRow>())
            {
                textBuilder.Append("| ");
                foreach (var cell in row.Descendants<TableCell>())
                {
                    foreach (var para in cell.Descendants<Paragraph>())
                    {
                        ProcessParagraph(para, textBuilder);
                    }
                    textBuilder.Append(" | ");
                }
                textBuilder.AppendLine("");
            }
        }
    
        private static void ProcessParagraph(Paragraph node, StringBuilder textBuilder)
        {
            foreach(var text in node.Descendants<Text>())
            {
                textBuilder.Append(text.InnerText);
            }
        }
    

    注意 - 此代码仅适用于包含段落和表格的简单 Word 文档。此代码尚未在复杂的 word 文档上进行测试。

    在控制台应用程序中使用上述代码处理了以下文档:

    这是文本输出:

    【讨论】:

    • 如何在 MS Word 中读取数字或无序列表,从中获取列表类型和编号?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多