C# 如何使用C从word文档中的表中读取值#

C# 如何使用C从word文档中的表中读取值#,c#,openxml-sdk,C#,Openxml Sdk,我正在尝试连接到Microsoft word文档(.docx)以从位于.docx中的表中读取值。我正在使用OpenXMLSDK2.0连接到.docx文件。到目前为止,在寻找了一些例子和想法之后,我有了这个 public static string TextFromWord(string file) { const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

我正在尝试连接到Microsoft word文档(.docx)以从位于.docx中的表中读取值。我正在使用OpenXMLSDK2.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中的表?

尝试以下简单的方法重写。它将您的System.XML调用和命名空间项替换为。求你了

公共静态字符串TextFromWord(字符串文件名)
{
StringBuilder textBuilder=新建StringBuilder();
使用(WordprocessingDocument wDoc=WordprocessingDocument.Open(文件名,false))
{
var parts=wDoc.MainDocumentPart.Document.subjects().FirstOrDefault();
如果(部件!=null)
{
foreach(parts.ChildElements中的var节点)
{
if(节点为段落)
{
Process段落((段落)节点,textBuilder);
textBuilder.AppendLine(“”);
}
if(节点是表)
{
ProcessTable((表)节点,textBuilder);
}
}
}
}
返回textBuilder.ToString();
}
私有静态void ProcessTable(表节点,StringBuilder textBuilder)
{
foreach(node.subjects()中的变量行)
{
textBuilder.Append(“|”);
foreach(行中的var单元格。子体())
{
foreach(单元格中的变量para.subjects())
{
处理段落(段落,文本生成器);
}
textBuilder.Append(“|”);
}
textBuilder.AppendLine(“”);
}
}
私有静态void processparation(段落节点,StringBuilder textBuilder)
{
foreach(node.subjects()中的变量文本)
{
textBuilder.Append(text.InnerText);
}
}
注意-此代码仅适用于由段落和表格组成的简单Word文档。这段代码还没有在复杂的word文档上测试过

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

以下是文本输出:


如何在MS Word中读取数字或未排序的列表,从中获取列表类型和编号?
    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);
        }
    }