Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Insertar datos a word (https://www.clubdelphi.com/foros/showthread.php?t=30762)

Manuel 18-04-2006 00:40:50

Insertar datos a word
 
Holas amigos del foro, hace tiempo que tengo la idea siguiente:

terner una plantilla en word mas o menos asi:

Señor
{nombre}
{direccion}

Estimado, le comunicamos que con fecha {fecha}, usted tiene una deuda de {deuda}, le rogamos regularizar su situacion.

Atentamen el cobrador

Ahora, los datos en {}, deberiaqn ser sacados de una base de datos en interbase y crear una aplicacion que fuera insertando esos datos en word, es posible?, me gustaria mucho si me dieron algunas ideas, gracias

roman 18-04-2006 07:00:05

Es muy sencillo. Creas la plantilla .dot en Word usando campos de tipo DocVariable (menú Insertar|Campo). A cada campo le asignas un nombre al momento de insertarlo. El documento .dot te quedaría más o menos así:

Señor
{ DOCVARIABLE nombre\* MERGEFORMAT }
{ DOCVARIABLE direccion\* MERGEFORMAT }

Estimado, le comunicamos que con fecha { DOCVARIABLE fecha\* MERGEFORMAT }, usted tiene una deuda de { DOCVARIABLE deuda\* MERGEFORMAT }, le rogamos regularizar su situacion.

Atentamen el cobrador
Conviene que actives la visualización de campos en el menú Herramientas|Opciones|Ver.

En Delphi, puedes llenar la plantilla así:

Código Delphi [-]
uses ComObj;

...

var
  Word: Variant;
  Documento: Variant;

begin
  (* Creas un objeto Word *)
  Word := CreateOleObject('Word.Application');

  (* Añades un documento basado en la plantilla *)
  Word.Documents.Add('carta.dot');
  Documento := Word.Documents.Item(1);

  (* Asignas valores a los campos *)
  Documento.Variables.Add('nombre', 'pepe pérez');
  Documento.Variables.Add('direccion', 'domicilio conocido');
  Documento.Variables.Add('fecha', '1976-02-29');
  Documento.Variables.Add('deuda', '$1.00 m.n');
end;

Claro está que los valores que asignes a los campos los puedes tomar de una consulta a la base de datos o de cualquier otra fuente.

// Saludos

CamiloU 19-04-2006 06:24:07

Me intereso el huilo y segui las instrucciones de Roman. Pero tengo una duda. Como puedo ver los resultados? Ejecute la aplicación pero no vi resultados en la plantilla. Es necesario realizar algún paso adicional?

Muchas Gracias.

egostar 19-04-2006 19:34:11

Aqui un link de Microsoft que creo te puede servir tambien.

Saludos.

roman 19-04-2006 20:08:05

Cita:

Empezado por CamiloU
Ejecute la aplicación pero no vi resultados en la plantilla. Es necesario realizar algún paso adicional?

Sí bueno, me faltó ese detallito :o

Después de los pasos anteriores necesitas visualizar Word con

Código Delphi [-]
Word.Visible := true;

Con esto debe aparecerte ya la ventana de Word con el nuevo documento.

// Saludos

Manuel 02-05-2006 00:22:17

gracias roman
 
segui los pasos que dijiste incluso el Word.Visible := true; me muestra la carta pero no los datos: justo como lo dijiste, use casi el mismo ejemplo, la plantilla asi:

Cita:

Carta

El señor
{ DOCVARIABLE nombres \* MERGEFORMAT}

Cita:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ComObj,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
Word: Variant;
Documento: Variant;
begin
(* Creas un objeto Word *)
Word := CreateOleObject('Word.Application');

(* Añades un documento basado en la plantilla *)
Word.Documents.Add('c:\softcolegio\plantilla.dot');
Documento := Word.Documents.Item(1);

(* Asignas valores a los campos *)
Documento.Variables.Add('nombres', 'pepe ');
Word.Visible := true;
end;

end.

roman 02-05-2006 00:48:53

¡Vaya! ¡Qué omisión! Acabo de revisar una vez más el código donde tengo implementado algo similar y veo que, en efecto, olvidaba algo que parece ser imprescindible.

Código Delphi [-]
Documento.Variables.Add('nombres', 'pepe ');
Documento.Fields.Update;
Word.Visible := true;

Espero que ahora sí.

// Saludos

Manuel 09-06-2006 20:47:31

hola roman, gracias por tu ayuda pero de todas meneras me muestra el doc, pero sigue apereciendo con el nombre de campo en vez del valor.

toorbye 08-08-2006 10:37:13

Hola, a mi el ejemplo me funciona correctamente, pero tengo una duda. Me gustaria que automaticamente el documento se guardara con un nombre que yo especificara. Busque en google pero no encontre nada, lo unico el parametro Save, Word.Documents.Save; que hace que se habra un cuadro de dialogo pidiendo el nombre del archivo. Pero a mi lo que me gustaria es que ya puediera especificar de modo transparente al usuario el nombre del archivo.
un saludo y gracias

jjkballero 25-08-2006 14:33:05

No actualiza los datos
 
He probado el código que proponéis, pues es justamente lo que llevaba buscando un tiempo, el problema es que no me actualiza la sentencia de word y el documento lo abre pero sin los datos que le envío desde Delphi, que mas nos podría faltar en este código. Gracias de antemano.:eek:

jjkballero 25-08-2006 14:40:52

Solucionado en primera orden
 
Probando he visto que los campos de Word hay que activarlos y listo.

Manuel 26-08-2006 15:46:07

Como, activarlos?

jjkballero 28-08-2006 09:01:23

Activar los campos
 
Estoy buscando la forma de activar directamente los campos desde Delphi, pues ocurre lo siguiente.

Desde el propio Word hay que ir campo por campo uno a uno, entonces necesito desde delphi abrir el documento de word activando los campos, me imagino que estos campos deben tener una propiedad para activarlos, será de esta forma o bien creando una macro en word y ejecutarla desde Delphi, voy a probar a ver si lo consigo, si alguien lo consigue antes que yo, que lo diga, gracias,

jjkballero 28-08-2006 09:10:04

Lo encontré
 
Para activar los variables en word basta con lanzar la siguiente instrucción:

documento.Fields.ToggleShowCodes y con esto conseguimos activar los campos en word y por tanto que se muestren los datos.:)

