Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Automatización OLE Word

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Automatización OLE Word Responder citando

Buenas,

He estado buscando por el foro el tema de la automatización word y no he encontrada nada sobre crear un documento de la nada y guardar en él datos de un edit, memo, stringrid..

Entre la semejanza con el excel y lo que he visto he llegado a esto:

Código:
 Variant Word, Documento, vDocumento, wordRange;
 String sFicheroWord = "word2.doc";
 //Crear un instancia en word
 Word = CreateOleObject("Word.Application");
 Word.OlePropertySet("Visible", false);
 //Abrir el documento
 Documento = Word.OlePropertyGet("Documents");
 Documento.OleProcedure("Add");
 Documento.OleFunction("Item", 1);
 //Obtenemos la posicion del principio del documento
 //wordRange = Documento.OleFunction("Range");
 //wordRange.OleProcedure("Collapse", 1);
 [...]

 //Cerrar documento
 Documento.OleProcedure("SaveAs", sFicheroWord.c_str());
 Documento.OleProcedure("Close", 0xFFFFFFFF);
 Word.OleProcedure("Quit");

 Word = Documento, vDocumento, wordRange = Unassigned;


Al ejecutar, me dice que "nombre desconocido"

¿Alguien me podría mostrar un ejemplo sobre la exportación a word por ejemplo del contenido de un Edit? Algo sencillo con que empezar.

Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Código:
    Variant Word, Documentos, Documento, Seleccion;
    String sFicheroWord = "word2.doc";

    Word = CreateOleObject("Word.Application");
    Word.OlePropertySet("Visible", false);

    Documentos = Word.OlePropertyGet("Documents");
    Documento = Documentos.OleFunction("Add");

    Seleccion = Word.OlePropertyGet("Selection");
    Seleccion.OleProcedure("TypeText", Edit1->Text.c_str());

    Seleccion.OleProcedure("TypeParagraph");
    Seleccion.OleProcedure("TypeText", "Otro parrafo");

    Documento.OleProcedure("SaveAs", sFicheroWord.c_str());
    Documento.OleProcedure("Close", 0xFFFFFFFF);
    Word.OleProcedure("Quit");

    Word = Documentos = Documento = Seleccion = Unassigned();
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo.

He modificado un trozo de código a:
Código:

 Seleccion = Word.OlePropertyGet("Selection");

    Seleccion.OleProcedure("TypeText", "prueba");
    int w;
    for (w = 0; w<this>TreeView->Items->Count; w++)
    {

     Seleccion.OleProcedure("TypeParagraph");
     Seleccion.OleProcedure("TypeText", this->TreeView->Items->Item[w]->Text.c_str());
    }


Quiero pasar el contenido de un TreeView a Word pero distinguiendo entre padres e hijos mediante viñetas en el word algo como:

En TreeView

padre1
hijo1
padre2
padre3
hijo3

a word

-padre1
------hijo1
y asi sucesivamente.

Como lo tengo así en el código me los muestras linea tras linea, pero no encuentro una relación para distinguirlos. Luego, ¿como introduzco el estilo viñetas en código para que me lo muestre en word?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Utilizando viñetas es más complicado y además tiene un límite de niveles. Te sirve así ?:
Código:
    Variant Seleccion = Word.OlePropertyGet("Selection");

        // Pasamos todo el contenido del TreeView a una cadena
    std::auto_ptr<TStringStream> ss(new TStringStream(""));
    TreeView1->SaveToStream(ss.get());
        // Reemplazamos los caracteres de nueva línea por el
        // carácter ASCII 11 (nueva línea dentro del mismo párrafo)
    TReplaceFlags rf = TReplaceFlags() << rfReplaceAll;
    String str = StringReplace(ss->DataString, "\r\n", "\x0b", rf);
        // Reemplazamos los tabuladores por "----" (opcional)
    str = StringReplace(str, "\t", "----", rf);

    Seleccion.OleProcedure("TypeText", str.c_str());

