Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   pasar datos a word (https://www.clubdelphi.com/foros/showthread.php?t=52652)

angelp4492 27-01-2008 13:45:49

pasar datos a word
 
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 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

Cita:

Empezado por angelp4492 (Mensaje 261313)
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:

Código:

  // 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:


Código Delphi [-]
// 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

Cita:

Empezado por ixMike (Mensaje 261468)
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

Código Delphi [-]
i:=1;
  while ido
   begin
    j:=1;

ixMike 28-01-2008 15:19:01

Cita:

Empezado por felipe88 (Mensaje 261489)
Noto que en while esta esto

Código Delphi [-]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://dn.codegear.com/article/10043

y el motor del club:

http://www.clubdelphi.com/foros/show...ht=delphi+word

Creo angelp4492 que deberias buscar un poco mas, a ver que encuentras...

Gabo 28-01-2008 17:08:21

Cita:

Empezado por felipe88 (Mensaje 261502)
Creo angelp4492 que deberias buscar 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 :

Código:

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/v...b05ofice01.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.


La franja horaria es GMT +2. Ahora son las 15:22:41.

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