Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Servers (https://www.clubdelphi.com/foros/forumdisplay.php?f=9)
-   -   Combinar TWordDocument con Variant (https://www.clubdelphi.com/foros/showthread.php?t=91842)

EagleKingson 12-05-2017 20:16:43

Combinar TWordDocument con Variant
 
Hola a todos, soy nuevo por aquí. Ya me leí la guía de estilo y una disculpa si el título no está bien formulado, no encontré otra forma de describirlo.

Estoy trabajando con una plantilla .odt a la cual le inserto variables. Esto es muy fácil y ya lo tengo, ya exiten hilos sobre esto pero de todas formas pongo mi código, el cual fue sacado de precisamente de foro de Club Delphi.

Código Delphi [-]
procedure TFmWord.Button1Click(Sender: TObject);
var
  Word: Variant;
  Documento: Variant;
  sRutaPlantilla, sDocumento : String;

begin
  sRutaPlantilla := ExtractFilePath(Application.ExeName)+'Plantilla\Plantilla.dotx';
  sDocumento     := ExtractFilePath(Application.ExeName)+'Documento\Documento.doc';

  if not CampoCapturado(Edit1.Text) or
     not CampoCapturado(Memo1.Text) or
     not CampoCapturado(Edit3.Text) or
     not CampoCapturado(Edit4.Text) or
     not CampoCapturado(Edit5.Text) or
     not CampoCapturado(Edit6.Text) or
     not CampoCapturado(Edit7.Text) then
    exit;
    

  try
    Word := CreateOleObject('Word.Application');


    Word.Documents.Add(sRutaPlantilla);
    Documento := Word.Documents.Item(1);

    Documento.Variables.Add('Nombre',     Edit1.Text);
    Documento.Variables.Add('Direccion',  Memo1.Text);
    Documento.Variables.Add('Folio',      Edit3.Text);
    Documento.Variables.Add('Cantidad',   Edit4.Text);
    Documento.Variables.Add('Empaque',    Edit5.Text);
    Documento.Variables.Add('Volumen',    Edit6.Text);
    Documento.Variables.Add('Peso',       Edit7.Text);

    Documento.Fields.Update;
    Documento.Fields.ToggleShowCodes;

    word.ActiveDocument.SaveAs(sDocumento); //Guarda documento con nombre asignado

    Word.Visible := true;

    //Documento.Quit; Se utiliza para cerrar word en caso de no mostrar el documento
  except
    MessageDlg('Ocurrió un error al ejecutar',mtError,[mbOk],0);
  end;
end;


NOTA: la función "CampoCapturado" es solo para verificar que todos los datos estén capturados.

Mi pregunta es cómo hacer para agregar tablas desde un TQuery a este mismo documento antes de cerrarlo. En un hilo el cual no me deja poner el enlace porque me dice que no tengo permisos, pero pondré el código que ahí se encuentra:

Código Delphi [-]
procedure InsertarTabla(DataSet: TDataSet; WordDoc: TWordDocument);
var
  WordTable: Table;
  ColIndexCount, RowCount, ColCount: Integer;
  RowIndex, ColIndex: Integer;

  Marcador : OleVariant;
begin
    RowCount := DataSet.RecordCount;
    ColCount := DataSet.Fields.Count;

    Marcador := 'TABLA_XXXX';
    //busco el marcador y si existe inserto la tabla
    if WordDocument1.Bookmarks.Exists(Marcador) then
    begin
      WordTable := WordDocument1.Tables.add(WordDocument1.Bookmarks.item(Marcador).Range, RowCount + 1, ColCount);

      //aqui hago la cabecera en negrita y en gris
      ColIndexCount := 0;
      for ColIndex := 1 to DataSet.Fields.Count do
      begin
        if DataSet.Fields[ColIndex - 1].Tag = 2 then
        begin
        ColIndexCount := ColindexCount + 1;
        WordTable.Cell(1, ColIndexCount).Range.Paragraphs.Borders.Enable := 1;
        WordTable.Cell(1, ColIndexCount).Range.Font.Bold                 := 1;
        WordTable.Cell(1, ColIndexCount).Range.Text                      := DataSet.Fields[ColIndex - 1].DisplayLabel;
        WordTable.Cell(1, ColIndexCount).Range.Paragraphs.Alignment      := wdAlignParagraphCenter;
        WordTable.Cell(1, ColIndexCount).Range.Cells.Shading.BackgroundPatternColorIndex:= wdGray25;
        end;
      end;

      RowIndex := 2;
      DataSet.First;
      while not DataSet.Eof do
      begin
        ColIndexCount := 0;
        for ColIndex := 1 to DataSet.Fields.Count do
        begin
          //los campos que su tag = 2 son los que quiero que se llenen en la tabla
          if DataSet.Fields[ColIndex - 1].Tag = 2 then
          begin
            ColIndexCount := ColindexCount + 1;
            WordTable.Cell(RowIndex, ColIndexCount).Range.Paragraphs.Borders.Enable := 1;
            WordTable.Cell(RowIndex, ColIndexCount).Range.Text                      := DataSet.Fields[ColIndex - 1].AsString;
          end;
        end;
        Inc(RowIndex);
        DataSet.Next;
      end;
    end;
end;
Aquí se puede hacer usando el componente TWordDocument y usando marcadores en la plantilla. Lo que no encuentro es cómo combinar estas dos formas de trabajar el word, es decir, no se si se pueda agregar el nuevo documento al componente TWordDocument o se hace de alguna otra forma, ya que mientras no se llegue e la línea "SaveAs", el nuevo archivo aún no tiene nombre.

PD: Trabajo con D5, Win7 y SQL Server 2014. (Según yo, mi pregunta está en el foro correcto porque la duda se refiere al componente TWordDocument).

De antemano agradezco su ayuda.

Es difícil ser un novato u_u.

Casimiro Notevi 12-05-2017 20:36:58

A ver si algún compañero puede ayudarte, no conozco bien este tema.

De todas formas, quería felicitarte, qué digo, darte una medalla, por lo menos, por haber elegido un foro adecuado, poner un título descriptivo, explicar bien el problema, poner los 'tags' al código fuente, haberte leído la guía de estilo, etc.

Casi se me saltan las lágrimas de la emoción, ¡¡¡no voy a poder reñirte por nada!!! :D

Mientras llegas a los 10 mensajes mínimos, puedes poner enlaces "haciendo trampa", ejemplos:
ww.loquesea.com/algo.php
ttp.ww. algunsitio.es/noseque.html

Y algún moderador lo editará.

EagleKingson 12-05-2017 20:40:38

Jajaja
 
Jajajaja ok ok, ya entendí el sarcasmo. Esa también fue una buena pedradada jaja..

Está bien, espero haya alguien por aquí que me puedar dar una mano. Te agradezco.

Casimiro Notevi 12-05-2017 20:44:39

Cita:

Empezado por EagleKingson (Mensaje 516624)
Jajajaja ok ok, ya entendí el sarcasmo. Esa también fue una buena pedradada jaja..

No, realmente es en serio, son pocos los que se molestan en hacer las cosas medianamente bien, o ni siquiera lo intentan.
¡¡¡Gracias y bienvenido a clubdelphi!!! :)

cloayza 12-05-2017 22:47:16

Cita:

Empezado por Casimiro Notevi (Mensaje 516623)
Mientras llegas a los 10 mensajes mínimos, puedes poner enlaces "haciendo trampa"...

:eek:

Pense que jamás sería testigo de las enseñanza de malas prácticas...:mad:

MODERADOOOOOOOOOOOOOOR :D

Atienda al señor Casimiro Notevi
:D

EagleKingson 12-05-2017 23:55:03

Hola de nuevo, con respecto a la pregunta original. Estoy tratando de agregar mi Variant al objeto TWordDocument asi:

Código Delphi [-]
WordDocument1 := TWordDocument.Create(Application);
WordDocument1.ConnectTo(IDispatch(Word) as _Document);

pero me manda el error "Interface no soportada", me imagino que es por la versión de word que tengo. Guardé mi plantilla .dot en modo de compatibilidad 97-2003 pero el error me sigue saliendo. Tal vez alguien tenga una idea de resolverlo, gracias.

EagleKingson 13-05-2017 00:58:11

¡He regresado! Y esta vez con la noticia de que resolví el problema. Estoy seguro que a alguien le servirá así que les comparto mi solución.

En lugar de agregar la variante word al TDocumentWord se tiene que agregar el documento (variante document), es decir, estaba cometiendo el terrible error de intentar modificar una aplicación y no un documento. Y posteriormente trabajaremos con ese TDocumentWord. Por lo que quedaría así:

Código Delphi [-]
procedure TFmWord.Button1Click(Sender: TObject);
var
Word: Variant;
Documento: Variant;
sRutaPlantilla, sDocumento : OleVariant;
begin
   sRutaPlantilla := ExtractFilePath(Application.ExeName)+'Plantilla\Plantilla.dotx';
   sDocumento     := ExtractFilePath(Application.ExeName)+'Documento\Documento.doc';
   if not CampoCapturado(Edit1.Text) or
      not CampoCapturado(Memo1.Text) or
      not CampoCapturado(Edit3.Text) or
      not CampoCapturado(Edit4.Text) or
      not CampoCapturado(Edit5.Text) or
      not CampoCapturado(Edit6.Text) or
      not CampoCapturado(Edit7.Text) then
       exit;
   try
      Word := CreateOleObject('Word.Application');
      Word.Documents.Add(sRutaPlantilla);
      Documento := Word.Documents.Item(1);

      WordDocument1 := TWordDocument.Create(Application);
      WordDocument1.ConnectTo(IDispatch(Documento) as _Document);
      WordDocument1.Variables.Add('Nombre',     Edit1.Text);
      WordDocument1.Variables.Add('Direccion',  Memo1.Text);
      WordDocument1.Variables.Add('Folio',      Edit3.Text);
      WordDocument1.Variables.Add('Cantidad',   Edit4.Text);
      WordDocument1.Variables.Add('Empaque',    Edit5.Text);
      WordDocument1.Variables.Add('Volumen',    Edit6.Text);
      WordDocument1.Variables.Add('Peso',       Edit7.Text);
      WordDocument1.Fields.Update;
      InsertarTabla(DSFind, WordDocument1); //Con eto se llena la tabla usando el TWordDocument
      WordDocument1.ActiveWindow.View.ShowFieldCodes := False; //Forza a mostrar los valores y no las variables
      WordDocument1.SaveAs(sDocumento); //Guarda documento con nombre asignado

      //Cerramos el documento y la aplicación
      WordDocument1.Close;
      Word.Quit;
      Word:= Unassigned;
   except
      MessageDlg('Ocurrió un error al ejecutar',mtError,[mbOk],0);
   end;
end;

Con esto el problema queda resuelto.

¡Saludos!

Casimiro Notevi 13-05-2017 01:42:27

Cita:

Empezado por cloayza (Mensaje 516628)
Pense que jamás sería testigo de las enseñanza de malas prácticas...

Realmente ese truco se lo decimos a todos los nuevos, sirve para que un moderador pueda verificar que el enlace es correcto y lo edite, dejándole bien :)

