使用C#,我需要从word文档中提取数据。我在项目中安装了NetOffice for word。数据分为两部分。
首先,我需要从文档设置中提取数据。
其次,我需要提取文档中控件的内容。字段的内容包括复选框,日期和几个段落。输入法是通过控件进行的,因此必须有一些方法通过api与控件进行交互,但我不知道如何做到这一点。
现在,我已经获得了以下代码来从文档中提取平面文字:
private static string wordDocument2String(string file)
{
NetOffice.WordApi.Application wordApplication = new NetOffice.WordApi.Application();
NetOffice.WordApi.Document newDocument = wordApplication.Documents.Open(file);
string txt = newDocument.Content.Text;
wordApplication.Quit();
wordApplication.Dispose();
return txt;
}
所以问题是:我如何从文档中提取控件中的数据,以及如何使用NetOffice或者从NetOffice中提取文档设置(例如从word中看到的标题,作者等),或者其他一些包裹?
答案 0 :(得分:2)
我没有打算实施NetOffice,但命令应该大致相同(可能除了实现和处理方法之外)。
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
string file = "C:\\Hello World.docx";
Microsoft.Office.Interop.Word.Document doc = word.Documents.Open(file);
// look for a specific type of Field (there are about 200 to choose from).
foreach (Field f in doc.Fields)
{
if (f.Type == WdFieldType.wdFieldDate)
{
//do something
}
}
// example of the myriad properties that could be associated with "document settings"
WdProtectionType protType = doc.ProtectionType;
if (protType.Equals(WdProtectionType.wdAllowOnlyComments))
{
//do something else
}
您可以在MSDN reference on Word Interop找到有关您需要在Word文档中访问的任何内容的信息。
更新: 阅读完评论后,您可以访问以下几种文档设置:
string author = doc.BuiltInDocumentProperties("Author").Value;
string name = doc.Name; // this gives you the file name.
// not clear what you mean by "title"
至于试图理解你从“遗留控件”获得的文本,我需要更多信息来确切地知道你正在从中提取什么样的控件。尝试从文档中获取控件/文本框/表单/ etc的名称,然后在Google上查找该属性。
作为黑暗中的一个刺,这是一个从文档中的文本框中获取文本的(不完整)示例:
List<string> textBoxText = new List<string>();
foreach (Microsoft.Office.Interop.Word.Shape s in doc.Shapes)
{
textBoxText.Add(s.TextFrame.TextRange.Text); //this could result in an error if there are shapes that don't contain text.
}
另一种可能性是内容控制,其中有几种类型。它们通常用于收集用户输入。
以下是一些用于捕获富文本内容控件的代码:
List<string> contentControlText = new List<string>();
foreach(ContentControl CC in doc.ContentControls)
{
if (CC.Type == WdContentControlType.wdContentControlRichText)
{
contentControlText.Add(CC.Range.Text);
}
}