Еще одна загрузка данных из Excel (или как окончательно забыть его методы)


С переодичностью раз в год, на меня падает задача, загрузить что-то эдакое из excel и каждый раз происходит мучительное вспоминание а как создать его COM, как там перебрать ячейки, найти "крайние", разобраться с форматированием… в какой-то момент лень таки победила и подкинула мне идею как перестать вспоминать — а именно: "Почему бы не загрузить файл целиком, в плоскую структуру, и потом просто выбрать данные запросом. Так родился этот справочник, встраиваемый в любую конфигурацию 8.2 c функционалом по загрузке excell файла в свои элементы.

Итак, после загрузки файлов(в форме выбора файлов используете множественный выбор) Вы получаете по одному элементу в справочнике для каждого файла, в табличной части которого, для каждой ячейки есть строка. Для каждой ячейки указано :

  • на каком листе она находится;
  • её координаты — номер строки и колонки в отдельных реквизитов;
  • текст который был в ячейке;
  • сумма или дата, в отдельных колонках, если в процессе загрузки они были распознаны;
  • формула забитая в ячейки;
  • цвет фона или шрифта.

Как мы можем всю эту радость использовать? Вам остается написать запрос который бы выбрал данные в нужной Вам форме и потом обработать результат. Лично я, для одноразовых загрузок использую консоль запроса с обработчиком, для чего-то более менее регулярного приходится накидывать уже более полноценные куски кода. 

 

Во вложении, я к обработке кинул демо excel файл и sel который на примере демо бухгалтерии демонстрирует простоту работы данной методики.

Например, меня очень радует что я могу запросами проверить корректность файлов. Например, что при заполнении бюджета использовали корректные наименования статей затрат из справочника и.т.п.

Теперь немного о минусах:

  • файл грузится целиком, что может увеличивать время обработки — согласитесь, но работать без посредника будет быстрее. На этот аргумент, моя лень чихала. ) говорит что для регулярных обменах, где необходима оперативность надобно работьс xml.
  • для чтения файлов использует COMОбъект(«Excel.Application») соответсвенно, для работы с управляемыми приложениями на сервере(или вашей тачке, клиент таки толстый)  должен быть установлен MS Office. Но! если тема получит адекватный отзыв, моя лень заткнется и я перепишу что-бы читать xlsx напрямую.
В справочнике есть 2 набора форм, для Управляемого и Обычного приложения — устанавливайте по умолчанию как Вам необходимо в зависимости от ситуации.

28 Comments

  1. oberon355

    Очень красивое решение. Класс!!!

    Reply
  2. Yashazz

    Считываете через ADO?

    Reply
  3. DitriX

    Вот мне кажется, что если читать с хмл на прямую, то это было бы шикарно, иначе, как то не ахти.

    Reply
  4. Itilive.ru

    Нет, COM.

    Reply
  5. Itilive.ru

    (3) DitriX,

    спасибо за мнение.

    Reply
  6. _LEV_

    Мне кажется стоит поторговаться со своей совестью и прикрутить чтение файлов xlsx напрямую, не будет напрягов с наличием установленного пакета Office. Думаю, что идея оригинальна для нерегулярных загрузок.

    Reply
  7. Itilive.ru

    (6) _LEV_, Если сделаю, то выставлю за бабки. Так что либо мне либо майкрософту….

    Reply
  8. Itilive.ru

    (8) Ну да… каждый кулик свое болото хвалит… 😉

    Reply
  9. Иваныч

    А вообще автору плюс, т.к в любых идеях можно найти что-либо новое для каждого

    Reply
  10. vasko88

    Согласен — автору плюс. Как человек, допустим, который ищет подобную конкретную разработку, или просто идею, не вижу абсолютно никакого смысла лезть в какую-нибудь здоровую «самописную» подсистему, чтобы выделить в ней из кучи того что мне не нужно, малую толику того что нужно

    Reply
  11. vasko88

    Eugeneer, а среди доработок которые вы привели, есть что-то более «абстрактное», нежели загрузка прайсов?

    Reply
  12. AlX0id

    При наличии Ctrl-C + Ctrl-V из Excel в 1С, имхо, тратить время на написание каких-то там COM-соединений для загрузки пары файлов раз в год — бессмысленно..

    Ежели у вас загрузка по расписанию — еще было бы понятно.. Но для единичных файлов..

    Reply
  13. RomanUzmov

    (15) AlX0id, Что-то вообще не понял Вашего комментария. Каким образом Вы собираетесь перенести данные из Excel в базу 1С, используя буфер обмена?

    Reply
  14. nelse

    Если бы Вы привели только одну функцию поиска в файле Excel нужного вам зачения (find), то

    это решило бы все проблемы. Такой метод/способ ЕСТЬ.

    А так… просто трата времени и ресурсов.

    Сопряжение 1С и Excel давно размусолено до самых последних «битов».

    Уж даже не знаю, что там ещё можно нового найти?

    Ничего личного.

    Reply
  15. nelse

    (16) RomanUzmov,

    «При наличии Ctrl-C + Ctrl-V»

    Это он пошутил.

    Reply
  16. smielka

    1.Не работает в клиент-серверном варианте

    2.Зачем нужен такой способ, если можно сразу обратиться запросом к экселю, считать нужные данные и не хранить их в базе

    Reply
  17. AlX0id

    (16) RomanUzmov,

    Создаете в обработке на форме табличный документ и тупо копируете туда данные Excel. В дальнейшем работаете только с этим табличным документом. Все. Никаких COM-объектов.

    Reply
  18. evrakylon

    На счет красоты решения и целесообразности ради этого внесения изменений в конфу еще можно подумать.

    А ведь всего лишь нужно: 1) Кусок кода для COM подключения 2) Циклом создается ТЗ и заполняется. 3) Обработка таблицы — хоть запросом, хоть чем. При желании это все выносится в шаблон. Выращивать базу элементами с ТЧ в десятки тысяч строк, как это бывает в прайсах, может быть, и не надо.

    Reply
  19. Itilive.ru

    (22) evrakylon, (20) smielka,

    Коллеги, очень хочется потролить, но лень,и еще раз отвечая на вопрос «А НАФИГА???» —

    я не люблю(мне лень) писать код, особенно связанный с выборкой данных. Я люблю запросы, они созданны только именно для этого, я пишу их быстро и с удовольствием.

    Все остальные моменты которые меня радуют даже перечислять не буду. В шапке я упоминал. Решение не универсально, предназначенно для тех кто предпочитает окну конфигуратора консоль запросов + обработка.

    На в клиент сервере работает при наличии на сервере excellя, в моменте — мне проще пойти и заставить админов поставить excell, чем парсить структуру xlsx — уверен вам тоже.

    Решение «As Is» и не претендует «на истину в первой инстанции».

    Спасибо всем кому понравилось.

    Reply
  20. Zas1402
    А вообще автору плюс, т.к в любых идеях можно найти что-либо новое для каждого 

    Согласен, для себя очень многое открыл.

    Reply
  21. eugen91

    Добрый день. А в чем принципиальное отличие от аналогичных ?

    Reply
  22. bxz

    да каждая вторая обработка на инфостарте чтото делает с exceLL !! где загрузка и обработка таблиц из GOOGLE DOCS — я считаю это просто необходимо добавить в это разработку !! АФТАР ДОБАВЬ ПОЖАЛУЙСТА !!!

    Reply
  23. oberon355

    Ну вот, накинулись на человека. А на самом деле идея не лишена изящества.

    Reply
  24. OLga_gab

    Мне тоже хочется на сторону разработчика новой обработки. Ставлю плюс и попробую использовать.

    Reply
  25. mip128

    (26) bxz, Согласен, ваще вот прям!

    Еще считаю нужным загрузки из ДБФ!!!

    Так как меня все бесит!!!

    Reply
  26. svetanik

    (23) Александр Серов, спасибо Александр за обработку, за идею! Можно хранить загруженные файлы (в смысле, из которых была загрузка). Чтобы потом была информация для «разбора полетов», когда, например, после загрузки задваивается номенклатура.

    Reply
  27. lelusha

    А какую-нить демо версию можно сделть бесплатную? или хоть примеры запросов для БД демо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *