Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-11-2023
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 268
Poder: 14
darkamerico Va por buen camino
Red face Exportar el contenido de un Richtext hacia Word

Saludos amigos:
He implementado las siguientes funciones para lograr pasar el contenido desde un componente TRxRichEdit hacia Word:

Código Delphi [-]

procedure TfrmPrincipal.btnXportDocXClick(Sender: TObject);
begin
  if saveDLG.Execute then ExportarArchivoDocX(doc, saveDLG.FileName)
  else ShowMessage('No existe un Documento cargado para Exportar');
end;

procedure ExportarArchivoDocX(const RichEdit: TRxRichEdit; const FileName: string);
var
  WordApp, Document: Variant;
begin
  WordApp := CreateOleObject('Word.Application');
  WordApp.Visible := False;

  Document := WordApp.Documents.Add;

  try
    CopiarContenidoConFormatoAlPortapapeles(RichEdit);
    Document.Content.Paste;
    Document.SaveAs(FileName, 16); // 16 = formato docx
    Document.Close;
    WordApp.Quit;
  finally
    Document := Unassigned;
    WordApp := Unassigned;
  end;
  AbrirDocumentoWord(FileName+'.docx');
end;

procedure CopiarContenidoConFormatoAlPortapapeles(richEdit: TRxRichEdit);
var
  stream: TMemoryStream;
  format: Cardinal;
  data: HGLOBAL;
  ptr: Pointer;
begin
  stream := TMemoryStream.Create;
  try
    richEdit.Lines.SaveToStream(stream);
    stream.Position := 0;

    format := RegisterClipboardFormat(CF_RTF);
    data := GlobalAlloc(GMEM_MOVEABLE or GMEM_ZEROINIT, stream.Size + 1);
    try
      ptr := GlobalLock(data);
      try
        Move(stream.Memory^, ptr^, stream.Size);
      finally
        GlobalUnlock(data);
      end;

      Clipboard.Open;
      try
        Clipboard.SetAsHandle(format, data);
      finally
        Clipboard.Close;
      end;
    except
      GlobalFree(data);
      raise;
    end;
  finally
    stream.Free;
  end;
end;

function AbrirDocumentoWord(const filePath: string): Variant;
var
  WordApp: Variant;
  WordDoc: Variant;
begin
  WordApp := CreateOleObject('Word.Application');
  WordApp.Visible := True;
  WordDoc := WordApp.Documents.Open(filePath);
  Result := WordDoc;
end;

A pesar que el código anterior funciona bien, me gustaría evitar que se cree un documento en el disco duro y pasar directamente el contenido desde el componente TRxRichEdit hacia word, manteniendo su formato claro.

Alguien podría darme una mano por favor?

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 09-11-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.757
Poder: 21
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Creo entender que quieres
  1. que se abra Word
  2. pegarle el contenido RTF
  3. que se quede visible, sin guardar, para que el usuario pueda seguir haciendo modificaciones

Supongo que podrías hacer lo siguiente:

Código Delphi [-]
  try
    CopiarContenidoConFormatoAlPortapapeles(RichEdit);
    Document.Content.Paste;
    {
    Document.SaveAs(FileName, 16); // 16 = formato docx
    Document.Close;
    WordApp.Quit;
    }
    WordApp.Visible := True;
  finally
    Document := Unassigned;
    WordApp := Unassigned;
  end;
Responder Con Cita
  #3  
Antiguo 09-11-2023
darkamerico darkamerico is offline
Miembro
 
Registrado: dic 2010
Posts: 268
Poder: 14
darkamerico Va por buen camino
Red face

Muchas Gracias duilioisola,
efectivamente, tenias razón, me cree otra funcion para hacer el trabajo y quedó asi:

Código Delphi [-]
procedure ExportarArchivoDocX2(const RichEdit: TRxRichEdit);
var
  WordApp, Document: Variant;
begin
  WordApp := CreateOleObject('Word.Application');
  WordApp.Visible := False;

  Document := WordApp.Documents.Add;

  try
    CopiarContenidoConFormatoAlPortapapeles(RichEdit);
    Document.Content.Paste;
    WordApp.Visible := True;
  finally
    Document := Unassigned;
    WordApp := Unassigned;
  end;
end;


Cita:
Empezado por duilioisola Ver Mensaje
Creo entender que quieres
  1. que se abra Word
  2. pegarle el contenido RTF
  3. que se quede visible, sin guardar, para que el usuario pueda seguir haciendo modificaciones

Supongo que podrías hacer lo siguiente:

Código Delphi [-]
  try
    CopiarContenidoConFormatoAlPortapapeles(RichEdit);
    Document.Content.Paste;
    {
    Document.SaveAs(FileName, 16); // 16 = formato docx
    Document.Close;
    WordApp.Quit;
    }
    WordApp.Visible := True;
  finally
    Document := Unassigned;
    WordApp := Unassigned;
  end;
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
Exportar el contenido de un TWebReport a PDF darkamerico Internet 3 04-05-2018 06:50:00
Problema con caracteres al exportar datos hacia excel con una rutina antígua rrf Varios 5 16-02-2018 02:43:26
Copiar contenido de una tabla de un doc Word en una tabla de otro doc Word hades2600 Servers 0 15-03-2009 18:35:02
Acceder al contenido de un word hcalero Servers 2 22-08-2007 14:07:09
exportar datos hacia excel alfil123 Varios 1 21-11-2006 20:00:38


La franja horaria es GMT +2. Ahora son las 02:09:40.


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