Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-01-2008
angelp4492 angelp4492 is offline
Miembro
 
Registrado: dic 2007
Posts: 99
Poder: 0
angelp4492 cantidad desconocida en este momento
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
Responder Con Cita
  #2  
Antiguo 27-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 27-01-2008
angelp4492 angelp4492 is offline
Miembro
 
Registrado: dic 2007
Posts: 99
Poder: 0
angelp4492 cantidad desconocida en este momento
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?
Responder Con Cita
  #4  
Antiguo 27-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
No necesariamente. Según el método que quieras utilizar. Dices que tienes los datos en pantalla. ¿Dónde los tienes? ¿StringGird, Memo, Editsss...?
Responder Con Cita
  #5  
Antiguo 27-01-2008
angelp4492 angelp4492 is offline
Miembro
 
Registrado: dic 2007
Posts: 99
Poder: 0
angelp4492 cantidad desconocida en este momento
Los datos los meto por medio de tedit los muestro con tlabel y tb los tengo en las variables internas para las operaciones.
Responder Con Cita
  #6  
Antiguo 27-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 28-01-2008
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
Cita:
Empezado por angelp4492 Ver Mensaje
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);
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.

Última edición por Gabo fecha: 28-01-2008 a las 09:28:52.
Responder Con Cita
  #8  
Antiguo 28-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
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.

Última edición por ixMike fecha: 28-01-2008 a las 15:21:01.
Responder Con Cita
  #9  
Antiguo 28-01-2008
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
Cita:
Empezado por ixMike Ver Mensaje
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...
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.
Responder Con Cita
  #10  
Antiguo 28-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
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?
Responder Con Cita
  #11  
Antiguo 28-01-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 19
felipe88 Va por buen camino
Noto que en while esta esto

Código Delphi [-]
i:=1;
  while ido
   begin
    j:=1;
__________________
Web
Responder Con Cita
  #12  
Antiguo 28-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por felipe88 Ver Mensaje
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 ¿?

Última edición por ixMike fecha: 28-01-2008 a las 15:21:59.
Responder Con Cita
  #13  
Antiguo 28-01-2008
Avatar de felipe88
[felipe88] felipe88 is offline
Miembro Premium
 
Registrado: may 2007
Ubicación: Mi Valle del Cauca... Colombia!!!
Posts: 1.120
Poder: 19
felipe88 Va por buen camino
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...
__________________
Web
Responder Con Cita
  #14  
Antiguo 28-01-2008
Avatar de Gabo
[Gabo] Gabo is offline
Miembro Premium
 
Registrado: mar 2007
Ubicación: Murcia (España)
Posts: 684
Poder: 18
Gabo Va por buen camino
Cita:
Empezado por felipe88 Ver Mensaje
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.
__________________
Saludos,
Gabo

A menos que se indique lo contrario, el código estará hecho en C++Builder.

Última edición por Gabo fecha: 28-01-2008 a las 17:11:11.
Responder Con Cita
  #15  
Antiguo 29-01-2008
angelp4492 angelp4492 is offline
Miembro
 
Registrado: dic 2007
Posts: 99
Poder: 0
angelp4492 cantidad desconocida en este momento
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error al pasar texto e imagen a word carlos gonzalez Varios 1 12-03-2007 21:05:04
Como pasar datos de una hoja de Excel a Bases de Datos de Paradox Goyo OOP 1 06-02-2007 01:57:20
Pasar de String a Word DarkByte Varios 4 09-08-2004 19:05:45
Alguien sabe cómo pasar parámetros a una plantilla Word?? Muten Servers 2 01-04-2004 00:07:43
Recoger datos de Word RaulChemical Impresión 0 01-10-2003 16:23:34


La franja horaria es GMT +2. Ahora son las 23:04:14.


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
Copyright 1996-2007 Club Delphi