无法使用.net更新microsoft word文档字段
本文关键字:microsoft word 文档 字段 更新 net | 更新日期: 2023-09-27 18:18:19
目前我正在尝试构建一个工具,将打开Microsoft Word文档文件并更新文档中的所有字段。下面是主代码:
using Microsoft.Office.Interop.Word;
public class clsDocumentFieldUpdateTool
{
private static Microsoft.Office.Interop.Word.Application wordApp = null;
private static Microsoft.Office.Interop.Word.Document oDoc = null;
private static object missing = null;
private static object readOnly = false;
private static object visible = true;
public static void OpenDocument(string docFileNameWithPath)
{
wordApp = new Microsoft.Office.Interop.Word.Application();
missing = System.Reflection.Missing.Value;
object fileToOpen = docFileNameWithPath;
try
{
oDoc = wordApp.Documents.Open(ref fileToOpen, ref missing, ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref visible, ref visible, ref missing, ref missing, ref missing);
}
catch (Exception excOpenFile)
{
MessageBox.Show(excOpenFile.Message + System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + " - " + excOpenFile.StackTrace);
}
}
private static void Update(string file)
{
object nothing = System.Reflection.Missing.Value; // our 'void' value
object filename = file; // our word template
object notTrue = false; // our boolean false
try
{
//
// now we want to load the template and check how many fields there are to replace
//
wordApp.Visible = true;
oDoc = wordApp.Documents.Add( // load the template into a document workspace
ref filename, // and reference it through our myWordDoc
ref missing,
ref missing,
ref missing);
dynamic properties = oDoc.BuiltInDocumentProperties;
// count how many fields we have to update
int fields = oDoc.Fields.Count;
foreach (Field myField in oDoc.Fields)
{
myField.Select();
myField.Update();
}
oDoc.Save();
oDoc.Close(ref notTrue, ref missing, ref missing);
wordApp.Application.Quit( ref notTrue,
ref missing,
ref missing);
}
catch (Exception excException)
{
MessageBox.Show(excOpenFile.Message + System.Reflection.MethodInfo.GetCurrentMethod().DeclaringType.FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name + " - " + excException.StackTrace);
}
}
public static void UpdateDocumentFieldsInFile()
{
string strFile = @"L:'admin'11ZG-0401'11-SWDev'Testing Field Updates (from Document Properties).docx";
OpenDocument(strFile);
Update(strFile);
}
}
其中主函数调用UpdateDocumentFieldsInFile()。当我逐步执行代码时,它打开文件并更新它,但是在程序退出并且我手动重新打开文件之后,字段没有更新。有人对如何解决这个问题有什么建议吗?TIA。
看起来您没有使用通过OpenDocument
打开的文档。您的Update
方法正在创建一个新文档(通过Documents.Add
),该文档将您的文件视为模板。这将创建一个新文档并编辑它。因此,您实际上并没有在Update
方法中操作位于strFile
的文件。
在执行代码时,要更新的文档的名称是"Document1"吗?这将确认您不是在编辑文件"Testing Field Updates (from Document Properties).docx",而是使用该文件作为模板添加的新文档。
Edit:如果是我,我会把OpenDocument
变成一个函数并返回打开的文档。然后将该文档传递给Update
方法,由于它已经打开,因此您不需要再次打开或添加它。
再次感谢你的反馈,Dennis。在我确定我没有再次打开文档之后,由于某些我无法确定的原因,它仍然无法为我工作,所以我最终只是创建了一个使用Java Robot来完成我需要的程序:
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
public class Robot06{
static int keyInput[] =
{
KeyEvent.VK_F11,
KeyEvent.VK_F9
};
public static void main(String[] args) throws AWTException,IOException
{
Runtime.getRuntime().exec("winword L:''admin''11ZG-0401''11-SWDev'''"Testing Field Updates (from Document Properties).docx'"");
Robot robot = new Robot();
for (int cnt2 = 0; cnt2 < 10; cnt2++)
{
robot.keyPress(keyInput[0]);
robot.delay(500);
robot.keyPress(keyInput[1]);
robot.delay(500);
}
}
}