o así:
Código:

    Variant Seleccion = Word.OlePropertyGet("Selection");

    Seleccion.OleProcedure("TypeParagraph");
    for (int w = 0; w < TreeView1->Items->Count; w++)
    {
      TTreeNode* node = TreeView1->Items->Item[w];
        // Según el nivel en el TreeView añadimos tantos tabuladores
      Seleccion.OleProcedure("TypeText", String::StringOfChar('\t', node->Level));
        // Insertamos el caracter comunmente usado para las viñetas
      Seleccion.OleProcedure("TypeText", WideString((wchar_t)0x2022));
        // El texto..
      Seleccion.OleProcedure("TypeText", node->Text.c_str());
        // Nueva línea
      Seleccion.OleProcedure("TypeText", WideString("\x0b"));
    }
    Seleccion.OleProcedure("TypeParagraph");
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Hola _Leo

he probado ambas, en la primera me da un error al compilar con primer mensaje:

[C++ Error] appSniffer.cpp(1364): E2316 'auto_ptr' is not a member of 'std'

y en el segundo lo he colocado de esta manera entre el código:


Código:
 Variant Word, Documentos, Documento, Seleccion;
 Variant Tablas, Tabla, Rango;
 Variant borders, border;
 String sFicheroWord = "word2.doc";

 Word = CreateOleObject("Word.Application");
 Word.OlePropertySet("Visible", false);

 Documentos = Word.OlePropertyGet("Documents");
 Documento = Documentos.OleFunction("Add");

 Seleccion = Word.OlePropertyGet("Selection");
 Seleccion.OlePropertyGet("Font").OlePropertySet("Size",14);
 Seleccion.OlePropertyGet("Font").OlePropertySet("Color",clBlue);
 Seleccion.OleProcedure("TypeText", "Información del Sistema");

 Seleccion = Word.OlePropertyGet("Selection");
 //Pasar la letra a 10
 Seleccion.OlePropertyGet("Font").OlePropertySet("Size",10);
 Seleccion.OlePropertyGet("Font").OlePropertySet("Color",clBlack);
 Seleccion.OleProcedure("TypeParagraph");

 int w;

 for (w = 0; w<this>TreeView->Items->Count; w++)
 {
  // Según el nivel en el TreeView añadimos tantos tabuladores
  Seleccion.OleProcedure("TypeText", String::StringOfChar('\t', this->TreeView->Items->Item[w]->Level));
  // Insertamos el caracter comunmente usado para las viñetas
  Seleccion.OleProcedure("TypeText", WideString((wchar_t)0x2022));
  //Seleccion.OleProcedure("TypeParagraph");
  Seleccion.OleProcedure("TypeText",  this->TreeView->Items->Item[w]->Text.c_str());
  // Nueva línea
  Seleccion.OleProcedure("TypeText", WideString("\x0b"));
 }
 Seleccion.OleProcedure("TypeParagraph");

 Seleccion.OlePropertyGet("Font").OlePropertySet("Color",clBlue);
 Seleccion.OlePropertyGet("Font").OlePropertySet("Size",14);
 Seleccion.OleProcedure("TypeText", "Estadísticas Generales");
 Seleccion.OlePropertyGet("Font").OlePropertySet("Color",clBlack);
 Seleccion.OlePropertyGet("Font").OlePropertySet("Size",10);

 //Obtenemos la posicion del final del documento
 Rango = Documento.OleFunction("Range");
 Rango.OleProcedure("Collapse", 0);

 //Creamos la tabla
[...]


compila bien, pero me da una excepción en la clase OleSysError de tipo de variable incorrecto. Confused

Gracias de antemano.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

zankiu escribió:
[C++ Error] appSniffer.cpp(1364): E2316 'auto_ptr' is not a member of 'std'

Tienes que añadir: #include<memory>


zankiu escribió:
da una excepción en la clase OleSysError de tipo de variable incorrecto

Cambia la siguiente línea:
Código:
Seleccion.OleProcedure("TypeText", String::StringOfChar('\t', this->TreeView->Items->Item[w]->Level));
por:
Código:

Seleccion.OleProcedure("TypeText", String::StringOfChar('\t', this->TreeView->Items->Item[w]->Level).c_str());
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Te lo agradezo mucho, va perfecto, no tenía la librería pero creo que el fallo estaba en que tenía poner:

Código:
Seleccion.OleProcedure("TypeText", String::StringOfChar('\t', this->TreeView->Items->Item[w]->Level).c_str());


muchas gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.