Cómo automatizar Microsoft Word para que realice una combinación de correspondencia desde Visual C#

Para obtener una versión para Microsoft Visual Basic .NET de este artículo, consulte
301656 .
Para obtener una versión de este artículo para Microsoft Visual Basic 6.0 y Microsoft Visual Basic 5.0, consulte
220607 .

Resumen

En este artículo se demuestra cómo automatizar Microsoft Word para crear un documento con combinación de correspondencia utilizando Microsoft Visual C# 2005 o Microsoft Visual C# .NET.

Más información

La automatización es un proceso que permite a las aplicaciones escritas en lenguajes como Visual C# 2005 o Visual C# .NET controlar a otras aplicaciones mediante programación. La automatización de Word permite realizar acciones como crear documentos nuevos y agregar texto y dar formato a los documentos. Con Word y otras aplicaciones de Microsoft Office, utilizando la automatización se pueden realizar también mediante programación prácticamente todas las acciones que puede llevar a cabo manualmente desde la interfaz de usuario.

Word expone esta función de programación por medio de un modelo de objetos. El modelo de objetos es una colección de clases y métodos que actúan como homólogos de los componentes lógicos de Word. Por ejemplo, hay un objeto Application, un objeto Document y un objeto Paragraph, y cada uno de ellos contiene la funcionalidad de esos componentes en Word. Para tener acceso al modelo de objetos de Visual C# 2005 o Visual C# .NET, puede establecer una referencia al proyecto en la biblioteca de tipos.

Este artículo demuestra cómo establecer la referencia del proyecto apropiada en la biblioteca de tipos de Word para Visual C# .NET y proporciona código de ejemplo para automatizar Word.

Generar el ejemplo de automatización

  1. Inicie Microsoft Visual Studio 2005 o Visual Studio .NET.
  2. En el menú Archivo, haga clic en Nuevo y, después, en Proyecto. Seleccione Aplicación para Windows en los tipos de proyectos de Visual C#. De forma predeterminada, se crea Form1.
  3. Agregar una referencia a la Microsoft Word 11.0 Object Library de Visual Studio 2005 o a la Microsoft Word Object Library de Visual Studio .NET. Para ello, siga estos pasos:
    1. En el menú Proyecto, haga clic en Agregar referencia.
    2. En la ficha COM, busque Microsoft Word Object Library y, a continuación, haga clic en Seleccionar.

      En Visual Studio 2005, busque Microsoft Word 11.0 Object Library en la ficha COM.

      Nota
      Microsoft Office 2003 incluye ensamblados de interoperabilidad primarios (PIA, Primary Interop Assemblies). Microsoft Office XP no incluye PIA, pero se pueden descargar.
      Para obtener más información acerca de los PIA de Office XP, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
      328912 INFO: Los ensamblados de interoperabilidad principales (PIA) de Microsoft Office XP están disponibles para descarga

    3. En el cuadro de diálogo Agregar referencia haga clic en Aceptar para aceptar sus selecciones.
  4. En el menú Ver, seleccione Cuadro de herramientas para mostrar el cuadro de herramientas y agregue un botón a Form1.
  5. Haga doble clic en Button1. Aparecerá la ventana de código del formulario.
  6. En la ventana de código, sustituya el código siguiente
     private void button1_Click(object sender, System.EventArgs e) { } 
    por:
     Word.Application wrdApp; Word._Document wrdDoc; Object oMissing = System.Reflection.Missing.Value; Object oFalse = false;

    private void InsertLines(int LineNum) { int iCount;

    // Insert "LineNum" blank lines. for(iCount = 1; iCount<=LineNum; iCount++) { wrdApp.Selection.TypeParagraph(); } }

    private void FillRow(Word._Document oDoc, int Row, string Text1, string Text2, string Text3, string Text4) { // Insert the data into the specific cell. oDoc.Tables[1].Cell(Row,1).Range.InsertAfter(Text1); oDoc.Tables[1].Cell(Row,2).Range.InsertAfter(Text2); oDoc.Tables[1].Cell(Row,3).Range.InsertAfter(Text3); oDoc.Tables[1].Cell(Row,4).Range.InsertAfter(Text4); }

    private void CreateMailMergeDataFile() { Word._Document oDataDoc; int iCount;

    Object oName = "C:\\DataDoc.doc"; Object oHeader = "FirstName, LastName, Address, CityStateZip"; wrdDoc.MailMerge.CreateDataSource(ref oName,ref oMissing, ref oMissing,ref oHeader, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing);

    // Open the file to insert data. oDataDoc = wrdApp.Documents.Open(ref oName,ref oMissing, ref oMissing, ref oMissing,ref oMissing,ref oMissing, ref oMissing,ref oMissing,ref oMissing,ref oMissing, ref oMissing,ref oMissing,ref oMissing,ref oMissing, ref oMissing/*, ref oMissing */);

    for (iCount=1; iCount<=2; iCount++) { oDataDoc.Tables[1].Rows.Add(ref oMissing); } // Fill in the data. FillRow(oDataDoc, 2, "Steve", "DeBroux", "4567 Main Street", "Buffalo, NY 98052"); FillRow(oDataDoc, 3, "Jan", "Miksovsky", "1234 5th Street", "Charlotte, NC 98765"); FillRow(oDataDoc, 4, "Brian", "Valentine", "12348 78th Street Apt. 214", "Lubbock, TX 25874"); // Save and close the file. oDataDoc.Save(); oDataDoc.Close(ref oFalse, ref oMissing, ref oMissing); }

    private void button1_Click(object sender, System.EventArgs e) { Word.Selection wrdSelection; Word.MailMerge wrdMailMerge; Word.MailMergeFields wrdMergeFields; Word.Table wrdTable; string StrToAdd;

    // Create an instance of Word and make it visible. wrdApp = new Word.Application(); wrdApp.Visible = true;

    // Add a new document. wrdDoc = wrdApp.Documents.Add(ref oMissing,ref oMissing, ref oMissing,ref oMissing); wrdDoc.Select();

    wrdSelection = wrdApp.Selection; wrdMailMerge = wrdDoc.MailMerge;

    // Create a MailMerge Data file. CreateMailMergeDataFile();

    // Create a string and insert it into the document. StrToAdd = "State University\r\nElectrical Engineering Department"; wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter; wrdSelection.TypeText(StrToAdd);

    InsertLines(4);

    // Insert merge data. wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft; wrdMergeFields = wrdMailMerge.Fields; wrdMergeFields.Add(wrdSelection.Range, "FirstName"); wrdSelection.TypeText(" "); wrdMergeFields.Add(wrdSelection.Range, "LastName"); wrdSelection.TypeParagraph();

    wrdMergeFields.Add(wrdSelection.Range, "Address"); wrdSelection.TypeParagraph(); wrdMergeFields.Add(wrdSelection.Range, "CityStateZip");

    InsertLines(2);

    // Right justify the line and insert a date field // with the current date. wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphRight;

    Object objDate = "dddd, MMMM dd, yyyy"; wrdSelection.InsertDateTime(ref objDate,ref oFalse,ref oMissing, ref oMissing, ref oMissing);

    InsertLines(2);

    // Justify the rest of the document. wrdSelection.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphJustify;

    wrdSelection.TypeText("Dear "); wrdMergeFields.Add(wrdSelection.Range, "FirstName"); wrdSelection.TypeText(","); InsertLines(2);

    // Create a string and insert it into the document. StrToAdd = "Thank you for your recent request for next " + "semester's class schedule for the Electrical " + "Engineering Department. Enclosed with this " + "letter is a booklet containing all the classes " + "offered next semester at State University. " + "Several new classes will be offered in the " + "Electrical Engineering Department next semester. " + "These classes are listed below."; wrdSelection.TypeText(StrToAdd);

    InsertLines(2);

    // Insert a new table with 9 rows and 4 columns. wrdTable = wrdDoc.Tables.Add(wrdSelection.Range,9,4, ref oMissing, ref oMissing); // Set the column widths. wrdTable.Columns[1].SetWidth(51, Word.WdRulerStyle.wdAdjustNone); wrdTable.Columns[2].SetWidth(170, Word.WdRulerStyle.wdAdjustNone); wrdTable.Columns[3].SetWidth(100, Word.WdRulerStyle.wdAdjustNone); wrdTable.Columns[4].SetWidth(111, Word.WdRulerStyle.wdAdjustNone); // Set the shading on the first row to light gray. wrdTable.Rows[1].Cells.Shading.BackgroundPatternColorIndex = Word.WdColorIndex.wdGray25; // Bold the first row. wrdTable.Rows[1].Range.Bold = 1; // Center the text in Cell (1,1). wrdTable.Cell(1, 1).Range.Paragraphs.Alignment = Word.WdParagraphAlignment.wdAlignParagraphCenter;

    // Fill each row of the table with data. FillRow(wrdDoc, 1, "Class Number", "Class Name", "Class Time", "Instructor"); FillRow(wrdDoc, 2, "EE220", "Introduction to Electronics II", "1:00-2:00 M,W,F", "Dr. Jensen"); FillRow(wrdDoc, 3, "EE230", "Electromagnetic Field Theory I", "10:00-11:30 T,T", "Dr. Crump"); FillRow( wrdDoc, 4, "EE300", "Feedback Control Systems", "9:00-10:00 M,W,F", "Dr. Murdy"); FillRow(wrdDoc, 5, "EE325", "Advanced Digital Design", "9:00-10:30 T,T", "Dr. Alley"); FillRow(wrdDoc, 6, "EE350", "Advanced Communication Systems", "9:00-10:30 T,T", "Dr. Taylor"); FillRow(wrdDoc, 7, "EE400", "Advanced Microwave Theory", "1:00-2:30 T,T", "Dr. Lee"); FillRow(wrdDoc, 8, "EE450", "Plasma Theory", "1:00-2:00 M,W,F", "Dr. Davis"); FillRow(wrdDoc, 9, "EE500", "Principles of VLSI Design", "3:00-4:00 M,W,F", "Dr. Ellison");

    // Go to the end of the document. Object oConst1 = Word.WdGoToItem.wdGoToLine; Object oConst2 = Word.WdGoToDirection.wdGoToLast; wrdApp.Selection.GoTo(ref oConst1,ref oConst2,ref oMissing,ref oMissing); InsertLines(2);

    // Create a string and insert it into the document. StrToAdd = "For additional information regarding the " + "Department of Electrical Engineering, " + "you can visit our Web site at "; wrdSelection.TypeText(StrToAdd); // Insert a hyperlink to the Web page. Object oAddress = "http://www.ee.stateu.tld"; Object oRange = wrdSelection.Range; wrdSelection.Hyperlinks.Add(oRange, ref oAddress,ref oMissing, ref oMissing, ref oMissing, ref oMissing); // Create a string and insert it into the document StrToAdd = ". Thank you for your interest in the classes " + "offered in the Department of Electrical " + "Engineering. If you have any other questions, " + "please feel free to give us a call at " + "555-1212.\r\n\r\n" + "Sincerely,\r\n\r\n" + "Kathryn M. Hinsch\r\n" + "Department of Electrical Engineering \r\n"; wrdSelection.TypeText(StrToAdd);

    // Perform mail merge. wrdMailMerge.Destination = Word.WdMailMergeDestination.wdSendToNewDocument; wrdMailMerge.Execute(ref oFalse);

    // Close the original form document. wrdDoc.Saved = true; wrdDoc.Close(ref oFalse,ref oMissing,ref oMissing);


    // Release References. wrdSelection = null; wrdMailMerge = null; wrdMergeFields = null; wrdDoc = null; wrdApp = null;

    // Clean up temp file. System.IO.File.Delete("C:\\DataDoc.doc"); }
    Nota
    Debe cambiar el código en Visual Studio 2005. De manera predeterminada, Visual C# agrega un formulario al proyecto cuando crea un proyecto Windows Forms. El formulario se denomina Form1. Los dos archivos que representan el formulario se denominan Form1.cs y Form1.designer.cs. Escribe el código en Form1.cs. En el archivo Form1.designer.cs fes donde el Diseñador de Windows Forms escribe el código que implementa todas las acciones que realizó arrastrando y colocando controles desde el cuadro de herramientas.

    Para obtener más información acerca del Diseñador de Windows Forms en Visual C# 2005, visite el siguiente sitio Web de Microsoft Developer Network (MSDN): Nota
    Microsoft Office Word 2003 tiene un argumento adicional para el método Open del documento. Si utiliza el PIA de Word 2003, quite la notación del comentario del parámetro adicional para el método Open.
  7. Agregue lo siguiente al principio del archivo Form1.cs:
    using Word = Microsoft.Office.Interop.Word;
  8. Presione F5 para generar y ejecutar el programa.
  9. Haga clic en Button1 para iniciar la automatización de Word y realizar la combinación de correspondencia.

Referencias

Para obtener más información, visite el siguiente sitio Web de Microsoft Developer Network (MSDN):
Microsoft Office Development with Visual Studio
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx
Para obtener más información al respecto, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
285332 Cómo automatizar Word 2002 con Visual Basic para crear una combinación de correspondencia

Propiedades

Id. de artículo: 301659 - Última revisión: 11 jul. 2008 - Revisión: 1

Comentarios