使用c#以样式/格式读取单词中的文本

时间:2014-10-27 21:14:44

标签: c# office-interop

我正在编写一个c#代码,用于使用Application和Document对象打开一个word文件,并希望阅读带有样式的文档,格式示例如下: - 我能够获得文本,但无法获得其样式和格式。

private void readFileContent(string path)
{
    Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
    object file = path;
    object nullobj = System.Reflection.Missing.Value;

    Microsoft.Office.Interop.Word.Document doc = wordApp.Documents.Open(
        ref file, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj,
        ref nullobj, ref nullobj, ref nullobj);


    doc.ActiveWindow.Selection.WholeStory();
    doc.ActiveWindow.Selection.Copy();

    IDataObject data = Clipboard.GetDataObject();

    string getdata = data.GetData(DataFormats.Text).ToString();

    doc.Close(ref nullobj, ref nullobj, ref nullobj);
    wordApp.Quit(ref nullobj, ref nullobj, ref nullobj);

}

enter image description here

2 个答案:

答案 0 :(得分:2)

在我看来,这项努力远远超出了Interop的力量。我建议使用Open Xml Sdk来完成这项任务,因为它功能更强大,并且不承担所有Interop限制。解决方案很简单。

  using DocumentFormat.OpenXml.Wordprocessing;
  using DocumentFormat.OpenXml.Packaging;
  // read-only open 
  using (var document = WordprocessingDocument.Open(@"Your.docx", false))
  {
   // Gets the MainDocumentPart of the WordprocessingDocument 
   var main = document.MainDocumentPart;
    // document fonts
    var fonts = main.FontTablePart;
    // document styles
    var styles = main.StyleDefinitionsPart;
    var effects = main.StylesWithEffectsPart;
    // root element part of the doc
    var doc = main.Document;
    // actual document body
    var body = doc.Body;
    // styles on paragraps
    foreach (Paragraph para in body.Descendants<Paragraph>()
      .Where(e => e.ParagraphProperties != null&& e.ParagraphProperties.ParagraphStyleId != null))
      Console.WriteLine("Text:{0}->Style name:{1}", para.InnerText, para.ParagraphProperties.ParagraphStyleId.Val);
    // styles on Runs
    foreach (Run run in body.Descendants<Run>()
      .Where(r => r.RunProperties != null && r.RunProperties.RunStyle != null))
      Console.WriteLine("Text: {0}->Run style: {1}", run.InnerText, run.RunProperties.RunStyle.Val );
  }

答案 1 :(得分:0)

您只收到文字:

string getdata = data.GetData(DataFormats.Text).ToString();`. 

获取所有Word格式将涉及更多工作。我建议尝试将结果作为Html或Rtf,这将保留最常见的格式:

string getdata = data.GetData(DataFormats.Rtf).ToString();

另外,请注意除非在应用程序运行时实际存在用户,否则不建议以这种方式使用Interop。 Word可能会弹出一个对话框(例如,&#34;此文件被用户X&#34锁定;),因此,如果您在某个服务器上运行此代码,则会遇到麻烦。