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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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