目前,我正在尝试构建一个工具,该工具将打开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。
答案 0 :(得分:1)
您好像没有使用通过OpenDocument
打开的文档。您的Update
方法正在创建一个新文档(通过Documents.Add
),将您的文件视为模板。这将创建一个新文档并进行编辑。因此,您实际上并未在strFile
方法中操作位于Update
的文件。
当您单步执行代码时,正在更新的文档的名称是“Document1”吗?这将证实您没有编辑“测试字段更新(来自文档属性).docx”文件,而是使用该文件作为模板添加的新文档。
编辑:如果是我,我会将OpenDocument
转换为函数并返回打开的文档。然后将该文档传递到Update
方法,因为它已经打开,所以不需要再打开或添加它。
答案 1 :(得分:0)
再次感谢您的反馈,丹尼斯。在我确定我没有再次打开文档之后,由于某些我无法确定的原因,它仍然不能用于我,所以我最终只是创建了一个使用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);
}
}
}