SAP R/3 форум ABAP консультантов
Russian ABAP Developer's Club

Home - FAQ - Search - Memberlist - Usergroups - Profile - Log in to check your private messages - Register - Log in - English
Blogs - Weblogs News

Автоподбор высоты в Excel


Goto page 1, 2  Next
 
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP
View previous topic :: View next topic  
Author Message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 3:36 pm    Post subject: Автоподбор высоты в Excel Reply with quote

Создаю таблицу в Excel.
Надо некоторые строки сделать с оптимальной высотой, т.е. высотой длинейшего текста (текст расположен вертикально).
Написал следующее:
Code:
FORM set_height  USING  range_top_1 TYPE i
                                  range_left_1 TYPE i
                                  range_top_2 TYPE i
                                  range_left_2 TYPE i.
                                 
  DATA:
    o_cells     TYPE ole2_object,
    o_sheet     TYPE ole2_object,
    o_start     TYPE ole2_object,
    o_end       TYPE ole2_object,
    o_row       TYPE ole2_object,
    o_selection TYPE ole2_object,
    o_range     TYPE ole2_object.

  CALL METHOD OF h_excel 'Cells' = o_cells.
  CALL METHOD OF o_cells 'Select'.
  CALL METHOD OF h_excel 'ActiveSheet' = o_sheet.

*** Start
  CALL METHOD OF o_sheet 'Cells' = o_start
    EXPORTING
    #1 = range_top_1
    #2 = range_left_1.

*** End
  CALL METHOD OF o_sheet 'Cells' = o_end
    EXPORTING
    #1 = range_top_2
    #2 = range_left_2.

  CALL METHOD OF o_sheet 'range' = o_range
    EXPORTING
    #1 = o_start
    #2 = o_end.

  CALL METHOD OF o_range 'Select'.
  CALL METHOD OF h_excel 'Selection' = o_selection.
  GET PROPERTY OF o_range 'Rows' = o_row.

  CALL METHOD OF o_row 'AutoFitHeight'.

*** FREE
  FREE OBJECT: o_cells,
               o_sheet,
               o_start,
               o_end,
               o_row,
               o_selection,
               o_range.

ENDFORM.                    " SET_HEIGHT


AutoFitHeight не срабатывает.
Если делать по аналогии с этим кодом оптимальную ширину столбца, используя
CALL METHOD OF o_column 'Autofit'.
то все нормально...
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Feb 04, 2008 4:18 pm    Post subject: Reply with quote

После вызова
CALL METHOD OF o_row 'AutoFitHeight'.
sy-subrc чему равен?

Если <> 0, вероятно такого метода не существует у этого объекта. Подверьтесь на http://support.microsoft.com


Upd: и правда нет.
Попробуйте так, не забывая сделать явный или не явный flush до удаления объектов.

Code:
  GET PROPERTY OF o_range 'Rows' = o_row.
  CALL METHOD OF o_row 'AutoFit'.

* неявный flush
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
           TEXT       = 'ok'
       EXCEPTIONS
            OTHERS     = 1.

*** FREE
  FREE OBJECT: o_cells,
               o_sheet,
               o_start,
               o_end,
               o_row,
               o_selection,
               o_range.
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 4:35 pm    Post subject: Reply with quote

Да, жаль, но похоже нет такого...
А может кто-то знает каким методом сделать оптимизацию высоты строки?
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Feb 04, 2008 4:48 pm    Post subject: Reply with quote

Тык чем не устраивает, как я написал? Нормально подгоняет по высоте текст, развернутый по вертикали.
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 5:29 pm    Post subject: Reply with quote

У меня так не срабатывает...
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Feb 04, 2008 6:25 pm    Post subject: Reply with quote

Может о разном говорим.
Запускаю код.
Когда останавливается на BREAK-POINT, форматирую ячейки, как на первой картинке.
Продолжаю выполнение и получаю состояние, как на второй картинке.

Code:
REPORT Z_VGA_EXCEL NO STANDARD PAGE HEADING.
* this report demonstrates how to send some ABAP data to an
* EXCEL sheet using OLE automation.
INCLUDE OLE2INCL.
* handles for OLE objects
DATA: H_EXCEL TYPE OLE2_OBJECT,        " Excel object
      H_MAPL TYPE OLE2_OBJECT,         " list of workbooks
      H_MAP TYPE OLE2_OBJECT,          " workbook
      H_ZL TYPE OLE2_OBJECT,           " cell
      H_F TYPE OLE2_OBJECT.            " font
TABLES: SPFLI.
DATA  H TYPE I.
* table of flights
DATA: IT_SPFLI LIKE SPFLI OCCURS 10 WITH HEADER LINE.

*&---------------------------------------------------------------------*

*&   Event START-OF-SELECTION
*&---------------------------------------------------------------------*

START-OF-SELECTION.
* read flights
  SELECT * FROM SPFLI INTO TABLE IT_SPFLI UP TO 10 ROWS.
* display header
  ULINE (61).
  WRITE: /     SY-VLINE NO-GAP,
          (3)  'Flg'(001) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
          (4)  'Nr'(002) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
          (20) 'Von'(003) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
          (20) 'Nach'(004) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP,
          (8)  'Zeit'(005) COLOR COL_HEADING NO-GAP, SY-VLINE NO-GAP.
  ULINE (61).
* display flights
  LOOP AT IT_SPFLI.
  WRITE: / SY-VLINE NO-GAP,
           IT_SPFLI-CARRID COLOR COL_KEY NO-GAP, SY-VLINE NO-GAP,
           IT_SPFLI-CONNID COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
           IT_SPFLI-CITYFROM COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
           IT_SPFLI-CITYTO COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP,
           IT_SPFLI-DEPTIME COLOR COL_NORMAL NO-GAP, SY-VLINE NO-GAP.
  ENDLOOP.
  ULINE (61).
* tell user what is going on
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
*           PERCENTAGE = 0
           TEXT       = TEXT-007
       EXCEPTIONS
            OTHERS     = 1.
* start Excel
  CREATE OBJECT H_EXCEL 'EXCEL.APPLICATION'.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_EXCEL  'Visible' = 1.
  PERFORM ERR_HDL.
* tell user what is going on
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
*           PERCENTAGE = 0
           TEXT       = TEXT-008
       EXCEPTIONS
            OTHERS     = 1.
* get list of workbooks, initially empty
  CALL METHOD OF H_EXCEL 'Workbooks' = H_MAPL.
  PERFORM ERR_HDL.
* add a new workbook
  CALL METHOD OF H_MAPL 'Add' = H_MAP.
  PERFORM ERR_HDL.
* tell user what is going on
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
*           PERCENTAGE = 0
           TEXT       = TEXT-009
       EXCEPTIONS
            OTHERS     = 1.

* output column headings to active Excel sheet
  PERFORM FILL_CELL USING 1 1 1 'Flug'(001).
  PERFORM FILL_CELL USING 1 2 1 'Nr'(002).
  PERFORM FILL_CELL USING 1 3 1 'Von'(003).
  PERFORM FILL_CELL USING 1 4 1 'Nach'(004).
  PERFORM FILL_CELL USING 1 5 1 'Zeit'(005).

DATA: range_top_1 TYPE i VALUE 1,
      range_left_1 TYPE i VALUE 1,
      range_top_2 TYPE i VALUE 1,
      range_left_2 TYPE i VALUE 1.

  DATA:
    o_cells     TYPE ole2_object,
    o_sheet     TYPE ole2_object,
    o_start     TYPE ole2_object,
    o_end       TYPE ole2_object,
    o_row       TYPE ole2_object,
    o_selection TYPE ole2_object,
    o_range     TYPE ole2_object.

  CALL METHOD OF h_excel 'Cells' = o_cells.
  CALL METHOD OF o_cells 'Select'.
  CALL METHOD OF h_excel 'ActiveSheet' = o_sheet.

*** Start
  CALL METHOD OF o_sheet 'Cells' = o_start
    EXPORTING
    #1 = range_top_1
    #2 = range_left_1.

*** End
  CALL METHOD OF o_sheet 'Cells' = o_end
    EXPORTING
    #1 = range_top_2
    #2 = range_left_2.

  CALL METHOD OF o_sheet 'range' = o_range
    EXPORTING
    #1 = o_start
    #2 = o_end.

  CALL METHOD OF o_range 'Select'.
  CALL METHOD OF h_excel 'Selection' = o_selection.

  BREAK-POINT.

  GET PROPERTY OF o_range 'Rows' = o_row.

  CALL METHOD OF o_row 'AutoFit'.

* tell user what is going on
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
*           PERCENTAGE = 0
           TEXT       = TEXT-009
       EXCEPTIONS
            OTHERS     = 1.

*** FREE
  FREE OBJECT: o_cells,
               o_sheet,
               o_start,
               o_end,
               o_row,
               o_selection,
               o_range.

* disconnect from Excel
  FREE OBJECT H_EXCEL.
  PERFORM ERR_HDL.

*---------------------------------------------------------------------*
*       FORM FILL_CELL                                                *
*---------------------------------------------------------------------*
*       sets cell at coordinates i,j to value val boldtype bold       *
*---------------------------------------------------------------------*
FORM FILL_CELL USING I J BOLD VAL.
  CALL METHOD OF H_EXCEL 'Cells' = H_ZL EXPORTING #1 = I #2 = J.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_ZL 'Value' = VAL .
  PERFORM ERR_HDL.
  GET PROPERTY OF H_ZL 'Font' = H_F.
  PERFORM ERR_HDL.
  SET PROPERTY OF H_F 'Bold' = BOLD .
  PERFORM ERR_HDL.
ENDFORM.
*&---------------------------------------------------------------------*

*&      Form  ERR_HDL
*&---------------------------------------------------------------------*

*       outputs OLE error if any                                       *

*----------------------------------------------------------------------*

*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*

