OLE & ABAP: con visible = 0, ¿dónde lo guarda?

Colapsar
X
 
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
  • jordiC77
    Junior Member
    • nov
    • 13

    #1

    OLE & ABAP: con visible = 0, ¿dónde lo guarda?

    Hola!!

    Estoy trabajando con OLE & ABAP con un fichero excel. Si le pongo
    set property of e_appl 'VISIBLE' = 1.
    deja el fichero excel abierto.

    En cambio, si le pongo
    set property of e_appl 'VISIBLE' = 0.
    no abre el fichero. Esto es lo que quiero porque el proceso es en fondo y el usuario no tiene que verlo, pero además me gustaría especificarle una ruta en donde me guardara el fichero excel. No se si me he explicado. Más o menos és: créame este fichero excel en visible = 0 y guardalo en c:\temp\...

    ¿Alguien sabe hacerlo?

    Muchas gracias de antemano,
    Jordi.
  • eljota
    Member
    • dic
    • 48

    #2
    guardando excel

    Hola,

    tendrías que agregar en tu codigo:


    DATA: nro_hoja TYPE i,
    hoja TYPE OLE2_OBJECT,
    e_appl TYPE OLE2_OBJECT.

    ....

    CALL METHOD OF e_appl 'Worksheets' = hoja
    EXPORTING #1 = Nro_hoja.

    * Luego de hacer todo lo q tengas q hacer con el archivo excel, guardas...

    CALL METHOD OF hoja 'SaveAs'
    EXPORTING #1 = W_PATH
    #2 = 1.

    en donde W_path seria la ruta donde quieres q se guarde C:\data\archivo.xls

    espero q esto te sirva

    salu2
    Jaime Zegarra V.
    ________________
    ABAP Developer

    Comentario

    • MEG30
      Junior Member
      • oct
      • 4

      #3
      Modificar archivo excel existente

      Hola:
      Hice un programa que copia un txt almacenado en servidor de sap y genera un archivo ecxel y lo guarda en forma local. El problema es que, o es un error mío con el código(lo adjunto abajo), o realmente es así, para 4 registros tarda 16 segundos, hablando de pruebas en desarrollo con pocos datos, lo cual es demasiado lento. El archivo txt original tiene más de 5 mil registros. Lo probé con ole2 porque el cliente quiere que la primer hoja tenga el nombre de "EtiquetasNuevas" en lugar de Hoja1 y formato texto para las columnas 1 y 3, esto es porque la coluna 1 tiene un número de material(MATNR), que con formato general un numero '802313203000' lo pone así '802313E+11'. El cliente tiene un software de impresión de etiquetas que reconoce archivos excel con el formato antes mencionado. Por tema de lentitud quiero descargar a excel con una función pero no puedo con función dar nombre a la primer hoja ni formato texto a las columnas 1 y 3. La consulta es: ¿es posible abrir un archivo excel ya almacenado y cambiarle con ole2 el nombre a la hoja y dar formato texto a las columnas antes mencionadas? hablamos de con un describe table tener la cantidad de filas y ya sabemos la cantidad de columnas. Muchas gracias por tu ayuda.



      *&---------------------------------------------------------------------*
      *& Form F_GUARDA_EXCEL
      *&---------------------------------------------------------------------*
      * text
      *----------------------------------------------------------------------*
      form f_guarda_excel.

      field-symbols: <fs_table> type any table,
      <fs_line> type ty_file,
      <fs_data> type any.

      data v_filename type rlgrap-filename.
      clear v_filename.
      move p_path to v_filename.
      ************************************************** **********************
      * Declaraciones para la llamada a EXCEL.
      data: o_hoja_excel type ole2_object,
      o_excel type ole2_object,
      o_libro type ole2_object,
      o_ole_sheets type ole2_object,
      o_activesheet type ole2_object,
      o_cell type ole2_object,
      o_libros_trabajo type ole2_object,
      o_l_lineas(10) type c,
      o_rango type ole2_object,
      v_line type i.

      assign t_file to <fs_table>.

      * Se crea el objeto Hoja Excel.
      create object o_excel 'EXCEL.APPLICATION'.
      * Se hace visible la aplicación Excel
      set property of o_excel 'VISIBLE' = 1.
      call method of o_excel 'WORKBOOKS' = o_libros_trabajo.
      call method of o_libros_trabajo 'Add' = o_libros_trabajo.
      get property of o_excel 'ActiveSheet' = o_activesheet.
      set property of o_activesheet 'Name' = 'EtiquetasNuevas'.

      clear v_line.
      loop at <fs_table> assigning <fs_line>.
      v_line = v_line + 1.

      do.
      assign component sy-index of structure <fs_line> to <fs_data>.

      if sy-subrc ne 0.
      exit.
      endif.

      call method of o_activesheet 'Cells' = o_cell
      exporting
      #1 = v_line
      #2 = sy-index.

      IF SY-INDEX EQ 1 OR SY-INDEX EQ 3.
      set property of o_cell 'NUMBERFORMAT' = '@'.
      ENDIF.

      set property of o_cell 'Value' = <fs_data>.
      set property of o_cell 'ColumnWidth' = 20.

      enddo.

      endloop.


      call method of o_libros_trabajo 'SAVEAS'
      exporting #1 = v_filename. "path de archivo como c:\Etiquetas.xls
      call method of o_libros_trabajo 'close'.
      * call method of o_excel 'QUIT'.
      free object: o_excel,
      o_libros_trabajo,
      o_cell,
      o_activesheet.

      endform. " F_GUARDA_EXCEL

      Comentario

      • eljota
        Member
        • dic
        • 48

        #4
        Hola MEG30,

        si quieres ganar velocidad, primero debes ocultar el progreso d llenado d la hoja d excel, es decir, donde pones ... visible = '1', cambialo por '0' y justo antes del Save, regresalo a '1'.

        Lo otro q dices, de abrir un archivo con datos llenos y solo actualizar formatos también se puede hacer, fíjate en el siguiente ejemplo q está detallado:

        REPORT zexcel.
        ************************************************** **********************
        * Include necesario para la declaracion de objetos OLE2
        ************************************************** **********************
        INCLUDE ole2incl.
        ************************************************** **********************
        ************************************************** **********************
        * Declaraciones para la llamada a EXCEL.
        DATA hoja_excel TYPE ole2_object.
        DATA excel TYPE ole2_object.
        DATA libro TYPE ole2_object.
        DATA ole_sheets TYPE ole2_object.
        DATA ole_sheet TYPE ole2_object.
        DATA ole_libro TYPE ole2_object.
        DATA libros_trabajo TYPE ole2_object.
        DATA ole_datasheet TYPE ole2_object.
        DATA ole_datacells TYPE ole2_object.
        DATA l_lines TYPE i.
        DATA l_lineas(10) TYPE c.
        DATA rango TYPE ole2_object.
        DATA row TYPE ole2_object.
        DATA ventana TYPE ole2_object.

        DATA end(10) TYPE c.
        * Se crea el objeto Hoja Excel.
        CREATE OBJECT hoja_excel 'Excel.Sheet'.
        * Se llama a la aplicación Excel.
        CALL METHOD OF hoja_excel 'Application' = excel.
        * Se hace visible la aplicación Excel
        SET PROPERTY OF excel 'Visible' = 1.
        CALL METHOD OF excel 'Workbooks' = libros_trabajo.
        * Se abre el archivo con los datos del listado
        CALL METHOD OF libros_trabajo 'Open' = libro EXPORTING
        #1 = 'C:\DOCS\PRUEBA.XLS'.
        CALL METHOD OF libro 'Worksheets' = ole_sheets.
        * Se crea un nuevo libro y se copian los datos del fichero al libro
        CALL METHOD OF ole_sheets 'Item' = ole_datasheet EXPORTING #1 = 1.
        CALL METHOD OF ole_datasheet 'Copy'.
        !
        * Se cierra el fichero de trabajo con los datos.
        call method of libro 'Close' exporting #1 = 0.
        GET PROPERTY OF excel 'ACTIVESHEET' = ole_sheet.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'C1' #2 = 'H1'.
        * Se formatea el ancho de columna
        SET PROPERTY OF rango 'COLUMNWIDTH' = 21.
        GET PROPERTY OF excel 'ACTIVEWINDOW' = ventana.
        * Se muestra el libro con el formato en rejilla
        SET PROPERTY OF ventana 'DISPLAYGRIDLINES' = -1.
        FREE OBJECT rango.
        * Se obtiene el total de líneas de la tabla para crear
        * un rango con todas las celdas númericas y formatearlas
        DESCRIBE TABLE i_detmedi LINES l_lines.
        WRITE l_lines TO l_lineas.
        TRANSLATE l_lineas USING '. '.
        * Se aplica el formato numérico con decimales en los miles a
        * las celdas que contienen importes.
        CONCATENATE 'H' l_lineas INTO end.
        CONDENSE end NO-GAPS.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'C1' #2 = end.
        SET PROPERTY OF rango 'NUMBERFORMAT' = '#,##0'.
        FREE OBJECT rango.
        *Se informa la cabecera del listado, insertando una fila en blanco al principio del mismo
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'A1'.
        CALL METHOD OF rango 'ENTIREROW' = row.
        CALL METHOD OF row 'INSERT'.
        FREE OBJECT rango.
        FREE OBJECT row.
        * Creando un rango con cada una de las celdas e informando el texto
        * en las celdas se obtiene la cabecera
        call method of ole_sheet 'RANGE' = rango exporting
        #1 = 'A1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-003.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'B1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-012.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'C1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-007.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'D1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-008.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'E1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-013.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'F1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-010.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'G1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-011.
        FREE OBJECT rango.
        CALL METHOD OF ole_sheet 'RANGE' = rango EXPORTING
        #1 = 'H1'.
        SET PROPERTY OF rango 'FORMULAR1C1' = text-013.
        FREE OBJECT rango.
        * Se liberan todos los objetos creados
        FREE OBJECT libro.
        FREE OBJECT libros_trabajo.
        FREE OBJECT ventana.
        FREE OBJECT ole_sheet.
        FREE OBJECT rango.
        FREE OBJECT ole_sheets.
        FREE OBJECT ole_datasheet.
        FREE OBJECT hoja_excel.
        FREE OBJECT excel.
        Espero q esta info te sirva y si tienes alguna otra duda, intentaremos ayudarte
        Jaime Zegarra V.
        ________________
        ABAP Developer

        Comentario

        Trabajando...