Utilizando el word

10/03/2006 - 17:21 por SergioT | Informe spam
Hola

Tengo la siguiente situacion, necesito crear en Word un documento tipo que
sea una carta y que pueda generar la misma carta para X cantidad de
personas, eso en Word es facil haciendo la "combinacion de documentos", la
cosa es como hacerlo desde codigo vb.net, basicamente lo que necesito es
alterar la lista de personas sobre la cual el word generaria las cartas,
esta lista de nombres me la proporcionaria una clase

en un seudo codigo quisiera ver como hacer esto:

dim w as new WordDocument
dim oPersonas as new clsPersona

w.mailMerge.Add( oPersonas.GetListaParaCarta )

w.GenerarCartasEnNuevoDoc

Gracias
Salu2
Sergio
Santa Cruz-Bolivia
DCE-2

Preguntas similare

Leer las respuestas

#1 Luis Miguel Blanco
11/03/2006 - 11:11 | Informe spam
Hola Sergio

La opción de combinación de correspondencia en Word está diseñada para que
sea una fuente de datos externa la que proporciona la información de las
diferentes personas por las que se va a generar una carta. Dicha fuente de
datos puede ser un archivo de texto, de Excel, base de datos Access, SQL
Server, etc., hay muchos tipos de soporte en este sentido, pero eso sí, dicho
soporte debe ser físico, es decir, yo no he encontrado una forma de indicar
al sistema de combinación de correspondencia, que utilice un objeto o clase
que sea el que proporcione la información de las personas para las cartas.

Ante esta situación puedes optar por generar desde vb.net todo el código
encargado de crear las cartas y el texto correspondiente, lo que te
permitiría utilizar tu clase que te proporciona los nombres de las personas.

En el caso de que necesites imperiosamente usar la opción de combinación de
correspondencia de Word, un posible abordaje en este sentido sería, utilizar
la clase que porpociona los nombre de personas para volcar dichos nombres a
un origen de datos que sí soporte Word, los anteriormente mencionados archivo
de texto, excel, o una tabla en Access, SQL Server.

Una vez pasada la información de la clase, desde vb.net deberíamos llamar a
la opción de combinación de correspondencia, estableciendo el origen de datos
que hemos creado, para que esta opción de Word se "alimente" con la
información de las personas para generar las diferentes cartas necesarias.

El ejemplo que te proporciono en el código fuente que tienes a continuación
se basa en la primera solución que te he propuesto: hacerlo todo desde vb.net
sin usar la combinación de correspondencia de Word. Si necesitaras
obligatoriamente utilizar combinación de correspondencia, dímelo a ver si
podemos "montar" también un ejemplillo, aunque por tus comentarios, creo que
esto será suficiente 8-)

'///////////////////////////////////////
' esta sería la clase que tiene los nombres de personas para las cartas
Public Class ClientesCorreo
Private aListaClientes As ArrayList

Public ReadOnly Property Cantidad() As Integer
Get
Return aListaClientes.Count
End Get
End Property

Public Sub New()
aListaClientes = New ArrayList
End Sub

Public Sub Agregar(ByVal sNombreCliente As String)
aListaClientes.Add(sNombreCliente)
End Sub

Public Function Obtener(ByVal nPosicion As Integer) As String
Return aListaClientes.Item(nPosicion - 1)
End Function
End Class

' este sería el formulario, en el que creamos la correspondencia
' manipulando Word desde código vb.net
Imports Microsoft.Office.Interop

Public Class Form1
Inherits System.Windows.Forms.Form

Private Sub btnEnviarCorresp_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles btnEnviarCorresp.Click
Dim oCliCorreo As ClientesCorreo = New ClientesCorreo
oCliCorreo.Agregar("Luis")
oCliCorreo.Agregar("Elena")
oCliCorreo.Agregar("Ana")

Dim oWord As Word.ApplicationClass
oWord = New Word.ApplicationClass
oWord.Visible = True
oWord.WindowState = Word.WdWindowState.wdWindowStateNormal

Dim nContador As Integer
For nContador = 1 To oCliCorreo.Cantidad
oWord.Documents.Add()
oWord.Selection.TypeText("Encabezado carta " &
nContador.ToString())
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Estimado Sr/a. " &
oCliCorreo.Obtener(nContador))
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Resto del texto de la carta")
Next
End Sub
End Class
'///////////////////////////////////////

Espero que sea lo que necesitas.

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"SergioT" wrote:

Hola

Tengo la siguiente situacion, necesito crear en Word un documento tipo que
sea una carta y que pueda generar la misma carta para X cantidad de
personas, eso en Word es facil haciendo la "combinacion de documentos", la
cosa es como hacerlo desde codigo vb.net, basicamente lo que necesito es
alterar la lista de personas sobre la cual el word generaria las cartas,
esta lista de nombres me la proporcionaria una clase

en un seudo codigo quisiera ver como hacer esto:

dim w as new WordDocument
dim oPersonas as new clsPersona

w.mailMerge.Add( oPersonas.GetListaParaCarta )

w.GenerarCartasEnNuevoDoc

Gracias
Salu2
Sergio
Santa Cruz-Bolivia
DCE-2



Respuesta Responder a este mensaje
#2 SergioT
13/03/2006 - 16:49 | Informe spam
Hola Luis

muchas gracias por la sugerencia, en mi caso la idea es que los usuarios
escriban cartas tipo en Word que las colocarán en una carrpeta y luego de
ahi el sistema obtendra una lista de los documentos para elegir con cual
generar las n cartas a los clientes, en realidad lo del origen de datos yo
estaba pensando en xml o en un archivo texto temporal con por lo menos 3
campos (nombre, Doc de identidad, Titulo (sr, sra...) ). Me podrias ayudar
con un pequeño ejemplo de como hacer el mail merge desde un archivo texto
que tenga mas de una columna?

GRACIAS!!

Salu2
Sergio
Santa Cruz-Bolivia
DCE-2
"Luis Miguel Blanco" wrote in
message news:
Hola Sergio

La opción de combinación de correspondencia en Word está diseñada para que
sea una fuente de datos externa la que proporciona la información de las
diferentes personas por las que se va a generar una carta. Dicha fuente de
datos puede ser un archivo de texto, de Excel, base de datos Access, SQL
Server, etc., hay muchos tipos de soporte en este sentido, pero eso sí,
dicho
soporte debe ser físico, es decir, yo no he encontrado una forma de
indicar
al sistema de combinación de correspondencia, que utilice un objeto o
clase
que sea el que proporcione la información de las personas para las cartas.

Ante esta situación puedes optar por generar desde vb.net todo el código
encargado de crear las cartas y el texto correspondiente, lo que te
permitiría utilizar tu clase que te proporciona los nombres de las
personas.

En el caso de que necesites imperiosamente usar la opción de combinación
de
correspondencia de Word, un posible abordaje en este sentido sería,
utilizar
la clase que porpociona los nombre de personas para volcar dichos nombres
a
un origen de datos que sí soporte Word, los anteriormente mencionados
archivo
de texto, excel, o una tabla en Access, SQL Server.

Una vez pasada la información de la clase, desde vb.net deberíamos llamar
a
la opción de combinación de correspondencia, estableciendo el origen de
datos
que hemos creado, para que esta opción de Word se "alimente" con la
información de las personas para generar las diferentes cartas necesarias.

El ejemplo que te proporciono en el código fuente que tienes a
continuación
se basa en la primera solución que te he propuesto: hacerlo todo desde
vb.net
sin usar la combinación de correspondencia de Word. Si necesitaras
obligatoriamente utilizar combinación de correspondencia, dímelo a ver si
podemos "montar" también un ejemplillo, aunque por tus comentarios, creo
que
esto será suficiente 8-)

'///////////////////////////////////////
' esta sería la clase que tiene los nombres de personas para las cartas
Public Class ClientesCorreo
Private aListaClientes As ArrayList

Public ReadOnly Property Cantidad() As Integer
Get
Return aListaClientes.Count
End Get
End Property

Public Sub New()
aListaClientes = New ArrayList
End Sub

Public Sub Agregar(ByVal sNombreCliente As String)
aListaClientes.Add(sNombreCliente)
End Sub

Public Function Obtener(ByVal nPosicion As Integer) As String
Return aListaClientes.Item(nPosicion - 1)
End Function
End Class

' este sería el formulario, en el que creamos la correspondencia
' manipulando Word desde código vb.net
Imports Microsoft.Office.Interop

Public Class Form1
Inherits System.Windows.Forms.Form

Private Sub btnEnviarCorresp_Click(ByVal sender As System.Object, ByVal
e As System.EventArgs) Handles btnEnviarCorresp.Click
Dim oCliCorreo As ClientesCorreo = New ClientesCorreo
oCliCorreo.Agregar("Luis")
oCliCorreo.Agregar("Elena")
oCliCorreo.Agregar("Ana")

Dim oWord As Word.ApplicationClass
oWord = New Word.ApplicationClass
oWord.Visible = True
oWord.WindowState = Word.WdWindowState.wdWindowStateNormal

Dim nContador As Integer
For nContador = 1 To oCliCorreo.Cantidad
oWord.Documents.Add()
oWord.Selection.TypeText("Encabezado carta " &
nContador.ToString())
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Estimado Sr/a. " &
oCliCorreo.Obtener(nContador))
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Resto del texto de la carta")
Next
End Sub
End Class
'///////////////////////////////////////

Espero que sea lo que necesitas.

Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"SergioT" wrote:

Hola

Tengo la siguiente situacion, necesito crear en Word un documento tipo
que
sea una carta y que pueda generar la misma carta para X cantidad de
personas, eso en Word es facil haciendo la "combinacion de documentos",
la
cosa es como hacerlo desde codigo vb.net, basicamente lo que necesito es
alterar la lista de personas sobre la cual el word generaria las cartas,
esta lista de nombres me la proporcionaria una clase

en un seudo codigo quisiera ver como hacer esto:

dim w as new WordDocument
dim oPersonas as new clsPersona

w.mailMerge.Add( oPersonas.GetListaParaCarta )

w.GenerarCartasEnNuevoDoc

Gracias
Salu2
Sergio
Santa Cruz-Bolivia
DCE-2



Respuesta Responder a este mensaje
#3 Luis Miguel Blanco
13/03/2006 - 23:24 | Informe spam
Hola Sergio

Por supuesto, veamos, voy a exponerte un ejemplo que obtenga los datos de
las personas desde un archivo xml; el motivo de usar este formato reside en
que desde el código vb.net vamos a manipular esta información de un modo más
potente y flexible empleando un DataSet, como ventaja adicional, si en un
futuro, tu información proviene de una base de datos y tabla con esta misma
estructura, tendrás que hacer menos cambios que si usas un archivo de texto
con delimitadores para los campos.

En primer lugar pasemos al archivo xml, al que llamaremos
PersonasCorrespondencia.xml, y que podría tener un aspecto como el siguiente:

'/////////////////////////////
<?xml version="1.0" encoding="utf-8" ?>
<Correspondencia>
<Correspondencia>
<Titulo>Sr.</Titulo>
<Nombre>Manzano</Nombre>
<Ciudad>Madrid</Ciudad>
</Correspondencia>
<Correspondencia>
<Titulo>Sra.</Titulo>
<Nombre>Naranjo</Nombre>
<Ciudad>Valencia</Ciudad>
</Correspondencia>
<Correspondencia>
<Titulo>Sr.</Titulo>
<Nombre>Dorado</Nombre>
<Ciudad>Sevilla</Ciudad>
</Correspondencia>
</Correspondencia>
'/////////////////////////////

A continuación, desde el código vb.net de la aplicación, cargamos un DataSet
con el contenido del archivo xml, y recorremos la tabla del DataSet, creando
una carta por cada registro, y situando cada uno de los campos dentro de la
carta. En este caso asumimos que el archivo estará en la carpeta bin de la
aplicación. El código sería como el siguiente:

'/////////////////////////////
Dim dsCorrespondencia As DataSet = New DataSet
dsCorrespondencia.ReadXml(Application.StartupPath &
"\PersonasCorrespondencia.xml")
Dim tblCorrespondencia As DataTable =
dsCorrespondencia.Tables("Correspondencia")

Dim oWord As Word.ApplicationClass
oWord = New Word.ApplicationClass
oWord.Visible = True
oWord.WindowState = Word.WdWindowState.wdWindowStateNormal

For Each oFila As DataRow In tblCorrespondencia.Rows
oWord.Documents.Add()
oWord.Selection.TypeText("Encabezado carta")
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Estimado " & oFila("Titulo") & " " &
oFila("Nombre") & ":")
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Destino: " & oFila("Ciudad"))
oWord.Selection.TypeParagraph()
oWord.Selection.TypeText("Resto del texto de la carta")
Next
'/////////////////////////////

Espero que este ejemplo te sea de ayuda.
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com


"SergioT" wrote:

Hola Luis

muchas gracias por la sugerencia, en mi caso la idea es que los usuarios
escriban cartas tipo en Word que las colocarán en una carrpeta y luego de
ahi el sistema obtendra una lista de los documentos para elegir con cual
generar las n cartas a los clientes, en realidad lo del origen de datos yo
estaba pensando en xml o en un archivo texto temporal con por lo menos 3
campos (nombre, Doc de identidad, Titulo (sr, sra...) ). Me podrias ayudar
con un pequeño ejemplo de como hacer el mail merge desde un archivo texto
que tenga mas de una columna?

GRACIAS!!

Salu2
Sergio
Santa Cruz-Bolivia
DCE-2
"Luis Miguel Blanco" wrote in
message news:
> Hola Sergio
>
> La opción de combinación de correspondencia en Word está diseñada para que
> sea una fuente de datos externa la que proporciona la información de las
> diferentes personas por las que se va a generar una carta. Dicha fuente de
> datos puede ser un archivo de texto, de Excel, base de datos Access, SQL
> Server, etc., hay muchos tipos de soporte en este sentido, pero eso sí,
> dicho
> soporte debe ser físico, es decir, yo no he encontrado una forma de
> indicar
> al sistema de combinación de correspondencia, que utilice un objeto o
> clase
> que sea el que proporcione la información de las personas para las cartas.
>
> Ante esta situación puedes optar por generar desde vb.net todo el código
> encargado de crear las cartas y el texto correspondiente, lo que te
> permitiría utilizar tu clase que te proporciona los nombres de las
> personas.
>
> En el caso de que necesites imperiosamente usar la opción de combinación
> de
> correspondencia de Word, un posible abordaje en este sentido sería,
> utilizar
> la clase que porpociona los nombre de personas para volcar dichos nombres
> a
> un origen de datos que sí soporte Word, los anteriormente mencionados
> archivo
> de texto, excel, o una tabla en Access, SQL Server.
>
> Una vez pasada la información de la clase, desde vb.net deberíamos llamar
> a
> la opción de combinación de correspondencia, estableciendo el origen de
> datos
> que hemos creado, para que esta opción de Word se "alimente" con la
> información de las personas para generar las diferentes cartas necesarias.
>
> El ejemplo que te proporciono en el código fuente que tienes a
> continuación
> se basa en la primera solución que te he propuesto: hacerlo todo desde
> vb.net
> sin usar la combinación de correspondencia de Word. Si necesitaras
> obligatoriamente utilizar combinación de correspondencia, dímelo a ver si
> podemos "montar" también un ejemplillo, aunque por tus comentarios, creo
> que
> esto será suficiente 8-)
>
> '///////////////////////////////////////
> ' esta sería la clase que tiene los nombres de personas para las cartas
> Public Class ClientesCorreo
> Private aListaClientes As ArrayList
>
> Public ReadOnly Property Cantidad() As Integer
> Get
> Return aListaClientes.Count
> End Get
> End Property
>
> Public Sub New()
> aListaClientes = New ArrayList
> End Sub
>
> Public Sub Agregar(ByVal sNombreCliente As String)
> aListaClientes.Add(sNombreCliente)
> End Sub
>
> Public Function Obtener(ByVal nPosicion As Integer) As String
> Return aListaClientes.Item(nPosicion - 1)
> End Function
> End Class
>
> ' este sería el formulario, en el que creamos la correspondencia
> ' manipulando Word desde código vb.net
> Imports Microsoft.Office.Interop
>
> Public Class Form1
> Inherits System.Windows.Forms.Form
>
> Private Sub btnEnviarCorresp_Click(ByVal sender As System.Object, ByVal
> e As System.EventArgs) Handles btnEnviarCorresp.Click
> Dim oCliCorreo As ClientesCorreo = New ClientesCorreo
> oCliCorreo.Agregar("Luis")
> oCliCorreo.Agregar("Elena")
> oCliCorreo.Agregar("Ana")
>
> Dim oWord As Word.ApplicationClass
> oWord = New Word.ApplicationClass
> oWord.Visible = True
> oWord.WindowState = Word.WdWindowState.wdWindowStateNormal
>
> Dim nContador As Integer
> For nContador = 1 To oCliCorreo.Cantidad
> oWord.Documents.Add()
> oWord.Selection.TypeText("Encabezado carta " &
> nContador.ToString())
> oWord.Selection.TypeParagraph()
> oWord.Selection.TypeText("Estimado Sr/a. " &
> oCliCorreo.Obtener(nContador))
> oWord.Selection.TypeParagraph()
> oWord.Selection.TypeText("Resto del texto de la carta")
> Next
> End Sub
> End Class
> '///////////////////////////////////////
>
> Espero que sea lo que necesitas.
>
> Un saludo
> Luis Miguel Blanco
> http://www.dotnetmania.com
>
>
> "SergioT" wrote:
>
>> Hola
>>
>> Tengo la siguiente situacion, necesito crear en Word un documento tipo
>> que
>> sea una carta y que pueda generar la misma carta para X cantidad de
>> personas, eso en Word es facil haciendo la "combinacion de documentos",
>> la
>> cosa es como hacerlo desde codigo vb.net, basicamente lo que necesito es
>> alterar la lista de personas sobre la cual el word generaria las cartas,
>> esta lista de nombres me la proporcionaria una clase
>>
>> en un seudo codigo quisiera ver como hacer esto:
>>
>> dim w as new WordDocument
>> dim oPersonas as new clsPersona
>>
>> w.mailMerge.Add( oPersonas.GetListaParaCarta )
>>
>> w.GenerarCartasEnNuevoDoc
>>
>> Gracias
>> Salu2
>> Sergio
>> Santa Cruz-Bolivia
>> DCE-2
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida