Ver Mensaje Individual
  #1  
Antiguo 12-05-2017
EagleKingson EagleKingson is offline
Registrado
NULL
 
Registrado: abr 2015
Posts: 8
Reputación: 0
EagleKingson Va por buen camino
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.

Última edición por EagleKingson fecha: 12-05-2017 a las 20:20:20. Razón: El código Delphi no se viualizó correctamente.
Responder Con Cita