Manuel 28-08-2006 15:34:45

sigo con problemas, este mi código delphi
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  Word: Variant;
  Documento: Variant;

begin
  (* Creas un objeto Word *)
  Word := CreateOleObject('Word.Application');

  (* Añades un documento basado en la plantilla *)
  Word.Documents.Add('c:\plantilla.dot');
  Documento := Word.Documents.Item(1);

  (* Asignas valores a los campos *)
  Documento.Variables.Add('nombres', 'pepe pérez');
  documento.Fields.ToggleShowCodes;
  Documento.Fields.Update;

  Word.Visible := true;


end;


esta es mi plantilla:

Carta

El señor

{MERGEFIELD nombres \* MERGEFORMAT}



ewl resulto me sale exactamente lo mismo que la plantilla

jjkballero 29-08-2006 08:19:24

Yo lo tengo casi igual
 
Mira yo tengo el código igual solo que el update de las variables lo hago antes que el ToggleShowCodes y me funciona.

No se si las variables de word las insertas a mano o desde la opción

Insertar --> Campo y seleccionas la opción DocVariable

A ver si está ahí la cuestión.

roman 29-08-2006 09:25:54

Un par de comentarios:

ToggleShowCodes, más que activar los campos, alterna entre ver los códigos o ver los valores. Si en Word tenemos desmarcada la opción de ver los códigos, entonces ToggleShowCodes la marcará y lo que veremos son los códigos y no los valores.

El que se muestren los códigos o valores no afecta la impresión del documento. Siempre se imprimirán los valores actuales.

Por otra parte, veo que Manuel usa:

Código:

{MERGEFIELD nombres \* MERGEFORMAT}
pero debe ser

Código:

{DOCVARIABLE nombre\* MERGEFORMAT}
// Saludos

Manuel 29-08-2006 15:34:12

a pesar de todo los cambios incluso los que me propobe roman, igual sigo sin ver el resultado.

roman 29-08-2006 15:38:21

¿Puedes preparar una pequeña plantilla de muestra y el código? De ser así, ponlo en un zip y adjúntalo al mensaje.

// Saludos

Manuel 29-08-2006 15:42:57

1 Archivos Adjunto(s)
Gracias roman por tu interes, te mando plantilla

roman 29-08-2006 17:34:55

1 Archivos Adjunto(s)
Pues me ha funcionado tal cual. De cualquier manera te he preparado un ejemplo para que lo pruebes. Tiene algunas pequeñas diferencias como el uso de OleVariant en lugar de Variant, pero no creo que esto afecte realmente.

También agregué el método:

Código Delphi [-]
Word.ActiveWindow.View.ShowFieldCodes := false;

que debe forzar a que se vean los valores y no los campos. Si te marca un error, simplemente quita esa línea.

Va incluido el ejecutable, pero sólo funcionará si tienes instalado el Delphi 7.

// Saludos

Manuel 29-08-2006 18:48:05

gracias roman,:) ahora todo bien

arthurmax 07-03-2007 23:59:23

La plantilla no cierra
 
El ejercicio me funciona perfectamente, excepto por el hecho que la plantilla ".dot", queda abierta aún cerrando la aplicación en la que se genera el documento de Word, agradezco que me puedan decir cómo cierro la plantilla.

Gracias:confused:

fmatias 07-08-2007 13:35:17

Qusiera aprovechar este hilo para intentar resolver mi problema.
Tengo una variante del código descrito anteriormente que comprueba si existe ya un documento de word.

Si existe el documento abre el existente y si no existe abre el documento plantilla.

Código Delphi [-]
  Word: Variant;
  Documento: Variant;

begin
 (* Creamos un objeto Word *)
  Word := CreateOleObject('Word.Application');

  (* Añadimos un documento basado en la plantilla *)
  if FileExists(dbDOC.field.value) then   // si existe el fichero lo abrimos
     documento:=Word.Documents.Open(dbDOC.field.value)
  else  // abrimos la plantilla
    Word.Documents.Add(ExtractFilePath(Application.ExeName)+'Docs\Plantillas\caso1.dot');

    Documento := Word.Documents.Item(1);
    (* Asignas valores a los campos *)
    Documento.Variables.Add('Nombre',nombre );
    Documento.Variables.Add('Direc', direccion);
    Documento.Variables.Add('Local', localidad);
    Documento.Variables.Add('Prov', provincia);

    
    Word.ActiveDocument.SaveAs(ExtractFilePath(Application.ExeName)+'Docs\1Notificacion\'+dbidReg.field.  value);
    // actualizamos la tabla con el nuevo nombre de fichero 
    adocartas1.Edit ;
    dbDOC.field.value:=ExtractFilePath(Application.ExeName)+'Docs\1Notificacion\'+dbidReg.field.value+'.  doc';
    adocartas1.Post ;

   Documento.Fields.Update;
   Word.ActiveWindow.View.ShowFieldCodes := false;
   Word.Visible := true;

end;

Cuando abre el documento plantilla, va perfectamente, pero al abrir un documento existente me aparece un mensaje indicando que ya existe ese nombre de variable refirendose al código donde se añaden las variables.

¿Es posible limpiar las variables creadas en el documento existente?

Quedo pendiente de vuestras respuestas.

ingel 14-03-2008 15:02:48

he encontrado este hilo y es 'casi' lo que necesito..
 
pero mi pregunta es la siguiente ..puedo generar el archivo 'modelo' el .dot DESDE delphi .. para que asi sean los usuario los que creen los modelos y ponerles a disposicion una serie de VARIABLES que serian los datos que irian entre {} ... que saldrian de un SQL

Gracias a todos
Sds

luchin001 17-09-2008 20:09:29

Me he cabeceado 2 dias :mad: tratando de encontrar la forma de hacerlo, luego me acorde del clubdelphi :o, lei este hilo y solucionado !

gracias, muchas gracias ...:p

emeritos 14-11-2008 11:21:33

Hola compañeros de Delphi. Siguiendo este ejemplo del word al final me ha funcionado bien pero al cerrar la aplicacion me sale este error:

En tienpo de ejecucion --> "Runtime error 216 at 0043A1A"
En tienpo de diseño --> "Access violation at address 774FCAFC en module ole32.dll".

Como lo puedo solucionar.

PD. Este error que me sale al finalizar el programa no me impide que lo cierre y que vuelva a ejecutarlo otra vez, pero no da una buena impresión.

romacruzz 28-11-2008 00:15:20

sobre este ejemplo tengo una duda
 
Tenemos varias [FONT='Verdana','sans-serif']DOCVARIABLE nombre\* MERGEFORMAT } en una plantilla o machote , en delphi queremos programar las busqueda para que encuentre dentro de la platilla estas variables [FONT='Verdana','sans-serif']DOCVARIABLE nombre\* MERGEFORMAT } sustituirlas por informacion que tenemos en una base de datos....Como hacemos esto amigos..[/font][/font]
[FONT='Verdana','sans-serif'][/font]
[FONT='Verdana','sans-serif'][FONT='Verdana','sans-serif']No hay mucha informacion de como tratar archivos de word en delphi...[/font][/font]
[FONT='Verdana','sans-serif']
[/font]






Cita:

Empezado por fmatias (Mensaje 221093)
Qusiera aprovechar este hilo para intentar resolver mi problema.
Tengo una variante del código descrito anteriormente que comprueba si existe ya un documento de word.

Si existe el documento abre el existente y si no existe abre el documento plantilla.


Código Delphi [-]
Word: Variant;
Documento: Variant;

begin
(* Creamos un objeto Word *)
Word := CreateOleObject('Word.Application');

(* Añadimos un documento basado en la plantilla *)
if FileExists(dbDOC.field.value) then // si existe el fichero lo abrimos
documento:=Word.Documents.Open(dbDOC.field.value)
else // abrimos la plantilla
Word.Documents.Add(ExtractFilePath(Application.ExeName)+'Docs\Plantillas\caso1.dot');

Documento := Word.Documents.Item(1);
(* Asignas valores a los campos *)
Documento.Variables.Add('Nombre',nombre );
Documento.Variables.Add('Direc', direccion);
Documento.Variables.Add('Local', localidad);
Documento.Variables.Add('Prov', provincia);


Word.ActiveDocument.SaveAs(ExtractFilePath(Application.ExeName)+'Docs\1Notificacion\'+dbidReg.field. value);
// actualizamos la tabla con el nuevo nombre de fichero
adocartas1.Edit ;
dbDOC.field.value:=ExtractFilePath(Application.ExeName)+'Docs\1Notificacion\'+dbidReg.field.value+'. doc';
adocartas1.Post ;

Documento.Fields.Update;
Word.ActiveWindow.View.ShowFieldCodes := false;
Word.Visible := true;

end;





Cuando abre el documento plantilla, va perfectamente, pero al abrir un documento existente me aparece un mensaje indicando que ya existe ese nombre de variable refirendose al código donde se añaden las variables.

¿Es posible limpiar las variables creadas en el documento existente?

Quedo pendiente de vuestras respuestas.


inirio 08-01-2009 18:33:30

Alejandro inirio
 
no complicaos
escribeme a mi email i te sire como hacer reporte en word de manera facil
inirioalejandro@gmail.com

roman 08-01-2009 18:43:40

Alejandro,

Estos foros son para compartir conocimientos entre todos. Si tienes algo que aportar puedes escribir aquí mismo un mensaje o poner tu aporte en el FTP del club.

Si manejamos las cosas por correos privados, se pierde el sentido de los foros.

// Saludos

ASAPLTDA 11-01-2009 18:04:35

Mostrar Valor Campos En Vez De Nombre De Campos De La Plantilla
 
Cita:

Empezado por Manuel (Mensaje 154143)
a pesar de todo los cambios incluso los que me propobe roman, igual sigo sin ver el resultado.

Hola Manuel, no es tarde la respuesta es solo que segui este tema para enviar datos a word. La solucion Manual al problema es que debes en el .Dot Tener :
menu tools, menu options, tabsheet view Field Codes sin marcar (no chulo), lo que no se es como decirlo desde delphi .

Una vez lo elimna la marca salva el archivo .dot y genera nuevamente la impresion y esto hace que funcione

Gracias a los usarios de es tema por sus comentarios

ASAPLTDA 12-01-2009 18:11:13

Usando Tablas??
 
Hola Roman gracias por la informacion de word, podrias ayudarnos ampliando este mensaje para procesar una factura en word. la idea basica es
header igual para todas las paginas
detalle detalle del producto
totales totales del producto


LOGO XXXXXXXXXXXXXXX CIA NOMBRE


CLIENTE NOMBRE CLIENTE FACTURA FECHA
XXXXXX XXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXX

PRODUCTO DESCRIPCION CANTIDAD UNITARIO TOTAL IMPUESTO
XXXXXXX XXXXXXXXXX 1 100.25 100.25 16%
XXXXXXX XXXXXXXXXX 1 100.25 100.25 16%
XXXXXXX XXXXXXXXXX 1 100.25 100.25 16%
XXXXXXX XXXXXXXXXX 1 100.25 100.25 16%
...

TOTAL IMPUESTA 1250.00 TOTAL fACTURA 100.55


usando el ejemplo no pude colocar valores en el header o en el footer, y tampoco sabria como hacer las lineas del detalle


Prodrias ayudarno con algunas lineas de codigo y/o ejmeplo

Gracias

roman 12-01-2009 20:01:11

En el header y el footer de Word puedes insertar también variables de documento como las del ejemplo.

Para el caso de una tabla ya es distinto. Podrías combinar esto con el ejemplo de aquí.

// Saludos

NashvilleX 27-01-2009 22:07:48

Cita:

Empezado por roman (Mensaje 133005)
Es muy sencillo. Creas la plantilla .dot en Word usando campos de tipo DocVariable (menú Insertar|Campo). A cada campo le asignas un nombre al momento de insertarlo. El documento .dot te quedaría más o menos así:


Señor
{ DOCVARIABLE nombre\* MERGEFORMAT }
{ DOCVARIABLE direccion\* MERGEFORMAT }

Estimado, le comunicamos que con fecha { DOCVARIABLE fecha\* MERGEFORMAT }, usted tiene una deuda de { DOCVARIABLE deuda\* MERGEFORMAT }, le rogamos regularizar su situacion.

Atentamen el cobrador

Conviene que actives la visualización de campos en el menú Herramientas|Opciones|Ver.

En Delphi, puedes llenar la plantilla así:

Código Delphi [-]

uses ComObj;

...

var
Word: Variant;
Documento: Variant;

begin
(* Creas un objeto Word *)
Word := CreateOleObject('Word.Application');

(* Añades un documento basado en la plantilla *)
Word.Documents.Add('carta.dot');
Documento := Word.Documents.Item(1);

(* Asignas valores a los campos *)
Documento.Variables.Add('nombre', 'pepe pérez');
Documento.Variables.Add('direccion', 'domicilio conocido');
Documento.Variables.Add('fecha', '1976-02-29');
Documento.Variables.Add('deuda', '$1.00 m.n');
end;


Claro está que los valores que asignes a los campos los puedes tomar de una consulta a la base de datos o de cualquier otra fuente.

// Saludos


Agradezco mucho la ayuda. Menos mal que encontré este hilo para enterarme del método que enseñas.

Gracias:p

siriana 12-03-2009 19:23:08

insertar datos de builder a word
 
hola yo estoy trabajndo en c++ builder 6.0 y me maraca unos errores por que algunas propiedades no perteneces a ese tipo de builder, si me pudieran ayudar a sustitiur le codigo para c++ builder 6.0 estaria muy agradecida.ç

alekhine 18-04-2010 00:59:34

Funciona 100%
 
Gracias hermano, esto ya lo estaba buscando hace algun tiempo y esta es la mejor respuesta, a mi me funcionó a la peerfección.
Ahora la inquietud del otro pana es buena, como guardar el documento de una forma transparente para el usuario (automático)....
Gracias

axel07_89 30-11-2010 01:34:18

DocVariable desde Memo en delphi 7
 
Ayuda!! Tengo un docVariable en una plantilla, extraigo los datos desde un memo en delphi 7, el detalle esta en que muestra un símbolo en lugar de dar un salto de linea. :D

Casimiro Notevi 30-11-2010 01:48:41

Hola axel07_89, bienvenido a clubdelphi, por favor, lee nuestra guía de estilo para que podamos entendernos mejor, muchas gracias.

emeritos 30-04-2015 13:06:50

Y para insertar una imagen, la cual o bien la tengo en una variable longblob o su direccion algo como "c:\archivo\dibujo.jpg"

Gracias

fjcg02 30-04-2015 14:28:10

Prueba esto

Código Delphi [-]
Archivo = 'c:\imagen.png'
rango = wordtable.Cell( i,j).Range;
word.selection.inlinesshapes.addpicture(archivo, emptyparam, emptyparam, rango


Saludos


La franja horaria es GMT +2. Ahora son las 07:13:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi