Текущее время: Вс, июн 29 2025, 19:25

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 31 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: 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


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

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
vuces написал(а):
И с сетевым путем к файлу, типа \\khq10\bank$\aaa.xls

Ага, и ещё по SFTP :)

_________________
Telegram-chat: PO, CPI-PI, java, groovy


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

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


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

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


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

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