FORM ERR_HDL.
IF SY-SUBRC <> 0.
  WRITE: / 'Fehler bei OLE-Automation:'(010), SY-SUBRC.
  STOP.
ENDIF.
ENDFORM.                    " ERR_HDL



excel_before.PNG
 Description:
До форматирования
 Filesize:  13.66 KB
 Viewed:  21677 Time(s)

excel_before.PNG



excel_after.PNG
 Description:
После форматирования
 Filesize:  12.79 KB
 Viewed:  21673 Time(s)

excel_after.PNG




Last edited by vga on Mon Feb 04, 2008 6:35 pm; edited 1 time in total
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 6:30 pm    Post subject: Reply with quote

Ну ладно, буду пока без автовысоты...
А вот еще вопрос. Я открываю уже готовый экселевский файл с шапкой и хочу вставить в него таблицу после шапки. С этим проблемы нет.
Потом я хочу пересохранитьэтот файл но под другим именем. И тут что-то у меня не выходит...

Code:
*------------------------------ start Excel
  CREATE OBJECT h_excel 'EXCEL.APPLICATION'.
  SET PROPERTY OF h_excel  'Visible' = 1. 

  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
           text       = 'Open new folder ...'
       EXCEPTIONS
            OTHERS     = 1.

*------------------------------ get list of workbooks, initially empty
  CALL METHOD OF h_excel 'Workbooks' = h_mapl.

*------------------------------ Insert table...
....

CALL METHOD OF h_excel 'FILESAVEAS'                 
EXPORTING
        #1 = f_name.
    ENDIF.

CALL METHOD OF h_excel 'Quit'.
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Feb 04, 2008 6:49 pm    Post subject: Reply with quote

Та же ошибка, объект h_excel не имеет метода 'FILESAVEAS'.
Это метод листа (sheet).

Вот такой код пробегал:
Code:
 CREATE OBJECT H_EXCEL    'EXCEL.APPLICATION'.
  SET PROPERTY OF H_EXCEL  'Visible' = 1.
  CALL METHOD OF H_EXCEL   'Workbooks' = H_MAP.

  CALL METHOD OF H_MAP 'Open'
    EXPORTING
    #1 = 'C:\file1.XLS'.

  CALL METHOD OF H_EXCEL 'ACTIVESHEET' = H_SHEET.

  CALL METHOD OF H_SHEET 'SaveAs'
    EXPORTING
    #1 = 'C:\file2.XLS'.

  CALL METHOD OF H_EXCEL 'Quit'.
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 7:13 pm    Post subject: Reply with quote

точно, исправил, сохраняется...

А с автовысотой непонятно... Все то же делаю - но не пашет.
На картинке 1 - вид до запуска программы, на картинке 2 - после

Почему-то текст весь не показывается


Last edited by cbw07 on Mon Feb 04, 2008 7:17 pm; edited 1 time in total
Back to top
View user's profile Send private message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 7:14 pm    Post subject: Reply with quote

ДО:


1.jpg
 Description:
1
 Filesize:  12.34 KB
 Viewed:  21663 Time(s)

1.jpg


Back to top
View user's profile Send private message
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Mon Feb 04, 2008 7:15 pm    Post subject: Reply with quote

ПОСЛЕ:


2.jpg
 Description:
2
 Filesize:  10.75 KB
 Viewed:  21662 Time(s)

2.jpg


Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Mon Feb 04, 2008 9:40 pm    Post subject: Reply with quote

Не пробовали шрифт другой выбрать? Например, моноширинный.
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Tue Feb 05, 2008 1:44 pm    Post subject: Reply with quote

попробую, только скажите как точно он называется.

И еще, не подскажете как сделать, чтобы в таблице все клеточки были в обрамлении?

когжа выбираю область, то делаю обрамление всей области через
Code:
  CALL METHOD OF o_range 'BorderAround'
    EXPORTING
    #1 = 1.


А мне надо еще и то, что внутри, разлиновать...
Не делать же поклеточный цикл...


Last edited by cbw07 on Tue Feb 05, 2008 2:13 pm; edited 1 time in total
Back to top
View user's profile Send private message
vga
Мастер
Мастер


Age: 195
Joined: 04 Oct 2007
Posts: 1218
Location: Санкт-Петербург

PostPosted: Tue Feb 05, 2008 2:08 pm    Post subject: Reply with quote

1) Courier
2) Для ячейки свойства border нужно задать http://www.sapnet.ru/viewtopic.php?t=453
Back to top
View user's profile Send private message Blog Visit poster's website
cbw07
Старший специалист
Старший специалист



Joined: 30 Nov 2007
Posts: 127

PostPosted: Tue Feb 05, 2008 2:33 pm    Post subject: Reply with quote

Code:
  SET PROPERTY OF h_zl 'Border' = 1.
  CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
     EXPORTING
           text       = 'Border'
     EXCEPTIONS
            OTHERS     = 1.

я пробовал, но почему-то не рисует
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Russian ABAP Developer's Club Forum Index -> ABAP All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG.
SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG.
Every effort is made to ensure content integrity. Use information on this site at your own risk.