3

我想提取 word 文档中存在的项目符号信息。我想要这样的东西:假设下面的文本在 word 文档中:

启动汽车的步骤:

  • 开门
  • 坐在里面
  • 关门
  • 插入键
  • 等等

然后我想要我的文本文件,如下所示:

启动汽车的步骤:

<BULET> 开门</BULET>

<BULET> 坐在里面 </BULET>

<BULET>关上门</BULET>

<BULET> 插入键 </BULET>

<BULET> 等</BULET>

我正在使用 C# 语言来执行此操作。

我可以从word文档中提取段落并直接将它们写入文本文件,其中包含一些格式信息,例如文本是粗体还是斜体等,但不知道如何提取此项目符号信息。

谁能告诉我该怎么做?

提前致谢

4

3 回答 3

1

你可以通过阅读每个句子来做到这一点。doc.Sentences是 Range 对象的数组。因此,您可以从 Paragraph 中获取相同的 Range 对象。

        foreach (Paragraph para in oDoc.Paragraphs)
        {
            string paraNumber = para.Range.ListFormat.ListLevelNumber.ToString();
            string bulletStr = para.Range.ListFormat.ListString;
            MessageBox.Show(paraNumber + "\t" + bulletStr + "\t" + para.Range.Text);
        }

在 paraNumber 中,您可以获得段落级别,在 buttetStr 中,您可以将项目符号作为字符串。

于 2012-01-22T02:44:39.670 回答
1

我正在使用Eric White 的这个OpenXMLPower 工具。它是免费的,可在 NUGet 包中获得。您可以从 Visual Studio 包管理器安装它。 在此处输入图像描述

他提供了一个现成的代码片段。这个工具为我节省了很多时间。以下是我自定义代码片段以用于我的要求的方式。事实上,您可以在项目中使用这些方法。

 private static WordprocessingDocument _wordDocument;
 private StringBuilder textItemSB = new StringBuilder();
 private List<string> textItemList = new List<string>();


/// Open word document using office SDK and reads all contents from body of document
/// </summary>
/// <param name="filepath">path of file to be processed</param>
/// <returns>List of paragraphs with their text contents</returns>
private void GetDocumentBodyContents()
{
    string modifiedString = string.Empty;
    List<string> allList = new List<string>();
    List<string> allListText = new List<string>();

    try
    {
_wordDocument = WordprocessingDocument.Open(wordFileStream, false);
        //RevisionAccepter.AcceptRevisions(_wordDocument);
        XElement root = _wordDocument.MainDocumentPart.GetXDocument().Root;
        XElement body = root.LogicalChildrenContent().First();
        OutputBlockLevelContent(_wordDocument, body);
    }
    catch (Exception ex)
    {
        logger.Error("ERROR in GetDocumentBodyContents:" + ex.Message.ToString());
    }
}


// This is recursive method. At each iteration it tries to fetch listitem and Text item. Once you have these items in hand 
// You can manipulate and create your own collection.
private void OutputBlockLevelContent(WordprocessingDocument wordDoc, XElement blockLevelContentContainer)
{
    try
    {
        string listItem = string.Empty, itemText = string.Empty, numberText = string.Empty;
        foreach (XElement blockLevelContentElement in
            blockLevelContentContainer.LogicalChildrenContent())
        {
            if (blockLevelContentElement.Name == W.p)
            {
                listItem = ListItemRetriever.RetrieveListItem(wordDoc, blockLevelContentElement);
                itemText = blockLevelContentElement
                    .LogicalChildrenContent(W.r)
                    .LogicalChildrenContent(W.t)
                    .Select(t => (string)t)
                    .StringConcatenate();
                if (itemText.Trim().Length > 0)
                {
                    if (null == listItem)
                    {
                        // Add html break tag 
                        textItemSB.Append( itemText + "<br/>");
                    }
                    else
                    {
                        //if listItem == "" bullet character, replace it with equivalent html encoded character                                   
                        textItemSB.Append("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + (listItem == "" ? "&bull;" : listItem) + "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + itemText + "<br/>");
                    }
                }
                else if (null != listItem)
                {
                    //If bullet character is found, replace it with equivalent html encoded character  
                    textItemSB.Append(listItem == "" ? "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&bull;" : listItem);
                }
                else
                    textItemSB.Append("<blank>");
                continue;
            }
            // If element is not a paragraph, it must be a table.

            foreach (var row in blockLevelContentElement.LogicalChildrenContent())
            {                        
                foreach (var cell in row.LogicalChildrenContent())
                {                            
                    // Cells are a block-level content container, so can call this method recursively.
                    OutputBlockLevelContent(wordDoc, cell);
                }
            }
        }
        if (textItemSB.Length > 0)
        {
            textItemList.Add(textItemSB.ToString());
            textItemSB.Clear();
        }
    }
    catch (Exception ex)
    {
        .....
    }
}
于 2017-07-18T15:27:23.470 回答
-4

我得到了答案......

首先,我在段落的基础上转换文档。但是,如果我们逐句处理 doc 文件,则可以确定该句子是否包含项目符号或任何类型的形状,或者该句子是否是表格的一部分。所以一旦我们得到这些信息,我们就可以适当地转换那个句子。如果有人需要源代码,我可以分享。

于 2010-02-25T12:45:05.037 回答