Casimiro Notevi 13-05-2017 01:43:00

Cita:

Empezado por EagleKingson (Mensaje 516630)
¡He regresado! Y esta vez con la noticia de que resolví el problema. Estoy seguro que a alguien le servirá así que les comparto mi solución.
En lugar de agregar la variante word al TDocumentWord se tiene que agregar el documento (variante document), es decir, estaba cometiendo el terrible error de intentar modificar una aplicación y no un documento. Y posteriormente trabajaremos con ese TDocumentWord. Por lo que quedaría así:
Con esto el problema queda resuelto.
¡Saludos!

^\||/^\||/^\||/

ecfisa 13-05-2017 01:48:53

Cita:

Empezado por EagleKingson (Mensaje 516630)
¡He regresado! Y esta vez con la noticia de que resolví el problema. Estoy seguro que a alguien le servirá así que les comparto mi solución.

Muchas gracias por publicar la solución ^\||/

Saludos :)

yusnerqui 13-05-2017 02:38:38

Cita:

Empezado por EagleKingson (Mensaje 516622)
PD: Trabajo con D5, Win7 y SQL Server 2014. (Según yo, mi pregunta está en el foro correcto porque la duda se refiere al componente TWordDocument).

De antemano agradezco su ayuda.

Es difícil ser un novato u_u.

Ese D5 es realmente delphi 5 :eek::eek: yo que estaba guardando en secreto que todabía sigo usando delphi 7 :cool:

Casimiro Notevi 13-05-2017 02:45:19

Cita:

Empezado por yusnerqui (Mensaje 516636)
Ese D5 es realmente delphi 5 :eek::eek: yo que estaba guardando en secreto que todabía sigo usando delphi 7 :cool:

Yo llevo un tiempo usando Delphi 6.

yusnerqui 13-05-2017 04:32:21

Cita:

Empezado por Casimiro Notevi
Yo llevo un tiempo usando Delphi 6.

Debería haber un botón me gusta para poder usarlo en comentarios como ese jajajaja. saludos

Ñuño Martínez 15-05-2017 10:35:22

Siempre puedes dalre buena reputación (el icono entre el número y las tarjetas roja y amarilla, arriba a la derecha del mensaje).

yusnerqui 15-05-2017 19:31:35

Caramba, muy buena la opción de la reputación, no la conocía, eso es nuevo en el club, tambien veo algo que dice poder que no se a que se refiere, creo quee tendré que leer un poco lo que ha pasado en los últimos eemmm 10 años en el club:confused::confused::confused:

EagleKingson 15-05-2017 19:34:00

Cita:

Empezado por yusnerqui (Mensaje 516667)
tambien veo algo que dice poder que no se a que se refiere

¿No serán las vidas que tienes? jaja Broma, yo tampoco sé

yusnerqui 15-05-2017 19:42:34

Cita:

Empezado por EagleKingson (Mensaje 516668)
¿No serán las vidas que tienes? jaja Broma, yo tampoco sé

A que me enojo y te disparo con mis 14 puntos de poder :eek:,,,,,,, o mejor convo a un monstruo tipo dragón con 14 puntos de podre,,,,,;) o incluso convino mi poder con mi reputación y convoco al gran monstruo amigo roman :):) y seguro nos explica un poco de estas novedades que hemos descubierto en el club,,,,, aunque para otros ya sean antiguedades. Por favor que no se malinterprete mi jococidad, es que vengo de jugar una partida de Yugui oh jajajaja


La franja horaria es GMT +2. Ahora son las 12:49:16.

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