PDA

Ver la Versión Completa : pasar datos a word


angelp4492
27-01-2008, 13:45:49
Hola como estas.
Bueno pues mi duda es la siguiente:
He creado un programa de cálculo de Cargas térmicas para climatización y tengo todos los datos en la pantalla, mi duda es como los puedo pasar a una plantilla tipo tabla o a un documento word para podir imprimir una con todos los datos, gracias

ixMike
27-01-2008, 14:09:13
Hola.

Bueno, si esos datos que tienes están almacenados en una base de datos, podrías utilizar los componentes QuickReport para imprimirlos. Si sencillamente los tienes en una variable (matriz) o en un StringGrid o algo similar, se me ocurre que podrías generar un archivo HTML que contenga una tabla (mira (http://www.desarrolloweb.com/manuales/21/) los puntos 21, 22 y 23) con los datos. Creo que también podrías utilizar TRichEdit para hacer un archivo RTF (aunque no sé si soportan tablas).

Lo del formato de Microsft Office Word, ya es más complicadillo (usando objetos OLE, creo, pero eso ya no sé hacerlo).


Salu2.

angelp4492
27-01-2008, 14:20:31
Pues la verdad los datos no los tengo en ninguna tabla, los meto por medio de tedit y hago los cálculos a partir de aqui...deberia meterlos en una tabla?

ixMike
27-01-2008, 14:29:02
No necesariamente. Según el método que quieras utilizar. Dices que tienes los datos en pantalla. ¿Dónde los tienes? ¿StringGird, Memo, Editsss...?

angelp4492
27-01-2008, 14:41:14
Los datos los meto por medio de tedit los muestro con tlabel y tb los tengo en las variables internas para las operaciones.

ixMike
27-01-2008, 14:49:09
Variables internas... entonces no están en pantalla, ¿o sí? No está muy claro esto...

de todas formas, creo que lo que mejor le viene a esto es crear un fichero HTML que tenga una tabla con los datos. En el enlace que te puesto antes (ese que pone "mira") tienes un manual HTML para saber cómo se hace (por si no lo sabías ya).



Salu2.

Gabo
28-01-2008, 09:25:34
Hola como estas.
Bueno pues mi duda es la siguiente:
He creado un programa de cálculo de Cargas térmicas para climatización y tengo todos los datos en la pantalla, mi duda es como los puedo pasar a una plantilla tipo tabla o a un documento word para podir imprimir una con todos los datos, gracias

Si quieres crear una tabla en Word:

// CREO EL DOCUMENTO A PARTIR DE UNA PLANTILLA QUE ABRO COMO SOLO LECTURA
Variant word, doc;
word = Variant::CreateObject("Word.Application");
word.OlePropertySet( "Visible", (Variant) true );
doc = word.OlePropertyGet("Documents");
if (FileExists(ExtractFilePath(Application->ExeName)+ "plantillas\\plantilla.doc"))
{
doc.OleFunction("Open", (ExtractFilePath(Application->ExeName)+ "plantillas\\plantilla.doc").c_str(), Unassigned, true);
}else{
MessageBox(this->Handle, "El archivo no existe", "Error" , MB_APPLMODAL | MB_OK | MB_ICONERROR);
word.OleProcedure("Quit");
return;
}
// CREO EL ENCABEZADO
Variant Selection = word.OlePropertyGet("Selection");
Variant Font = Selection.OlePropertyGet("Font");
Variant Parrafo = Selection.OlePropertyGet("ParagraphFormat");
Parrafo.OlePropertySet("Alignment","1");
Font.OlePropertySet("Name","Verdana");
Font.OlePropertySet("Bold","1");
Font.OlePropertySet("Size","12");
Selection.OleProcedure("TypeText", "TÍTULO\r\r\r");
Parrafo.OlePropertySet("Alignment","0");
Font.OlePropertySet("Size","10");
Selection.OleProcedure("TypeText", "Nombre:\t");
Font.OlePropertySet("Bold","0");
Selection.OleProcedure("TypeText", (cboNombre->Text + "\r").c_str());
Font.OlePropertySet("Bold","1");
Selection.OleProcedure("TypeText", "Fecha:\t");
Font.OlePropertySet("Bold","0");
Selection.OleProcedure("TypeText", (txtFecha->Text + "\r\r").c_str());

// Lo anterior te generará ésto:
//
// TÍTULO
//
// Nombre: Gabo
// Fecha: 03/12/2008
//

// CREO LA TABLA
doc = word.OlePropertyGet("ActiveDocument");
Variant rango = doc.OleFunction("Range");
rango.OleProcedure("Collapse", 0);
Variant tablas = rango.OlePropertyGet("Tables");
int rows = ListView1->Items->Count + 1;
// En este ejemplo creo tantas filas como ítemes en un ListView (+ 1 para los encabezados de columna)
int cols = 2;
Parrafo.OlePropertySet("Alignment","0");
Variant tabla = tablas.OleFunction("Add", rango, rows, cols);
Variant celda;
celda = tabla.OleFunction("Cell", 1, 1);
celda.OlePropertyGet("Range").OleProcedure("InsertAfter", "Producto");
celda = tabla.OleFunction("Cell", 1, 2);
celda.OlePropertyGet("Range").OleProcedure("InsertAfter", "Cantidad");
// A continuación recorro el ListView para ir poblando de datos la tabla
for (int i=1; i <rows; i++)
{
for (int j=1; j <=cols; j++)
{
if (j==1)
{
celda = tabla.OleFunction("Cell", i+1, j);
celda.OlePropertyGet("Range").OleProcedure("InsertAfter", (ListView1->Items->Item[i-1]->Caption).c_str());
}else{
celda = tabla.OleFunction("Cell", i+1, j);
celda.OlePropertyGet("Range").OleProcedure("InsertAfter", (ListView1->Items->Item[i-1]->SubItems[0][0]).c_str());
}
}
}
// Lo siguiente es para salir de la tabla y poder seguir insertando texto normal
Selection.OleProcedure("EndKey", 6);

ixMike
28-01-2008, 14:09:04
Creo (no estoy demasiadao puesto en C++) que la traducción a Object Pascal sería:



// CREO EL DOCUMENTO A PARTIR DE UNA PLANTILLA QUE ABRO COMO SOLO LECTURA
var
Word, doc, Selection, Font, Parrafo, rango, tablas, tabla, celda: Variant;
rows, cols, i, j: integer;
begin
word := Variant.CreateObject('Word.Application');
word.OlePropertySet( 'Visible', (Variant) true );
doc := word.OlePropertyGet('Documents');
if FileExists(ExtractFilePath(Application.ExeName)+ 'plantillas\plantilla.doc')) then
doc.OleFunction('Open', (ExtractFilePath(Application.ExeName)+ 'plantillas\plantilla.doc').c_str, Unassigned, true);
else
begin
MessageBox(Handle, 'El archivo no existe', 'Error' , MB_APPLMODAL or MB_OK or MB_ICONERROR);
word.OleProcedure('Quit');
Exit;
end;
// CREO EL ENCABEZADO
Selection := word.OlePropertyGet('Selection');
Font := Selection.OlePropertyGet('Font');
Parrafo := Selection.OlePropertyGet('ParagraphFormat');
Parrafo.OlePropertySet('Alignment','1');
Font.OlePropertySet('Name','Verdana');
Font.OlePropertySet('Bold','1');
Font.OlePropertySet('Size','12');
Selection.OleProcedure('TypeText', 'TÍTULO'+#13#13#13);
Parrafo.OlePropertySet('Alignment','0');
Font.OlePropertySet('Size','10');
Selection.OleProcedure('TypeText', 'Nombre:'+#9);
Font.OlePropertySet('Bold','0');
Selection.OleProcedure('TypeText', (cboNombre.Text + #13).c_str);
Font.OlePropertySet('Bold','1');
Selection.OleProcedure('TypeText', 'Fecha:\t');
Font.OlePropertySet('Bold','0');
Selection.OleProcedure('TypeText', (txtFecha.Text + #13#13).c_str);

// Lo anterior te generará ésto:
//
// TÍTULO
//
// Nombre: Gabo
// Fecha: 03/12/2008
//

// CREO LA TABLA
doc := word.OlePropertyGet('ActiveDocument');
rango := doc.OleFunction('Range');
rango.OleProcedure('Collapse', 0);
tablas := rango.OlePropertyGet('Tables');
rows := ListView1.Items.Count + 1;
// En este ejemplo creo tantas filas como ítemes en un ListView (+ 1 para los encabezados de columna)
cols := 2;
Parrafo.OlePropertySet('Alignment','0');
tabla := tablas.OleFunction('Add', rango, rows, cols);
celda := tabla.OleFunction('Cell', 1, 1);
celda.OlePropertyGet('Range').OleProcedure('InsertAfter', 'Producto');
celda := tabla.OleFunction('Cell', 1, 2);
celda.OlePropertyGet('Range').OleProcedure('InsertAfter', 'Cantidad');
// A continuación recorro el ListView para ir poblando de datos la tabla
i:=1;
while i < rows do
begin
j:=1;
while j<=cols
begin
if j=1
begin
celda := tabla.OleFunction('Cell', i+1, j);
celda.OlePropertyGet('Range').OleProcedure('InsertAfter', (ListView1.Items.Item[i-1].Caption).c_str);
end
else
begin
celda := tabla.OleFunction('Cell', i+1, j);
celda.OlePropertyGet('Range').OleProcedure('InsertAfter', (ListView1.Items.Item[i-1].SubItems[0][0]).c_str);
end;
Inc(j);
end;
Inc(i);
end;
// Lo siguiente es para salir de la tabla y poder seguir insertando texto normal
Selection.OleProcedure('EndKey', 6);



Espero no haber cometido ningún error.


Saludos.

Gabo
28-01-2008, 14:39:55
Creo (no estoy demasiadao puesto en C++) que la traducción a Object Pascal sería:

Espero no haber cometido ningún error.


Saludos.


Si alguien puede probarlo con un ListView que tenga unos pocos datos cargados en tiempo de diseño... saldríamos de dudas. :)

Gracias por la traducción... ;)

ixMike
28-01-2008, 15:03:47
Bueno, en mi obsoleto Delphi 3 da algún que otro error.

Pero lo más importante:

-Object or class type required (1ª línea)
-En Pascal en casting se hace Variant (true) . (2ª línea)
-(ExtractFilePath(Application.ExeName)+ 'plantillas\plantilla.doc').c_str en Pascal no tiene sentido alguno.
-En el primer while me dice ";" expected but WHILE found. ¿Por qué?

A partir de ahí hay errores que considero absurdos, como que j, cols y celda no están declaradas.

¿Alguien ve el fallo?

felipe88
28-01-2008, 15:16:23
Noto que en while esta esto

i:=1;
while ido
begin
j:=1;

ixMike
28-01-2008, 15:19:01
Noto que en while esta esto

Código Delphi [-] (http://www.clubdelphi.com/foros/#)i:=1;
while ido
begin j:=1;



Bueno, vale, en realidad es while i<rows do, pero lo he cambiado y es entonces cuando me ha salido el error.

P.D.: parece ser que el "ido" era por algo de etiquetas, porque al darle a "editar" aparecía bien escrito ¿?

felipe88
28-01-2008, 15:38:09
A bueno ixMike eso es otra cosa... la verdad no he trabajado mucho con wordapplication pero creo que habria que mirar otras fuentes, yo encotre esto con ayuda del señor Google (http://www.google.com):

http://dn.codegear.com/article/10043

y el motor del club:

http://www.clubdelphi.com/foros/showthread.php?t=51435&highlight=delphi+word

Creo angelp4492 que deberias buscar (http://www.clubdelphi.com/foros/search.php) un poco mas, a ver que encuentras...

Gabo
28-01-2008, 17:08:21
Creo angelp4492 que deberias buscar (http://www.clubdelphi.com/foros/search.php) un poco mas, a ver que encuentras...


Creo lo mismo, he puesto el código pero con el objetivo de fondo que investigue sobre las opciones que le dan los procedimientos OLE. Una búsqueda por palabras claves como :

OleFunction('Add'
OleProcedure('InsertAfter'
OleProcedure('EndKey'

debe darle buenos enlaces para que se documente.

Algunas de las páginas que visté cuando tuve que hacer lo de la tabla fueron (Ojo con la primera, está en ruso pero es muy buena):

http://wladm.narod.ru/Borland/word.html
http://www.djpate.freeserve.co.uk/AutoWord.htm#Tables
http://www.mvp-access.com/softjaen/vb2005/office/sjvb05ofice01.htm
http://www.willydev.net/descargas/wordc.pdf

Sé que leí mucho más pero no tengo los enlaces, aunque buscando y
rebuscando encontrarás lo que buscas.

angelp4492
29-01-2008, 22:16:58
gracias a todos ya estoy probando todo esto.
Ahora me surge otra duda como guado los datos en un fichero...pero esto ya lo planteo en el foro asias.