无法使用.NET更新Microsoft Word文档字段

时间:2011-12-16 22:14:22

标签: c# interop ms-word field

目前,我正在尝试构建一个工具,该工具将打开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。

2 个答案:

答案 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);
    }      
  }
}