Весьма частая задача, с которой сталкивается 1С разработчик – это чтение файлов Excel и загрузка их в 1С. Есть как минимум два способа прочитать файл Excel – средствами платформы 1С, или используя COM-объект приложения MS Excel. В статье рассматривается чтение файлов xls, xlsx при помощи табличного документа.
Содержание
Общая информация
В платформе 1С 8 существует объект ТабличныйДокумент, который позволяет формировать и выводить на экран печатные формы в табличном виде. Но у табличного документа есть еще одно применение – чтение данных из табличных файлов. Поддерживаются форматы xls, xlsx и ods. Т.е. можно загружать табличные файлы, созданные в пакете MS Office или OpenOffice Calc.
Значения типа Число или Дата, содержащиеся в ячейках исходного табличного файла, можно считать двумя способами – как значение, либо как текст. Рассмотрим пример: пусть в ячейке содержится число 123,456, и установлен формат с округлением до целого числа; в этом случае отображаться будет текст “123”, а значение будет храниться 123,456
- Если прочитать с указанием способа чтения как “Значение”, в табличный документ 1С будет прочитано исходное значение 123,456
- Если прочитать с указанием способа чтения как “Текст”, значение будет потеряно, и в табличный документ прочитается текст “123”
Использование объекта ВременноеХранилище
Вспомогательные процедуры — диалог выбора файла
Следующий код не является обязательным для решения задачи – путь к исходному файлу можно указать в коде, ввести вручную, скопировать из адресной строки ОС или прочитать из БД – вариантов очень много. Мы же рассмотрим пример, когда пользователь сам указывает файл на клиентском компьютере, и путь к этому файлу помещается в реквизит. В примере будем использовать реквизит формы ПутьКФайлу
Создадим обработчик события НачалоВыбора:
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ВыбратьФайлНаКлиенте();
КонецПроцедуры
Для того чтобы код был универсальным, и работал в случае отказа от модальных синхронных методов, нам понадобится создать асинхронную процедуру ВыбратьФайлНаКлиенте(). В ней мы создаем диалог выбора для открытия файла, указываем фильтр с нужными форматами – xls и xlsx, а также отключаем множественный выбор файлов. Перед методом ВыбратьАсинх добавляем ключевое слово Ждать, с тем чтобы дальнейший код дождался возвращаемого значения.
&НаКлиенте
Асинх Процедура ВыбратьФайлНаКлиенте()
Перем Диалог;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.МножественныйВыбор = Ложь;
РезультатВыбора = Ждать Диалог.ВыбратьАсинх();
Если РезультатВыбора <> Неопределено Тогда
ПутьКФайлу = РезультатВыбора[0];
КонецЕсли;
КонецПроцедуры
Двоичные данные во временное хранилище
Логика кода будет следующая. Нам понадобятся двепроцедуры – клиентский обработчик команды, и серверный метод который и будет непосредственно считывать переданный файл.
Клиентский код:
- проверяем, указан ли путь к файлу. Если не указан – прекращаем выполнение
- Получаем двоичные данные из файла по указанному пути
- Помещаем эти двоичные данные во временное хранилище
- Далее передаем на сервер адрес этого временного хранилища
&НаКлиенте
Процедура ДвоичныеДанныеВоВременноеХранилище(Команда)
Если Не ЗначениеЗаполнено(ПутьКФайлу) Тогда
Возврат;
КонецЕсли;
ДД = Новый ДвоичныеДанные(ПутьКФайлу);
АдресВХ = ПоместитьВоВременноеХранилище(ДД);
ПрочитатьИзВХНаСервере(АдресВХ);
КонецПроцедуры
Серверный код:
- Создаем временный файл с нужным расширением (в примере – xlsx)
- Получаем двоичные данные из временного хранилища
- Записываем во временный файл
- Определяем вариант чтения файла – читать значения табличного документа как текст, или как значения
- Далее используем метод Прочитать, и считываем из временного файла данные в табличный документ
Метод Прочитать лучше делать в попытке, и отдельно продумать и написать код обработки исключения. для упрощения примера мы это исключение никак не обрабатываем. В случае, если передан поврежденный файл, или его невозможно прочитать по какой-то другой причине, он просто не считается в табличный документ.
&НаСервере
Процедура ПрочитатьИзВХНаСервере(АдресВХ, Режим = "Значение")
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
ДД = ПолучитьИзВременногоХранилища(АдресВХ);
ДД.Записать(ИмяВременногоФайла);
Если Режим = "Текст" Тогда
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Текст;
Иначе
СпособЧтения = СпособЧтенияЗначенийТабличногоДокумента.Значение;
КонецЕсли;
Попытка
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтения);
Исключение
КонецПопытки;
КонецПроцедуры
Рассмотренный пример является достаточно универсальным – процедуру ПрочитатьИзВХНаСервере() можно использовать с любыми двоичными данными, помещенными во временное хранилище. Это могут быть двоичные данные, полученные с веб-сервиса, считанные из базы данных, полученные из макета, созданного в конфигураторе – код от этого не изменится.
Помещение файла на сервер в 1С
Более простой, но менее универсальный способ, предназначенный исключительно для передачи файла с клиента на сервер – это использование метода НачатьПомещениеФайлаНаСервер. В платформе предусмотрено несколько методов для помещения файлов – как одиночных, так и нескольких одновременно. Эти методы делятся на синхронные и асинхронные. Начиная с версии 8.3.18 появились методы, использующие ключевые слова Асинх и Ждать. Аналогичный метод мы рассмотрели при работе с диалогом. Далее разберем “классический” вариант с обработкой оповещения.
Логика кода следующая:
- Создаем описание оповещения и указываем в нем процедуру, которая будет вызвана после окончания помещения файла на сервер
- Указываем параметры диалога выбора файла и добавляем фильтр
- Вызываем помещение файла на сервер
- После того как файл помещен во временное хранилище, используем ту же процедуру, которую мы реализовали в первом примере – ПрочитатьИзВХНаСервере. В этом примере мы для разнообразия используем способ чтения значений как “Текст”.
&НаКлиенте
Процедура ПередачаФайла(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещения", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "Excel файлы(*.xls;*.xlsx)|*.xls;*.xlsx";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещения(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьИзВХНаСервере(АдресФайла, "Текст");
КонецПроцедуры
Использование потока для чтения файла
В случае, если нам нужно просто передать файл с клиента на сервер для сохранения в базу данных, либо мы хотим прочитать файл в формате ods(Open Documents Spreadsheet) или mxl(встроенный формат табличных документов 1С), мы можем воспользоваться еще одним способом – с использованием потоков данных.
В этом случае нам не понадобится создавать временный файл и следить за его корректным удалением. Код будет очень похож на прерыдущий пример. Мы также выбираем файл с использованием метода НачатьПомещениеФайлаНаСервер, но указываем другой фильтр. А в обработчике оповещения вызываем серверную процедуру ПрочитатьВПоток. В методе Прочитать() нам нужно явным образом указать тип файла табличного документа, который мы считываем.
&НаКлиенте
Процедура ПрочитатьЧерезПоток(Команда)
ОбработкаОкончанияПомещения = Новый ОписаниеОповещения("ОбработчикОкончанияПомещенияПоток", ЭтотОбъект);
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Фильтр = "файлы ODS или MXL|*.ods;*.mxl";
НачатьПомещениеФайлаНаСервер(ОбработкаОкончанияПомещения, , , АдресВХ, ПараметрыДиалога, ЭтотОбъект.УникальныйИдентификатор);
КонецПроцедуры
&НаКлиенте
Процедура ОбработчикОкончанияПомещенияПоток(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
АдресФайла = ОписаниеПомещенногоФайла.Адрес;
ПрочитатьВПоток(АдресФайла);
КонецПроцедуры
&НаСервере
Процедура ПрочитатьВПоток(АдресФайла)
ДД = ПолучитьИзВременногоХранилища(АдресФайла);
Поток = ДД.ОткрытьПотокДляЧтения();
ТабДок.Прочитать(Поток,,ТипФайлаТабличногоДокумента.ODS);
Поток.Закрыть();
КонецПроцедуры
Надеюсь, рассмотренные примеры помогут вам справиться с задачей передать файл с клиента на сервере и прочитать файл Excel в 1С.
Чтение файла Excel в 1С 8.х может проводиться несколькими способами. Одним из самых простых способов программного чтения файлов Excel в 1С является подключение через COMобъект.
Перед тем как перейти к процедурам чтения файла Excel, нужно найти его адрес. Для этого удобно воспользоваться стандартным диалогом открытия файла. Нужно создать текстовое поле с достаточной длиной (адреса бывают длинные). В обработчике события НачалоВыбора нужно прописать следующую процедуру.
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = «(*.xls)|*.xls»;
Если ЗначениеЗаполнено(Файл) Тогда
Диалог.ПолноеИмяФайла= Файл;
КонецЕсли;
Если Диалог.Выбрать() Тогда
Файл= Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
После этого в реквизите Файл должен находить полный адрес файла Excel.
Допустим, файл содержит две колонки:
- Артикул.
- Наименование товара.
Данные начинаются с 4 строки. Всего строк в файле 5000.
Процедура будет выглядеть так:
Процедура ИмпортироватьЛистФАдрес ()
Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);
ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
Для СчетчикЦикла=4 По 5000 Цикл
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
КонецЦикла;
Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти
КонецПроцедуры
Пустые ячейки файла Excel имеют значение Неопределено. Поэтому, если количество строк в файле заранее не известно, но есть уверенность, что записи идут одна за другой и не прерываются пустыми строками, то процедуру можно модифицировать так.
Процедура ИмпортироватьЛистФАдрес ()
Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);
ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
СчетчикЦикла=4;
Пока СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value)<>Неопределено Цикл
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
СчетчикЦикла=СчетчикЦикла+1;
КонецЦикла;
Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти
КонецПроцедуры
Кроме того, можно определить количество строк в файле Excel. Это делается так:
Версия = Лев(Ехсел.Version,Найти(Ехсел.Version,«.»)—1);
Если Версия = «8» тогда
ФайлСтрок = Ехсел.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Ехсел.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Ехсел.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Ехсел.Cells(1,1).SpecialCells(11).Column;
Конецесли;
После этого можно применять полученные значения количества строк и колонок в коде, аналогичном описанному выше.
Процедура ИмпортироватьЛистФАдрес ()
Ехсел=Новый COMObject(«Excel.Application»);
Книга=Ехсел.Workbooks;
Книга.Open(Файл);
Если Версия = «8» тогда
ФайлСтрок = Ехсел.Cells.CurrentRegion.Rows.Count;
ФайлКолонок = Макс(Ехсел.Cells.CurrentRegion.Columns.Count, 13);
Иначе
ФайлСтрок = Ехсел.Cells(1,1).SpecialCells(11).Row;
ФайлКолонок = Ехсел.Cells(1,1).SpecialCells(11).Column;
Конецесли;
ТЗ=новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Артикул»);
ТЗ.Колонки.Добавить(«Наименование»);
Для СчетчикЦикла=4 По ФайлСтрок Цикл
НоваяСтрока=ТЗ.Добавить();
НоваяСтрока.Артикул=СокрЛП(Ехсел.Cells(СчетчикЦикла,1).value);
НоваяСтрока.Наименование=СокрЛП(Ехсел.Cells(СчетчикЦикла,2).value);
КонецЦикла;
Ехсел.Application.Quit(); // Если этого не сделать, процесс EXCEL останется в памяти
КонецПроцедуры
&НаКлиенте
Процедура ФайлНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) //необходимо в событии «НачалоВыбора» поля ввода вызвать ДиалогВыбораФайлаДиалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = «Выберите файл Excel»;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.Фильтр = «(*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx»;
Если
ЗначениеЗаполнено(Объект.Файл) Тогда
Диалог.ПолноеИмяФайла= Объект.Файл;
КонецЕсли;
Если
Диалог.Выбрать() Тогда
ВыбранныйФайл = Диалог.ПолноеИмяФайла;
Объект.Файл = ВыбранныйФайл;
ЧтениеExcel_через_ТД(ВыбранныйФайл);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЧтениеExcel_через_ТД(ВыбранныйФайл)//1) Выводим Excel в табличн.документ
ТаблДок = Новый ТабличныйДокумент;
ТаблДок.Прочитать(ВыбранныйФайл, СпособЧтенияЗначенийТабличногоДокумента.Значение);//2) Выгружаем в таблицу значений
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТаблДок.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();ТаблицаЗначений = ПЗ.Результат.Выгрузить();
КонецПроцедуры
Чтение и запись данных MS Excel с использованием 1С, примеры форматирования таблицы |
Часто возникает потребность прочитать данные из таблицы MS
Добавляем форму обработку и на нее помещаем две кнопки: Загрузить данные и Выгрузить данные. Поскольку цель данного примера показать приемы работы с загрузкой и выгрузкой данных в файл MS Excel, то на форму промежуточные данные выводить не будем.
Теперь поместим в обработчики кнопкок «Загрузить данные» и «Выгрузить данные»функционал чтения данных из файла MS Excel. В обработчиках кнопок получается следующий код: Процедура ЗагрузитьДанныеНажатие(Элемент) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = "Выберите имя файла для чтения"; Диалог.МножественныйВыбор = Ложь; Диалог.Фильтр = "Файл MS Excel (.xlsx)| *.xlsx"; Если Не Диалог.Выбрать() Тогда Сообщить("Файл для обработки не выбран!"); Иначе ФайлДанных = Диалог.ПолноеИмяФайла; Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(ФайлДанных); Состояние("Обработка файла Microsoft Excel..."); Исключение Сообщить("Ошибка при открытии файла с помощью Excel! Загрузка не будет произведена!"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка Excel.Sheets(1).Select(); Исключение Excel.ActiveWorkbook.Close(); Excel = 0; Сообщить("Файл " + Строка(ФайлДанных) + " не соответствует необходимому формату! Первый лист не найден!"); Возврат; КонецПопытки; Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1); Если Версия = "8" Тогда ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Иначе ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row; ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column; КонецЕсли; ТЗ.Очистить(); Попытка Для Сч = 2 По ФайлСтрок Цикл Состояние("Обрабатывается строка " + Строка(Сч) + " из " + Строка(ФайлСтрок)); Если НЕ СокрЛП(Excel.Cells(Сч, 1).Value) = "" Тогда НоваяСтрока = ТЗ.Добавить(); НоваяСтрока.НомерПоПорядку = СокрЛП(Excel.Cells(Сч, 1).Value); НоваяСтрока.ТестовыйТекст = СокрЛП(Excel.Cells(Сч, 2).Text); НоваяСтрока.ТестовоеЧисло1 = СокрЛП(Excel.Cells(Сч, 3).Value); НоваяСтрока.ТестовоеЧисло2 = СокрЛП(Excel.Cells(Сч, 4).Value); НоваяСтрока.ТестовоеЧисло3 = СокрЛП(Excel.Cells(Сч, 5).Value); НоваяСтрока.ТестовоеЧисло4 = СокрЛП(Excel.Cells(Сч, 6).Value); НоваяСтрока.ТестовоеЧисло5 = СокрЛП(Excel.Cells(Сч, 7).Value); НоваяСтрока.ТестовоеЧисло6 = СокрЛП(Excel.Cells(Сч, 8).Value); НоваяСтрока.ТестовоеЧисло7 = СокрЛП(Excel.Cells(Сч, 9).Value); НоваяСтрока.ТестоваяДата = СокрЛП(Excel.Cells(Сч, 10).Value); КонецЕсли; КонецЦикла; Исключение Excel.ActiveWorkbook.Close(); Excel.Quit(); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка Сообщить("Файл Excel прочитан!"); Excel.Quit(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; КонецЕсли; КонецПроцедуры Процедура ВыгрузитьДанныеНажатие() Для Каждого ТекСтрока Из ТЗ Цикл ТекСтрока.ТестовоеЧисло5 = ТекСтрока.ТестовоеЧисло5 - Число(ТекСтрока.НомерПоПорядку); КонецЦикла; Если ТЗ.Количество() = 0 Тогда Возврат; КонецЕсли; Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение); Диалог.Заголовок = "Выберите имя файла для сохранения"; Диалог.МножественныйВыбор = Ложь; Диалог.Фильтр = "Файл MS Excel *.xlsx)| *.xlsx"; Если Диалог.Выбрать() Тогда ФайлДанных = Диалог.ПолноеИмяФайла; Попытка Excel = Новый COMОбъект("Excel.Application"); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка Книга = Excel.WorkBooks.Add(); Лист = Книга.WorkSheets(1); Лист.Name = "Выгрузка данных"; Excel.ActiveWindow.View = 2; Excel.ActiveWindow.Zoom = 100; Лист.PageSetup.Orientation = 2; Лист.Columns(1).ColumnWidth = 10; Лист.Columns(2).ColumnWidth = 25; Лист.Columns(10).ColumnWidth = 13; Лист.Columns(11).ColumnWidth = 13; Лист.Cells(1, 1).Value = "Номер по порядку"; Лист.Cells(1, 2).Value = "Выгружаемый текст"; Лист.Cells(1, 3).Value = "Выгружаемые числа"; Лист.Cells(1, 10).Value = "Выгружаемая дата"; Лист.Cells(1, 11).Value = "Программная формула"; Лист.Cells(2, 3).Value = "Число 1"; Лист.Cells(2, 4).Value = "Число 2"; Лист.Cells(2, 5).Value = "Число 3"; Лист.Cells(2, 6).Value = "Число 4"; Лист.Cells(2, 7).Value = "Число 5"; Лист.Cells(2, 8).Value = "Число 6"; Лист.Cells(2, 9).Value = "Число 7"; Лист.Range("A1:A2").MergeCells = Истина; Лист.Range("A1:A2").WrapText = Истина; Лист.Range("B1:B2").MergeCells = Истина; Лист.Range("B1:B2").WrapText = Истина; Лист.Range("J1:J2").MergeCells = Истина; Лист.Range("J1:J2").WrapText = Истина; Лист.Range("K1:K2").MergeCells = Истина; Лист.Range("K1:K2").WrapText = Истина; Лист.Range("C1:I1").MergeCells = Истина; Лист.Range("C1:I1").WrapText = Истина; Лист.Range("A1:K2").Borders.Linestyle = 1; Лист.Range("A1:K2").HorizontalAlignment = 3; Лист.Range("A1:K2").VerticalAlignment = 2; Лист.Range("A1:K2").Font.Bold = 1; СчетчикСтрок = 3; Для Каждого ТекСтрока Из ТЗ Цикл Лист.Cells(СчетчикСтрок, 1).Value = ТекСтрока.НомерПоПорядку; Лист.Cells(СчетчикСтрок, 2).Value = ТекСтрока.ТестовыйТекст; Лист.Cells(СчетчикСтрок, 3).Value = ТекСтрока.ТестовоеЧисло1; Лист.Cells(СчетчикСтрок, 4).Value = ТекСтрока.ТестовоеЧисло2; Лист.Cells(СчетчикСтрок, 5).Value = ТекСтрока.ТестовоеЧисло3; Лист.Cells(СчетчикСтрок, 6).Value = ТекСтрока.ТестовоеЧисло4; Лист.Cells(СчетчикСтрок, 7).Value = ТекСтрока.ТестовоеЧисло5; Лист.Cells(СчетчикСтрок, 8).Value = ТекСтрока.ТестовоеЧисло6; Лист.Cells(СчетчикСтрок, 9).Value = ТекСтрока.ТестовоеЧисло7; Лист.Cells(СчетчикСтрок, 10).Value = ТекСтрока.ТестоваяДата; Лист.Cells(СчетчикСтрок, 11).Formula = "=F" + Строка(СчетчикСтрок) + "+G" + Строка(СчетчикСтрок); СчетчикСтрок = СчетчикСтрок + 1; КонецЦикла; СчетчикСтрок = СчетчикСтрок - 1; Лист.Range("A3:K" + Строка(СчетчикСтрок)).Borders.Linestyle = 1; Лист.Range("A3:K" + Строка(СчетчикСтрок)).VerticalAlignment = 2; Для НомерСтроки = 3 По СчетчикСтрок Цикл Для Столбец = 4 По 9 Цикл Лист.Cells(НомерСтроки, Столбец).NumberFormat = "0.00"; КонецЦикла; Лист.Cells(НомерСтроки, 11).NumberFormat = "0.00"; КонецЦикла; Исключение Excel.Quit(); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; Попытка Книга.SaveAs(ФайлДанных); Сообщить("Файл " + ФайлДанных + " успешно сохранен"); Исключение Сообщить(ОписаниеОшибки() + " Файл не сохранен!"); Возврат; КонецПопытки; Попытка Excel.Quit(); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; КонецЕсли; КонецПроцедуры В результате получилась обработка, в которой сначала из файл На этом пока все. Пример обработки и файла для чтения данных можно скачать |
Исходная задача: в файле хранится список контрагентов со следующей информацией:
- наименование
- полное наименование
- УНП
Нужно прочитать данные из этого файла для последующей загрузки в 1С в справочник «Контрагенты». В этой статье не будем затрагивать вопрос создания контрагентов в справочнике, рассмотрим только процесс чтения данных из файла Excel.
Прочитать файл Excel в 1С можно с помощью объекта встроенного языка ТабличныйДокумент. Ниже приведен фрагмент программного кода, который решает эту задачу:
————————————————————————————-
ТабДок = Новый ТабличныйДокумент;
//путь к файлу, который нужно прочитать
ПутьКФайлу = «C:tempСписокКонтрагентов.xls»;
//чтение файла, используя метод Прочитать (ВАЖНО: метод доступен только на сервере)
Попытка
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);
Исключение
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = «Не удалось прочитать указанный файл по причине: » + ОписаниеОшибки();
Сообщение.Сообщить();
Возврат;
КонецПопытки;
//получение количества строк в таблице
КоличествоСтрок = ТабДок.ВысотаТаблицы;
//создание таблицы, в которую будут помещены данные из файла
ДанныеФайла = Новый ТаблицаЗначений;
ДанныеФайла.Колонки.Вставить(«Наименование»);
ДанныеФайла.Колонки.Вставить(«ПолноеНаименование»);
ДанныеФайла.Колонки.Вставить(«УНП»);
//чтение данных таблицы по ячейкам
Для НомерСтроки = 2 По КоличествоСтрок Цикл
СтрокаДанных = ДанныеФайла.Добавить();
//получение данных ячейки с адресом R<НомерСтроки>C<НомерКолонки> (пример: R1C2)
СтрокаДанных.Наименование = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 1).ТекущаяОбласть.Текст;
СтрокаДанных.ПолноеНаименование = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 2).ТекущаяОбласть.Текст;
СтрокаДанных.УНП = ТабДок.ПолучитьОбласть(«R» + Формат(НомерСтроки, «ЧГ=0») + «C» + 3).ТекущаяОбласть.Текст;
КонецЦикла;
————————————————————————————-
Примечание: метод «Прочитать()» объекта ТабличныйДокумент доступен только на сервере. Поэтому чтение данных описанным способом возможно только на стороне сервера.
Ставьте + в комментариях, если Вам помогла эта статья 🙂
2019-12-16 15:42
Программирование
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт
#Если Клиент Тогда
Состояние("Установка соединения с Excel");
#КонецЕсли
//ЗаголовкиВСтроке1 = "HDR=YES;"
ЗаголовкиВСтроке1 = "HDR=NO;";
СтрокаСоединения ="Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(пФайл) +" ;Extended Properties=""Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;""";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;
Попытка
Connection.Open();
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
ТекстЗапроса =
"S_elect
| Лист.*
|FROM
| [" + пЛист + "$] as Лист";
Попытка
RS.Open(ТекстЗапроса, Connection);
Исключение
Сообщить ("Проблемы с выполнением запроса");
Возврат Неопределено;
КонецПопытки;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НомерСтроки = 0;
КолвоСтрок = RS.RecordCount;
Пока RS.EOF() = 0 Цикл
НомерСтроки = НомерСтроки + 1;
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли
Если НомерСтроки < НачСтрока Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать;
КонецЕсли;
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS.Fields.Count Цикл
Поле = RS.Fields.Item(Счетчик - 1);
НоваяСтрока["К" + Счетчик] = Поле.Value;
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
// Обработка других полей
RS.MoveNext();
КонецЦикла;
// Завершение работы
RS.Close();
Connection.Close();
Возврат Таблица;
КонецФункции
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние("Открытие Excel");
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;
Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
КонецЦикла;
КонецЕсли;
НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);
Для НомерСтроки = НачСтрока По КонСтрока Цикл
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КонСтрока));
ОбработкаПрерыванияПользователя();
#КонецЕсли
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
Поле = Лист.Cells(НомерСтроки, НомерКолонки);
НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Поле.Value;
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = Лист.Cells(НомерСтроки, КлючИЗначение.Значение);
НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает данные из файла Excel
//
// Параметры:
// пФайл - Имя файла
// пЛист - Имя листа с данными
// СтруктураКолонок - Структура вида "ИмяКолонки" - "НомерКолонки"
// если не задано, созадуться колонки вида "К1", "К2"
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// ТаблицаЗначений
//
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние("Открытие Excel");
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Сообщить ("Проблемы с подключением к Excel" );
Возврат Неопределено;
КонецПопытки;
Лист = Book.Sheets(1);
КолвоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
КолвоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица.Колонки.Добавить("К" + Счетчик);
КонецЦикла;
Иначе
МаксимальныйНомерКолонки = 0;
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
МаксимальныйНомерКолонки = Макс(МаксимальныйНомерКолонки, КлючИЗначение.Значение);
КонецЦикла;
КолвоКолонок = Мин(КолвоКолонок, МаксимальныйНомерКолонки);
КонецЕсли;
НачСтрока = ?(НачСтрока = 0, 1, НачСтрока);
КонСтрока = ?(КонСтрока = 0, КолвоСтрок, КонСтрока);
КонСтрока = Мин(КонСтрока, КолвоСтрок);
// Массив типа COMSafeArray
Массив = Лист.Range(Лист.Cells(НачСтрока, 1), Лист.Cells(КонСтрока, КолвоКолонок)).Value;
КолвоСтрок = Массив.GetUpperBound(1);
Для НомерСтроки = 1 По КолвоСтрок Цикл
#Если Клиент Тогда
Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
ОбработкаПрерыванияПользователя();
#КонецЕсли
НоваяСтрока = Таблица.Добавить();
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
НоваяСтрока["К" + Формат(НомерКолонки, "ЧГ=0")] = Массив.GetValue(НомерКолонки, НомерСтроки);
КонецЦикла;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
НоваяСтрока[КлючИЗначение.Ключ] = Массив.GetValue(КлючИЗначение.Значение, НомерСтроки);
КонецЦикла;
КонецЕсли;
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат Таблица;
КонецФункции
// Функция получает список листов Excel
//
// Параметры:
// пФайл - Имя файла
// XLSОбъект - COM объект типа "Excel.Application"
//
// Возвращаемое значение:
// СписокЗначений
//
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект("Excel.Application");
XLSОбъект.Visible = Ложь;
XLSОбъект.DisplayAlerts = Ложь;
КонецЕсли;
Попытка
Book = XLSОбъект.Workbooks.Open(пФайл, , Истина);
Исключение
Возврат Новый СписокЗначений;
КонецПопытки;
СписокЛистов = Новый СписокЗначений;
Для каждого Лист Из XLSОбъект.Sheets Цикл
СписокЛистов.Добавить(Лист.Name);
КонецЦикла;
XLSОбъект.Application.Quit();
Возврат СписокЛистов;
КонецФункции
Перейти к содержимому
Часто нужно прочитать информацию из Excel . Ниже пример простой процедуры.
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 |
&НаКлиенте Процедура ПрочитатьФайл(ИмяФайла) ВыбранныйФайл = Новый Файл(ИмяФайла); Попытка Если НЕ ВыбранныйФайл.Существует() Тогда ВызватьИсключение(«Файл не существует « + ИмяФайла); КонецЕсли; Excel = Новый COMОбъект(«Excel.Application»); Excel.WorkBooks.Open(ИмяФайла); Excel.Sheets(1).Select(); // Выбрали первый лист Версия = Лев(Excel.Version,Найти(Excel.Version,«.»)—1); Если Версия = «8» тогда ФайлСтрок = Excel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Иначе ФайлСтрок = Excel.Cells(1,1).SpecialCells(11).Row; ФайлКолонок = Excel.Cells(1,1).SpecialCells(11).Column; Конецесли; //В цикле перебираем строки файла Для й = 1 по ФайлСтрок цикл //Выводим пользователю информацию Состояние(«Считываем строки из файла (« + й + » из « + ФайлСтрок + «)», Цел(й/ФайлСтрок*100) , Excel.Cells(й, 1).Text,БиблиотекаКартинок.НайтиВСодержании); //Считываем текст из ячейки ТекстЯчейки = Excel.Cells(й, 1).Text; //Считываем значение ячейки ЗначениеЯчейки = Excel.Cells(й, 1).Value; КонецЦикла; Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Если НЕ Excel = Неопределено тогда Excel.DisplayAlerts = 0; Excel.Quit(); Excel.DisplayAlerts = 1; КонецЕсли; КонецПроцедуры |
1С — чтение и редактирование файла excel (xls, xlsx), поиск и замена текста
Пример чтения файла excel
&НаКлиенте Процедура ПрочитатьExcel(Команда) // завершаем все процессы excel, необязательная строка КомандаСистемы("taskkill /F /IM excel.exe"); ExcelПриложение = Новый COMОбъект("Excel.Application"); ExcelПриложение.Visible = Ложь; // вывод документа на экран ExcelФайл = ExcelПриложение.Workbooks.Open("G:testtt.xlsx"); КоличествоЛистов = ExcelФайл.Sheets.Count; // Получим первый лист Лист = ExcelФайл.Sheets(1); ИмяЛиста = Лист.Name; КоличествоСтрок = Лист.UsedRange.Rows.Count; КоличествоКолонок = Лист.UsedRange.Columns.Count; // Пример обхода строк по первой колонке Для Строка = 1 По КоличествоСтрок Цикл ТекстЯчейки = Лист.Cells(Строка, 1).Value; Сообщить(ТекстЯчейки); КонецЦикла; // Закрываем файл ExcelПриложение.Quit(); КонецПроцедуры
Пример поиска и замены текста в файле excel
&НаКлиенте Процедура ЗаменитьТекстExcel(Команда) КомандаСистемы("taskkill /F /IM excel.exe"); ExcelПриложение = Новый COMОбъект("Excel.Application"); ExcelПриложение.Visible = Истина; // вывод документа на экран ExcelФайл = ExcelПриложение.Workbooks.Open("G:testtt.xlsx"); Лист = ExcelФайл.Sheets(1); ОбластьПоиска = Лист.Cells; НачалоЛиста = Лист.Cells(1, 1); НайденнойЗначение = ОбластьПоиска.Find("ЗаменяемыйТекст", НачалоЛиста); Счетчик = 0; Пока НайденнойЗначение <> Неопределено Цикл НайденнойЗначение.Value = "Замещающий текст"; НайденнойЗначение = ОбластьПоиска.Find("ЗаменяемыйТекст", НачалоЛиста); Счетчик = Счетчик + 1; КонецЦикла; КонецПроцедуры