Способ работы с большим файлом Excel, так же быстро, как с обычной таблицей (при помощи кэширования).
При первом открытии обработки видим надпись Файл не загружен
Загрузим вот такой файл Excel для примера
Теперь при открытии обработки видим, что файл загружали и дату последней загрузки.
В дальнейшем при открытии обработки можно сразу жать кнопку Выполнить.
Сделал это с помощью выгрузки ТаблицыЗначений в файл и последующего использования этого файла.
По нажатию кнопки обновить:
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Сообщить("Выберите файл для загрузки!");
Возврат;
КонецЕсли;
Док = ПолучитьCOMОбъект(ПутьКФайлу);
НомерЛиста = 1;
ВсегоСтрок = Док.Sheets.Item(НомерЛиста).UsedRange.Rows.Count();
КЧ = Новый КвалификаторыЧисла(10,0);
КС = Новый КвалификаторыСтроки(200);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
Массив.Очистить();
Массив.Добавить(Тип("Число"));
ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
ТЗЕксель = Новый ТаблицаЗначений;
ТЗЕксель.Колонки.Добавить("Наименование",ОписаниеТиповС);
ТЗЕксель.Колонки.Добавить("Количество",ОписаниеТиповЧ);
Для сч = 1 По ВсегоСтрок Цикл
Наименование =СокрЛП(Док.Sheets(НомерЛиста).Cells(сч, 1).Value);
Количество =СокрЛП(Док.Sheets(НомерЛиста).Cells(сч, 2).Value);
НовСтр = ТЗЕксель.Добавить();
НовСтр.Наименование = Наименование;
НовСтр.Количество = Количество;
КонецЦикла;
УдалитьФайлы(ВремХранилище, "*.sel");
ИмяФайла = СтрЗаменить(ТекущаяДата(),":",".");
ЗначениеВФайл(ВремХранилище+ИмяФайла+".sel",ТЗЕксель);
ЭлементыФормы.НадписьФайл.Заголовок = "Файл Excel последний раз обновлялся: " + ИмяФайла;
При открытии:
ВремХранилище = КаталогВременныхФайлов() + "excel";
Файл = Новый Файл(ВремХранилище);
Если Не Файл.Существует() Тогда
СоздатьКаталог(ВремХранилище);
Иначе
МассивНайденных = НайтиФайлы(ВремХранилище, "*.sel");
Если МассивНайденных.Количество() > 0 Тогда
ЭлементыФормы.НадписьФайл.Заголовок = "Файл Excel последний раз обновлялся: " + МассивНайденных[0].ИмяБезРасширения;
ТЗЕксель = ЗначениеИзФайла(ВремХранилище + МассивНайденных[0].Имя);
Иначе
ЭлементыФормы.НадписьФайл.Заголовок = "Файл Excel не загружали!";
КонецЕсли;
КонецЕсли;
По нажатию кнопки Выполнить:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ТЗЕксель.Наименование,
| ТЗЕксель.Количество
|ПОМЕСТИТЬ ВТ
|ИЗ
| &ТЗЕксель КАК ТЗЕксель
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ.Наименование,
| СУММА(ВТ.Количество) КАК Количество
|ИЗ
| ВТ КАК ВТ
|
|СГРУППИРОВАТЬ ПО
| ВТ.Наименование";
Запрос.УстановитьПараметр("ТЗЕксель",ТЗЕксель);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Наименование +" = "+ Выборка.Количество);
КонецЦикла;
Тю… Я-то понадеялся на ADODB…
ерунда какая-то… ладно нет АДОДВ, так можно хотя бы область выгрузить! а не считывать поячеечно документ.
а если колонок 100, а строк 100тыщ ? этот алгоритм будет работать вечно.
ничего быстрого. заголовок не соответствует содержимому.
хм, «(без загрузки в базу данных)»…
а это что?
или надо понимать фразу как «мы же в справочники/документы/регистры не сохраняем» ? 🙂
(2) Gureev, смысл не в том как загрузить ексель в ТаблицуЗначений.
А в том, что загрузить можно всего один раз. А дальше пользоваться уже сохраненной ТаблицейЗначений.
Если XLSX — то его можно безо всяких драйверов читать (на ИС есть примеры прямого чтения) — это ж набор XML, обжатых в ZIP.
А вообще, статью правильнее назвать например «Кэширование читаемых Excel-файлов»…
А как тут минуснуть можно?
Нда… Кэширование входного файла… Это ж только при разработке/отладке один и тот же файл по 20 раз загружаешь… Да и там у меня, например, основные косяки с тем, что из Excel в 1С что-то не так загрузилось, а значит надо файл по новой загружать…
Короче — не могу даже придумать когда ЭТО реально может быть нужно…
(7) mihast, Например когда типовая конфа и она такой должна остаться. Нужно написать дополнительную обработку которая часть данных берет из Excel.