2009-09-03 14 views
10

¿Alguien tiene buenos consejos o experiencia sobre cómo crear un motor usando C# (VB.NET también está bien) que es lo suficientemente genérico para manejar La mayoría de los casos de campos de texto de MS Word necesito completar los datos que obtengo de una base de datos. En resumen, estoy a punto de embarcarme en esta pequeña excursión de automatización de Office y espero que un poco de retroalimentación aquí me ayude a evitar errores que llevan mucho tiempo.MS Word Office Automation - Campos de formulario de texto de relleno y casillas de verificación y combinación de correspondencia

Saludos y gracias de antemano por cualquier consejo;

de Dave

Respuesta

15

yo enviado dos ejemplos para resolver su problema de automatización. El primero está usando MailMerge y el segundo está usando marcadores.

El archivo de la palabra tiene el siguiente aspecto:

Usando MailMerge (Insertar -> Elementos rápidos -> Campo -> combinación de correspondencia -> Campo de fusión) Nombre: «primerNombre» Apellido: «lastName»

=======

Uso de marcadores (Insertar -> marcador) nombre: (< - el favorito es aquí, no es visible) Apellido:

Y el código es el siguiente:

  1. Uso de los marcadores

    Open("D:/Doc1.doc"); 
        if (oDoc.Bookmarks.Exists("bkmFirstName")) 
        { 
         object oBookMark = "bkmFirstName"; 
         oDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = textBox1.Text; 
        } 
    
        if (oDoc.Bookmarks.Exists("bkmLastName")) 
        { 
         object oBookMark = "bkmLastName"; 
         oDoc.Bookmarks.get_Item(ref oBookMark).Range.Text = textBox2.Text; 
        } 
    
        SaveAs("D:/Test/Doc2.doc"); Quit(); 
        MessageBox.Show("The file is successfully saved!"); 
    
  2. Usando MailMerge

    Open("D:/Doc1.doc"); 
        foreach (Field myMergeField in oDoc.Fields) 
        { 
         //iTotalFields++; 
         Range rngFieldCode = myMergeField.Code; 
         String fieldText = rngFieldCode.Text; 
    
         // GET only MAILMERGE fields 
         if (fieldText.StartsWith(" MERGEFIELD")) 
         { 
          Int32 endMerge = fieldText.IndexOf("\\"); 
          Int32 fieldNameLength = fieldText.Length - endMerge; 
          String fieldName = fieldText.Substring(11, endMerge - 11); 
    
          fieldName = fieldName.Trim(); 
          if (fieldName == "firstName") 
          { 
           myMergeField.Select(); 
           oWordApplic.Selection.TypeText("This Text Replaces the Field in the Template"); 
          } 
         } 
        } 
        SaveAs("D:/Test/Doc2.doc"); Quit(); 
        MessageBox.Show("The file is successfully saved!"); 
    

También he utilizado algunos métodos de ayuda.

ApplicationClass oWordApplic = new Microsoft.Office.Interop.Word.ApplicationClass(); 
    private Microsoft.Office.Interop.Word.Document oDoc = new Document(); 

    public void Open(string strFileName) 
    { 
     object fileName = strFileName; 
     object readOnly = false; 
     object isVisible = true; 
     object missing = System.Reflection.Missing.Value; 

     oDoc = oWordApplic.Documents.Open(ref fileName, ref missing, ref readOnly, 
     ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref isVisible, ref missing, ref missing, ref missing, ref missing); 

     oDoc.Activate(); 
    } 

    public void SaveAs(string strFileName) 
    { 
     object missing = System.Reflection.Missing.Value; 
     object fileName = strFileName; 

     oDoc.SaveAs(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, 
     ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); 
    } 

    public void Quit() 
    { 
     object missing = System.Reflection.Missing.Value; 
     oWordApplic.Application.Quit(ref missing, ref missing, ref missing); 
    } 

Espero que esta implementación brinde algunas ideas para resolver su problema.

+0

Esto es genial! Me has salvado en grande y ahora tengo un buen comienzo en esto. Intento abstraer y formatear esto para que cualquier otro overflower pueda usarlo también. Saludos y gracias; Dave – Daver

Cuestiones relacionadas