Visual Basic.NET - DUDA DE CÓMO EXPORTAR DATOS A WORD MEDIANTE MARCADORES (BOOKMARKS)

   
Vista:

DUDA DE CÓMO EXPORTAR DATOS A WORD MEDIANTE MARCADORES (BOOKMARKS)

Publicado por RedWar (1 intervención) el 22/03/2013 15:09:09
- En primer lugar hice una plantilla de Word que guardé con el formato .docx. En dicha plantilla añadí una serie de marcadores en unos lugares muy concretos del documento. Por explicarlo de algún modo, el documento tiene 6 secciones y concretamente 6 marcadores distintos por sección.

- Quiero guardar los datos de cada uno de los registros de una tabla de una base de datos de modo que aparezcan los datos de un registro en los marcadores de la sección que le corresponda.

- No tengo problema al insertar solo una vez los datos sobre los marcadores especificados o, dicho de otra manera, el programa se ejecuta correctamente cuando por ejemplo inserto los datos de un registro concreto en una sección (por ejemplo la sección 1).

- Mi problema surge cuando quiero añadir de nuevo otra serie de datos,- correspondientes a otro registro-, a unos marcadores de una sección (por ejemplo de nuevo la 1) en la que ya he insertado antes otra serie de datos de otro registro.

- Lo que quiero es que cada vez que se vayan a añadir datos de una registro en una misma sección lo haga siempre con el mismo formato una y otra vez, para lo cual pensé que el uso de marcadores iba a ser harto sencillo...

- Depurando la ejecución del programa paso a paso pude ver que una vez el programa ha conseguido insertar los datos de uno de los registros en la sección 1, machaca esos marcadores. De ese modo, cuando el programa va a intentar rellenar por segunda vez (y con los datos de un nuevo registro) la misma sección 1, me salta una excepción que reza así:

- “Exception COMEXCEPTION (“El elemento del conjunto solicitado no existe”…”

- El log completo es el que sigue:

o System.Runtime.InteropServices.COMException was unhandled
o ErrorCode=-2146822347
o HelpLink="C:\Archivos de programa\Microsoft Office\Office12\3082\WDMAIN11.CHM#25421"
o Message="El elemento del conjunto solicitado no existe."
o Source="Microsoft Word"
o StackTrace:
o at Microsoft.Office.Interop.Word.Bookmarks.get_Item(Object& Index)
o at ComercialIndra.GeneradorDocx.secciones()
o in C:\Documents and Settings\sefelipe\Mis documentos\Visual Studio 2008\Projects\ComercialIndra\ComercialIndra\GeneradorDocx.vb:line 115
o at ComercialIndra.GeneradorDocx.generarDocx()
o in C:\Documents and Settings\sefelipe\Mis documentos\Visual Studio 2008\Projects\ComercialIndra\ComercialIndra\GeneradorDocx.vb:line 57
o at ComercialIndra.frmPpal.Button2_Click(Object sender, EventArgs e)
o in C:\Documents and Settings\sefelipe\Mis documentos\Visual Studio 2008\Projects\ComercialIndra\ComercialIndra\Form1.vb:line 42
o at System.Windows.Forms.Control.OnClick(EventArgs e)
o at System.Windows.Forms.Button.OnClick(EventArgs e)
o at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
o at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
o at System.Windows.Forms.Control.WndProc(Message& m)
o at System.Windows.Forms.ButtonBase.WndProc(Message& m)
o at System.Windows.Forms.Button.WndProc(Message& m)
o at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
o at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
o at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
o at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
o at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
o at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
o at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
o at System.Windows.Forms.Application.Run(Form mainForm)
o at ComercialIndra.Entrada.Main()
o in C:\Documents and Settings\sefelipe\Mis documentos\Visual Studio 2008\Projects\ComercialIndra\ComercialIndra\Entrada.vb:line 88
o InnerException:

- He añadido el log de la excepción solo por curiosidad porque ya sé la razón de por qué me salta esa excepción (la que acabo de apuntar más arriba).

- Mi pregunta es la siguiente: ¿Cómo puedo hacer lo que quiero? ¿Hago una copia de los marcadores antes de machacarlos? ¿Cómo? ¿Hago la plantilla de otra forma?.

- El enlace en el que me he basado para hacer los marcadores (bookmarks) es el siguiente: http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=251

- Buscando en google (después de mucho buscar) he encontrado estas referencias al problema que me atañe, por si sirven:
o http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/2afc5a34-1d84-4534-af13-ce0800b35c26/
o http://www.experts-exchange.com/Programming/Languages/.NET/Visual_Basic.NET/Q_22810890.html
o http://msdn.microsoft.com/es-es/library/microsoft.office.tools.word.bookmark_members(v=vs.90).aspx

- El código que utilizo es este (pongo solo la parte que nos interesa para el problema):

Imports Microsoft.Office.Interop

Public Class GeneradorDocx '-------------------CLASE
Private oWord As Word.Application
Private oDoc As Word.Document


Public Sub New()'------------------------------CONSTRUCTOR

Me.oWord = CreateObject("Word.Application")
FileCopy(ruta_archivo_plantilla_entre_comillas, _ ruta_archivo_generado_entre_comillas )

Me.oDoc = oWord.Documents.Open(ruta_archivo_generado_entre_comillas)

End Sub

Public Sub secciones()'-------------METODO PARA GENERAR EL DOCX
'-----Esto va dentro de un Select cuya explicacion no viene al caso
'-----Lo que nos importa es que con Case 1 nos referimos a en el caso
'-----de querer introducir los datos de un registro en la seccion1
Case 1
oDoc.Bookmarks.Item("marcador1").Range.Text = Me.myDbDataTable.Rows(cont).Item("DESCRIPCION") 'aquí salta la 'excepcion
oDoc.Bookmarks.Item("marcador2").Range.Text = Me.myDbDataTable.Rows(cont).Item("PROYECTO")
oDoc.Bookmarks.Item("marcador3").Range.Text = ceroExcepcionesNull(Me.myDbDataTable.Rows(cont).Item("IMPORTE"))
oDoc.Bookmarks.Item("marcador4").Range.Text = "Ultima novedad el 21/03/13"
oDoc.Bookmarks.Item("Marcador5").Range.Text = Me.myDbDataTable.Rows(cont).Item("INTRODUCCION")
oDoc.Bookmarks.Item("Marcador6").Range.Text = "21/03/13 Novedad nueva neu new..."
End Sub



- Habia pensado otra manera (una segunda manera) de generar el documento Word y era por medio de la creación de secciones y adicción de párrafos según este enlace:
- http://support.microsoft.com/kb/316383/es

- Mi problema si uso esta segunda manera es que Si quiero añadir un párrafo en el que por ejemplo Tenga una línea en negrita, seguida de un punto y seguido y mas texto, pero ese nuevo texto que no esté en negrita… pues no sé como hacerlo.

- Agradecería sino que me resolvieran las dos dudas (eso sería genial) al menos una de ellas. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder