我正在编写一个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);
}
答案 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锁定;),因此,如果您在某个服务器上运行此代码,则会遇到麻烦。