gifts2017

Новичкам: Простой способ считать данные из экселя.

Опубликовал Роман Уничкин (unichkin) в раздел Программирование - Практика программирования

Простой и действенный способ считать данные из файла *.xls, пересохранив его в *.csv.

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

Придумался очень простой способ: просто сохранить ексель как csv - файл, и считывать данные оттуда, построчно используя ";" в качестве разделителя ячеек.

Этот способ идеально как мне кажется подойдет начинающему, если надо быстро считать данные с экселя. Кроме того, (по моему скромному мнению) распарсить и загрузить текстовичок - проще и быстрее чем возиться с функциями экселя, или даже Йокселя.

А это для тех, кто не знает что такое "*.csv".

//======================================================================
Процедура ЗагрузитьФайл(ИмяФайла)
    АдресВремКаталога = КаталогИБ() + "Temp";
    прИмяВремФайла = АдресВремКаталога + ИмяФайла +"_temp.txt";
    Попытка
        Эксель = СоздатьОбъект("Excel.Application");
        Книга = Эксель.Workbooks.Open(Адрес);
        
        Попытка
            Лист = Книга.Worksheets("Sheet1");
        Исключение
            стрОшибка = "Ошибка открытия листа ""Sheet1"" книги экселя, в файле - " + ИмяФайла + ";
        КонецПопытки;

        Эксель.DisplayAlerts = 0; //Отключаем собщения экселя.
        Книга.SaveAs(прИмяВремФайла, 6); //Сохраняем файл *.xls в формат *.csv
        Книга.Close(0);//закрываем книгу
        Эксель.Quit(); //закрываем эксель
    Исключение
        
        Попытка
            Эксель.Quit(); //если ошибка загрузки связана с чем-то кроме того, что нет екселя, то текущую копию надо закрыть.
            //иначе останется процесс.
        Исключение
        КонецПопытки;
        
        Сообщить("Критическая ошибка: " + Строка(ОписаниеОшибки()) + ", вероятно не установлен ексель...", "!!!");
        Возврат;
    КонецПопытки;

    ЗагрузитьТекстовыйФайл(прИмяВремФайла); //обрабатываем текстовый файл    
КонецПроцедуры // ЗагрузитьФайл

ИмяФайла = "D:\1.xls"; //Что грузим
ЗагрузитьФайл(ИмяФайла);

См. также

Подписаться Добавить вознаграждение

Комментарии

1. 1с-программы.com (ZLENKO) 12.09.12 15:19
А если на компьютере нет Excel ?
2. zhuravlik (unichkin) 13.09.12 00:15
Тогда Йоксель. Если вопрос адресован в сторону озвученной здесь проблемы с получением даты, то вероятно можно как-то поизвращаться с ADO (я никогда его не использовал, не было нужды). Хочу предупредить другие возможные вопросы: я не хочу сказать, что этот метод самый правильный. Но он самый простой)
3. Алекс Ю (AlexO) 13.09.12 00:27
И чем способ простой?
Тем, что в txt далеко не все можно сохранить из структуры xls?
Тем, что лучше настроится на столбцы и читать из xls сразу, чем каждый раз подстраивать загрузку из txt?
4. zhuravlik (unichkin) 13.09.12 01:05
1. Простой для понимания
2. Не большой спец в структуре екселя, и того что оттуда можно, а что нельзя сохранить, однако если вы говорите про изображения - полностью согласен. Я конечно только по себе сужу, а опыта у меня все же маловато, но до сих пор ни разу не понадобилось загружать картинки из экселя. А простые типы данны - число, строка, дата - вполне.
3. Не факт. У меня вот очень просто убиралась шапка. Цикл по строчкам, и СтрЧислоВхождений(стр, ";") - при условии, что заранее известна ширина табличной части.
"Настроиться на столбцы" - это значит организовать по ним цикл. Методами Excell.Application. Делать условия на количество заполненных ячеек, и т.п. Много писанины, да еще такой, что надо поискать литературу, скачать пару обработок с инфостарта (таких например - просто отличная штука). Сам когда начинал все время на это тратил время. А нужно-то было всего-ничего - организовать загрузку простых xls-ок в справочник. И если бы я ТОГДА знал о таком способе, как этот, это сняло бы несколько проблем. Почему собственно и решил сделать такую статью, рассудив что помогло бы мне, может помочь и другим.
5. Алексей Роза (DoctorRoza) 13.09.12 10:01
6. Эдуард Зелинский (VasMart) 19.09.12 11:43
7. Роман Романов (romansun) 19.09.12 12:44
(2) попробуйте как-нить АДО - очень вкусный и совсем не сложный метод. Работает очень быстро, плюс можно писать запросы для выборки только нужных данных их файла

зы. ну а миста, да, очень дружелюбна ))
8. zhuravlik (unichkin) 20.09.12 02:47
(7) "Я не трус, но я боюсь"))) Пока надобности нет, не хочу туда лезть. Многому еще надо научиться, сейчас пытаю прямые запросы) Миста - это вообще самый лучший, да и наверное единственный такой форум по 1С. Мне там столько раз помогали, что слов нет, одни благодарности. А насчет дружелюбности - их вполне можно понять. Если бы я каждый день обьяснял кому-нибудь таблицу умножения...))
Понятное дело, если просить сделать за тебя твою работу, над тобой будут заслуженно глумится. Но даже с такой постановкой вопроса - так или иначе помогут. В общем, Миста - 4ever)
9. Александр Лапшин (zfilin) 20.09.12 11:02
ADO наш выбор. Удобно, быстро, надежно. Не шипит, не пенится, не пригорает.
10. Данила Елистратов (CagoBHuK) 21.09.12 13:06
Не пригодится. То же самое ищется в гугле на первой же странице. Если человек не программист, то и в код ему соваться не следует. А любой нормальный программист адаптирует примеры любой платформы под 1С самостоятельно.
11. zhuravlik (unichkin) 21.09.12 20:21
(10) Ссылочкой не поделитесь?))
Жаль только, что "нормальных" не так уж и много.
И жаль, что нормальными спецами - не рождаются. В код соваться не следует?
=)))))))))))
И вообще хватит тут спорить, пригодится - не пригодиться. Пригодиться. Кому надо. А кому не надо - его личное мнение. Кому-то кстати уже пригодилось.
12. Сергей Валутин (Bacemo) 21.09.12 20:34
А поставил даже +. Может кому-то и пригодится
13. Firuz Mavlonov (firuzji) 22.09.12 22:41
Тоже ставлю "+". Молодец, все просто и генеально.
14. dndw dndw (dndw) 12.04.13 19:42
каким образом можно загрузить в табличную часть документа "оприходование товаров" из xls, xml или напрямую из базы. Возникла проблема с переносом остатков.
15. zhuravlik (unichkin) 12.04.13 20:11
(14) dndw, Это что? Ты веткой не ошибся? Или спамим потихоньку?
16. Константин Юрин (kostyaomsk) 17.12.14 08:42
100 раз применял многие версии чтения из Екселя. Сейчас быстро понадобилась и случано попался уже знакомый фрагмент. Надо все-таки не разбрасываться своими же наработками, а как-то хранить.
17. Константин Юрин (kostyaomsk) 17.12.14 08:57
Да, забыл добавить. Этот метод требует установки Екселя на том ПК, где требуется запуск и чтение. Так что насчет клиент-серверного режима и просто переносимых обработок, имеющих в своем составе различные .dll нужно учесть.
Большой плюс за метод "глушения" (всем неохота читать документацию):
Эксель.DisplayAlerts = 0; //Отключаем собщения экселя.

И еще один важный момент. Метод закрытия COM-объекта "Excel.Application" часто не срабаывает и данные процессы остаются висеть до сброса или перезагруки:
Эксель.Quit(); //закрываем эксель

Критично при периодическом чтении регламентным заданием. Уже и ноль в параметре писали и булево.
18. zhuravlik (unichkin) 17.12.14 13:11
(17) kostyaomsk, про "Эксель.Quit()" - если не срабатывает, это не повод не применять. Если выбрасывает исключение, то его нужно обработать. Было такое, что при использовании вместо "Эксель.Quit( )" конструкции типа"Эксель = 0", объект ExcelApplication оставался висеть в памяти.
19. zhuravlik (unichkin) 17.12.14 13:14
(17) kostyaomsk, "Этот метод требует установки Екселя " - мне казалось, это и так всем ясно. Дам наводку, если Excell нет, смотреть сюда - http://infostart.ru/public/163640/ )
kostyaomsk; +1 Ответить 1
20. Константин Юрин (kostyaomsk) 17.12.14 13:20
(19) zhuravlik, спасибо. Вспомнил этот метод где можно запросами к листу экселя обращаться. Мы их в свое время все перепробовали работая в ИТ-отделе. Ну работает и работает. Сейчас что-то нужно всегда на готове держать.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа