Быстрая обработка файла эксель средствами 1С
С недавних пор (относительно) 1С умеет загружать файлы эксель в табличный документ. Причём листы раскидывает на области. Обработка идет на удивление быстро, по сравнению со «старым» способом, через COM соединение с Excel.
Вот пример обработки файла:
1.Выбираем файл на «клиенте» и передаем его на «сервер»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
&НаКлиенте Процедура ЗагрузкаПрайса(Команда) Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Фильтр = НСтр("ru = 'Текст'; en = 'Text'")+ "(*.xlsx)|*.xlsx"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Истина; ДиалогОткрытияФайла.Заголовок = "Выберите файл(ы)"; Если ДиалогОткрытияФайла.Выбрать() Тогда МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы; Для Каждого ИмяФайла Из МассивФайлов Цикл ВыбФайл = Новый Файл(ИмяФайла); Сообщить(ИмяФайла+ НСтр("ru = '; Размер = '; en = '; Size = '")+ ВыбФайл.Размер()); АдресВременногоХранилища = ""; ПоместитьФайл(АдресВременногоХранилища, ИмяФайла, , Ложь, ЭтаФорма.УникальныйИдентификатор); ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища); конеццикла; конецесли; КонецПроцедуры |
2. Обрабатываем файл на «Сервере»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
&НаСервере Процедура ЗагрузкаПрайсаНаСервере(АдресВременногоХранилища) ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВременногоХранилища); ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx"); ДвоичныеДанные.Записать(ИмяВременногоФайла); сообщить(ИмяВременногоФайла); ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.Прочитать(ИмяВременногоФайла,СпособЧтенияЗначенийТабличногоДокумента.Значение); //листаем все листы Для Каждого ОбластьТД ИЗ ТабличныйДокумент.Области Цикл ОбластьФайла = ТабличныйДокумент.ПолучитьОбласть(ОбластьТД.Имя); КолВоСтрокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоВертикали(); КолВоКолонокФайла = ОбластьФайла.ПолучитьРазмерОбластиДанныхПоГоризонтали(); Сообщить("Строк:"+КолВоСтрокФайла); Сообщить("Колонок:"+КолВоКолонокФайла); имялиста=ОбластьТД.Имя; Сообщить("Лист:"+имялиста); МассивИменКолонок=Новый Массив(); // читаем шапку листа Для ит=1 ПО КолВоКолонокФайла Цикл нКолонка = СтрЗаменить(ит, Символы.НПП, ""); ИмяКолонки=ОбластьФайла.ПолучитьОбласть("R1" + "C"+нКолонка).ТекущаяОбласть.Текст; сообщить("- колонка: "+ИмяКолонки); МассивИменКолонок.Добавить(ИмяКолонки); конеццикла; НачСтрока=0;КонСтрока=0; НачСтрока = ?(НачСтрока = 0, 2, НачСтрока); КонСтрока = ?(КонСтрока = 0, КолвоСтрокФайла, КонСтрока); //перебираем все строки без первой строки Для нСтрокаТФ = НачСтрока ПО КонСтрока Цикл нСтрока = СтрЗаменить(нСтрокаТФ, Символы.НПП, ""); СодержимоеСтроки=Новый Массив(); Для нКолонкаТФ = 1 ПО КолВоКолонокФайла Цикл нКолонка = СтрЗаменить(нКолонкаТФ, Символы.НПП, ""); Область = ОбластьФайла.ПолучитьОбласть("R"+нСтрока+"C"+нКолонка); ТекущаяОбласть = Область.ТекущаяОбласть; ЗначениеЯчейки = СокрЛП(ТекущаяОбласть.Текст); СодержимоеСтроки.Добавить(ЗначениеЯчейки); конеццикла; // ОбработатьСписокЗначений в "СодержимоеСтроки" конеццикла; конеццикла; КонецПроцедуры |