невозможно обновить поля документа Microsoft Word с помощью .NET - PullRequest
1 голос
/ 17 декабря 2011

В настоящее время я пытаюсь создать инструмент, который откроет файл документа 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 (). Когда я выполняю код, он открывает файл и обновляет его, но после выхода из программы и повторного открытия файла вручную поля не были обновлены. У кого-нибудь есть предложения по решению этой проблемы? ТИА.

Ответы [ 2 ]

1 голос
/ 17 декабря 2011

Похоже, вы не используете документ, открытый через OpenDocument. Ваш метод Update создает новый документ (через Documents.Add), который обрабатывает ваш файл как шаблон. Это собирается создать новый документ и редактировать его. Таким образом, вы на самом деле не манипулируете файлом, который находится в strFile в вашем Update методе.

Когда вы просматриваете код, является ли название документа, который обновляется, «Document1»? Это было бы подтверждением того, что вы редактируете не файл «Обновление полей тестирования (из свойств документа) .docx»), а новый документ, добавленный с использованием этого файла в качестве шаблона.

Редактировать: Если бы это был я, я бы превратил OpenDocument в функцию и вернул открытый документ. Затем передайте этот документ в метод Update, и, поскольку он уже открыт, вам не нужно открывать или добавлять его снова.

0 голосов
/ 04 января 2012

Еще раз спасибо за отзыв, Деннис.После того, как я убедился, что я не открывал документ снова, он все равно не сработал для меня по какой-то причине, которую я не смог определить, поэтому в итоге я просто создал программу, которая использует 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);
    }      
  }
}
...