Текущее время: Ср, июл 23 2025, 02:11

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Ср, дек 07 2011, 14:49 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
В порядке эксперимента смастерил пример с использованием по OLE2 ActiveX'а MSScriptControl. Значения ячеек читаются прямо с листа Excel, собираются в длинную-предлинную строку с заданным разделителем, строка передается в SAP и при помощи команды SPLIT укладывается во внутреннюю таблицу. Из-за использования string, к сожалению, алгоритм подойдёт только для последних версий SAP.

Перед исполнением report'а нужно сначала при помощи следующего макроса VBA создать тестовый файл Excel, содержащий 10 произвольных именнованных ячеек, заполненных строками максимальной длины - из 32767 символов:
Code:
Sub PrepareData()
    Dim r As Integer, c As Integer, i As Integer
    Dim cell As Range, str As String
    For i = 1 To 10 'создаем 10 именованных ячеек (случайным образом)
        r = Int(20 * Rnd) + 1
        c = Int(10 * Rnd) + 1
        Set cell = Cells(r, c)
        cell.Interior.ColorIndex = 36 'жёлтая заливка ячейки для наглядности
        cell.Name = "Моя_ячейка_" & i 'дадим имя "Моя_ячейка_..."
        cell.Value = String(32767, i + 64) 'заполним латинской буквой (начиная с A - код 65)
    Next i
End Sub

Файл Excel надо сохранить на диске под желаемым именем и прописать полное имя файла в соответствующей переменной в следующем report'е:
Code:
REPORT zzzzzzz.

TYPE-POOLS ole2.

DATA sc     TYPE ole2_object.
DATA vbcode TYPE string.
DATA idx    TYPE string.

DATA excel_filename   TYPE string VALUE 'C:\KKu\Книга2.xlsx'.
DATA name_list        TYPE string.
DATA name_separator   TYPE string VALUE '~'. "здесь не использовать пробел как разделитель
DATA value_separator  TYPE string VALUE '-~|~-'.

DATA long_string_from_excel TYPE string.
DATA itab_values_from_excel TYPE TABLE OF string.

START-OF-SELECTION.

  CONCATENATE
  'Моя_ячейка_1' name_separator
  'Моя_ячейка_2' name_separator
  'Моя_ячейка_3' name_separator
  'Моя_ячейка_4' name_separator
  'Моя_ячейка_5' name_separator
  'Моя_ячейка_6' name_separator
  'Моя_ячейка_7' name_separator
  'Моя_ячейка_8' name_separator
  'Моя_ячейка_9' name_separator
  'Моя_ячейка_10'
  INTO name_list.

  CONCATENATE
  'Function GetExcelData(excelFilename, nameList, nameSeparator, valueSeparator)'
  '    Dim xlApp, wks, nameArray, i, retString'
  '    Set xlApp = CreateObject("Excel.Application")'
  '    Set wks = xlApp.Workbooks.Open(excelFilename).Worksheets(1)'
  '    nameArray = Split(nameList, nameSeparator)'
  '    For i = LBound(nameArray) To UBound(nameArray)'
  '        retString = retString & CStr(wks.Range(CStr(nameArray(i))).Value) & valueSeparator'
  '    Next'
  '    retString = Left(retString, Len(retString) - Len(valueSeparator))'
  '    wks.Parent.Close False'
  '    Set wks = Nothing'
  '    xlApp.Quit'
  '    Set xlApp = Nothing'
  '    GetExcelData = retString'
  'End Function'
  INTO vbcode
  SEPARATED BY cl_abap_char_utilities=>cr_lf.

  CREATE OBJECT sc 'MSScriptControl.ScriptControl' NO FLUSH.
  SET PROPERTY OF sc 'Language' = 'vbscript' no flush.
  CALL METHOD OF sc 'AddCode' NO FLUSH
    EXPORTING #1 = vbcode.
  CALL METHOD cl_gui_cfw=>flush.

  CALL METHOD OF sc 'Run' = long_string_from_excel NO FLUSH
    EXPORTING #0 = 'GetExcelData'
    #1 = excel_filename
    #2 = name_list
    #3 = name_separator
    #4 = value_separator.
  CALL METHOD cl_gui_cfw=>flush.

  FREE OBJECT: sc.

  SPLIT long_string_from_excel AT value_separator
    INTO TABLE itab_values_from_excel.

  WRITE: / name_list.

Подробнее о подходе можно посмотреть в моем сообщении здесь: Поговорим об MS Script Control (правда, в контексте другого продукта).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Ср, фев 05 2014, 11:17 
Ассистент
Ассистент

Зарегистрирован:
Чт, июн 08 2006, 07:39
Сообщения: 30
Привет

подскажи пожалуйста как загрузить таблицу из 5 колонок содержащую 65000 строк с помощью твоего способа.

Вопрос возник: каждую отдельную ячейку нужно именовать ?
или можно задать колонку для именованной переменной (например Мой столбец 1 и задать диапозон =Лист2!A1:A65000 ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Ср, фев 05 2014, 19:22 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
avontime написал(а):
подскажи пожалуйста как загрузить таблицу из 5 колонок содержащую 65000 строк

Для этого можно использовать текстовый файл и LSMW. Зачем для этого Excel?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Вт, фев 11 2014, 19:09 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
avontime написал(а):
подскажи пожалуйста как загрузить таблицу из 5 колонок содержащую 65000 строк с помощью твоего способа.

Сваял демонстрашку. Чисто в порядке "экспериментального юмора". Сам сейчас в своих разработках, эксплуатирующихся в продуктиве, пользуюсь несколько иным подходом, а именно: файл Excel невидимо от пользователя сохраняется во временный текстовый файл, а дальше обычный GUI_UPLOAD (фм или метод). У пользователя же полная иллюзия, что он грузится из Ёкселя. Ну что делать, ну любят они Excel. Сам люблю.

В примере информация из Excel банально передается через гигантскую текстовую строку с разделителями, формируемую на стороне Excel и разбираемую на стороне SAP.

Имеется интересное поле для экспериментов: подбор оптимального размера передаваемой строки. Собрать сначала сразу все 65000 строк x 5 столбцов в Excel, а потом сразу столько же разбирать в ABAP у меня не получилось. Процесс затянулся на многие минуты, и я был вынужден срубить его. Передавать по одной строке Excel или, упаси Боже, по одной ячейке - совсем кисло, зашкалит количество OLE-вызовов. Беглые прикидки остановили меня (для данной конкретной задачи!) на размере партии 200 строк (по 5 колонок). Итого 1000 значений в одной передаваемой строке. Данные из диапазона Excel A1:E65000 оказались во внутренней таблице ABAP примерно через 12 секунд.

Значения в файле Книга3.xls нагенерил при помощи формулы от "col A row 1" до "col E row 65000". Формула: ="col " & ИНДЕКС({"A";"B";"C";"D";"E"}; СТОЛБЕЦ()) & " row " & СТРОКА()
Code:
REPORT  zzzzzzz_ver2.

TYPE-POOLS ole2.

DATA sc     TYPE ole2_object.
DATA vbcode TYPE string.

DATA excel_filename   TYPE string VALUE 'C:\KKu\Книга3.xls'.

DATA long_string_from_excel TYPE string.
DATA itab_values_from_excel TYPE TABLE OF string.
DATA itab_allrows_from_excel TYPE TABLE OF string.

DATA: BEGIN OF wa_allcells,
        col_a TYPE string,
        col_b TYPE string,
        col_c TYPE string,
        col_d TYPE string,
        col_e TYPE string,
      END OF wa_allcells,
      it_allcells LIKE STANDARD TABLE OF wa_allcells.

DATA range_address TYPE string VALUE 'A1:E65000'.
DATA row_separator TYPE string VALUE '~/|\~'. "вместо "стандартного" CR-LF
DATA col_separator TYPE string VALUE '~|='.   "вместо "стандартного" TAB

DATA rows_in_part TYPE i VALUE 200. "размер (кол-во строк) "партии"
DATA row_offset TYPE i.

START-OF-SELECTION.

  CONCATENATE
  'Option Explicit'

  'Dim xlApp, rngAll, wbk, varArray, retString'
  'Dim rowSeparator, colSeparator, allRowLast'

  'Sub beforeLoop(fileName, rngAddr, rowSep, colSep)'
  '    Set xlApp = CreateObject("Excel.Application")'
  '    Set rngAll = xlApp.Workbooks.Open(fileName).Application.Range(rngAddr)'
  '    allRowLast = rngAll.Row + rngAll.Rows.Count - 1'
  '    rowSeparator = rowSep'
  '    colSeparator = colSep'
  'End Sub'

  'Sub afterLoop()'
  '    Set rngAll = Nothing'
  '    For Each wbk In xlApp.Workbooks'
  '        wbk.Close False'
  '    Next'
  '    Set wbk = Nothing'
  '    xlApp.Quit'
  '    Set xlApp = Nothing'
  'End Sub'

  'Function GetExcelData2(rowOffset, rowsNumber)'
  '    Dim rngPart, partRowFirst, partRowLast, i, j'

  '    partRowFirst = rngAll.Row + rowOffset'
  '    If partRowFirst > rngAll.Parent.Rows.Count Then'
  '        GetExcelData2 = ""'
  '        Exit Function'
  '    End If'
  '    partRowLast = xlApp.WorksheetFunction.Min(partRowFirst + rowsNumber - 1, allRowLast, rngAll.Parent.Rows.Count)'
  '    If partRowLast >= partRowFirst Then'
  '        Set rngPart = rngAll.Resize(partRowLast - partRowFirst + 1).Offset(rowOffset)'
  '    Else'
  '        GetExcelData2 = ""'
  '        Exit Function'
  '    End If'

  '    varArray = rngPart.Value'

  '    retString = ""'
  '    For i = 1 To UBound(varArray, 1)'
  '        For j = 1 To UBound(varArray, 2)'
  '            retString = retString & CStr(varArray(i, j)) & colSeparator'
  '        Next'
  '        retString = Left(retString, Len(retString) - Len(colSeparator))'
  '        retString = retString & rowSeparator'
  '    Next'
  '    GetExcelData2 = Left(retString, Len(retString) - Len(rowSeparator))'
  'End Function'
  INTO vbcode
  SEPARATED BY cl_abap_char_utilities=>cr_lf.

  CREATE OBJECT sc 'MSScriptControl.ScriptControl' NO FLUSH.
  SET PROPERTY OF sc 'Timeout' = -1 no flush.
  SET PROPERTY OF sc 'Language' = 'vbscript' no flush.
  CALL METHOD OF sc 'AddCode' NO FLUSH
    EXPORTING #1 = vbcode.

  CALL METHOD OF sc 'Run' NO FLUSH
    EXPORTING #0 = 'beforeLoop'
    #1 = excel_filename
    #2 = range_address
    #3 = row_separator
    #4 = col_separator.
  CALL METHOD cl_gui_cfw=>flush.

  DO 325 TIMES.
    row_offset = ( sy-index - 1 ) * rows_in_part.

    CLEAR long_string_from_excel.
    CALL METHOD OF sc 'Run' = long_string_from_excel "NO FLUSH
      EXPORTING #0 = 'GetExcelData2'
      #1 = row_offset
      #2 = rows_in_part.

    SPLIT long_string_from_excel AT row_separator
      INTO TABLE itab_values_from_excel.

    APPEND LINES OF itab_values_from_excel TO itab_allrows_from_excel.

  ENDDO.

  CALL METHOD OF sc 'Run' "NO FLUSH
    EXPORTING #0 = 'afterLoop'.

  FREE OBJECT: sc.

  LOOP AT itab_allrows_from_excel INTO long_string_from_excel.
    SPLIT long_string_from_excel
      AT col_separator INTO wa_allcells-col_a
                            wa_allcells-col_b
                            wa_allcells-col_c
                            wa_allcells-col_d
                            wa_allcells-col_e.
    APPEND wa_allcells TO it_allcells.
  ENDLOOP.

  WRITE: / 'Процесс закончен'.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 01:08 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, авг 18 2010, 15:38
Сообщения: 97
http://scn.sap.com/community/abap/blog/ ... -from-abap
никаких вам ограничений...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 09:32 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
arcanist написал(а):
http://scn.sap.com/community/abap/blog/2010/09/06/xlsx2abap--read-and-edit-your-excel-files-from-abap
никаких вам ограничений...

Вы хоть читали тему письма?
upd: снимаю вопрос :roll:

_________________
С уважением,
Удав.


Последний раз редактировалось Удав Чт, фев 20 2014, 12:51, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 09:42 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
arcanist написал(а):
http://scn.sap.com/community/abap/blog/2010/09/06/xlsx2abap--read-and-edit-your-excel-files-from-abap
никаких вам ограничений...

Не понял, пардон, НИ ХРЕНА! Пост напичкан ссылками, ведущими на похожие статьи на других ресурсах. И одна вода (( Причем, люди в комментах пытаются достучаться до автора в плане "Где же можно код посмотреть?" А он их по кругу водит, по битым ссылкам... Бред какой-то... Там ни то, что "никаких ограничений" - вообще ничего! :D


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 10:35 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Gustav: а спокойствием и умением пользоваться поиском Вас обделили? Вот страница проекта. Я скачивал, устанавливал, тестил. Все работает.
Идея простая: набор классов для работы с новым форматом xlsx как с xml.

Ну и вики на том же scn

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 11:29 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Koder, Вы пользовались abap2xls для загрузки данных из Excel?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 11:49 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Удав: Угу, тестил. Не использовал в прод. работе. 15-ый демо пример в наборе тестовых программ - как раз чтение данных

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Чт, фев 20 2014, 22:31 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, авг 18 2010, 15:38
Сообщения: 97
Я использовал xlsx2abap для чтения Excel файлов в одном небольшом проекте. Работает.
Для генерации файлов в продуктиве дело пока не дошло - уже есть свой фрэймворк.
и да, терпение - великая благодетель :D


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Пн, фев 24 2014, 12:49 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Ну, ладно-ладно, загнобили прямо. Ну, погорячился, признаю. Извините за шум, был неправ! Но я всё равно пока не смог ЭТО запустить, хотя и исправно всё скачал. Видно, либо не разумею серьезных разработок, либо разработка недостаточно "народная", раз такая сложная в обращении...

Тем временем, до кучи, предлагаю еще одну простенькую поделку. Она гораздо более компактная по коду, чем моя предыдущая, хотя и несколько более продолжительная (порядка 30-40 сек против 12) по времени выполнения. На это этот раз с использованием OLE с объектами ADODB:
Code:
REPORT  zzzzzz_v3.

TYPE-POOLS ole2.

DATA:
  excel_filename          TYPE string VALUE `C:\KKu\Книга3.xls`,
  rst_excel               TYPE ole2_object,
  conn_string             TYPE string,
  long_string_from_excel  TYPE string,
  itab_allrows_from_excel TYPE TABLE OF string,
  itab_values_from_excel  TYPE TABLE OF string.

DATA:
  BEGIN OF wa_allcells,
    col_a TYPE string,
    col_b TYPE string,
    col_c TYPE string,
    col_d TYPE string,
    col_e TYPE string,
  END OF wa_allcells,
  it_allcells LIKE STANDARD TABLE OF wa_allcells.

DATA:
  row_separator TYPE string
                VALUE cl_abap_char_utilities=>cr_lf,
  col_separator TYPE string
                VALUE cl_abap_char_utilities=>horizontal_tab.


START-OF-SELECTION.

*  CONCATENATE `Provider=Microsoft.Jet.OLEDB.4.0;`
*              `Data Source=`
*               excel_filename `;`
*              `Extended Properties='Excel 8.0;HDR=No';`
*         INTO conn_string.

  CONCATENATE `Provider=Microsoft.ACE.OLEDB.12.0;`
              `Data Source=`
               excel_filename `;`
              `Extended Properties='Excel 12.0;HDR=No';`
         INTO conn_string.

  CREATE OBJECT rst_excel 'ADODB.Recordset'.
  CALL METHOD OF rst_excel 'Open'
    EXPORTING #1 = `SELECT * FROM [Лист1$A1:E65000]`
              #2 = conn_string.

  CALL METHOD OF rst_excel 'GetString' = long_string_from_excel.

  SPLIT long_string_from_excel AT row_separator(1) "..(1) здесь
    INTO TABLE itab_allrows_from_excel. "в данном конкретном случае
  "для именно этого разделителя по умолчанию - важно!

  LOOP AT itab_allrows_from_excel INTO long_string_from_excel.
    SPLIT long_string_from_excel
      AT col_separator INTO wa_allcells-col_a
                            wa_allcells-col_b
                            wa_allcells-col_c
                            wa_allcells-col_d
                            wa_allcells-col_e.
    APPEND wa_allcells TO it_allcells.
  ENDLOOP.

  WRITE: / 'Процесс закончен'.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Пн, фев 24 2014, 15:20 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, авг 05 2008, 19:46
Сообщения: 96
Откуда: С Урала
Давненько не приходилось загружать данные, но помню что для conn_string из примера Gustav надо определять версию Excel на машине с которой запускается загрузка - разные они для 2003 и 2010. А в свое время я так и получал доступ к данным Excel и еще фильтровал и агрегировал данные. Правда потом в текстовый файл сохранял - тут правда еще засада - при этом надо форматирование ячеек подбирать


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Вт, фев 25 2014, 20:25 
Младший специалист
Младший специалист

Зарегистрирован:
Ср, авг 18 2010, 15:38
Сообщения: 97
Gustav написал:
Но я всё равно пока не смог ЭТО запустить, хотя и исправно всё скачал. Видно, либо не разумею серьезных разработок, либо разработка недостаточно "народная", раз такая сложная в обращении...

а в чем проблема? падает в дамп?
https://github.com/ivanfemia/abap2xlsx/ ... tion-guide читали?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Загрузка большого объема данных из XLS
СообщениеДобавлено: Ср, ноя 19 2014, 17:51 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 28 2008, 10:39
Сообщения: 86
А в фоне такое кто-то делал?

И с сетевым путем к файлу, типа \\khq10\bank$\aaa.xls


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB