В 1С:Предприятии для работы с Excel доступна технология ADO. Данная технология позволяет читать, записывать данные в файл. Для использования объектов ADO на компьютере должен быть установлен драйвер баз данных Access Database Engine. Этот драйвер входит в состав программы MS Excell. Его так же можно установить отдельно, скачав инсталлятор (AccessDatabaseEngine.exe) с официального сайта Microsoft.
Чтение Excel файла через ADO
Процедура ПрочитатьExcelФайл() Connection = ОткрытьExcel(ПутьКФайлу); МассивЛистов = ПолучитьЛистыExcel(Connection); Для каждого Лист Из МассивЛистов Цикл Recordset = ПрочитатьЛистExcel(Connection, Лист); Recordset.MoveFirst(); Пока НЕ Recordset.Eof() Цикл Значение1 = Recordset.Fields.Item("ИмяКолонки1").Value; Значение2 = Recordset.Fields.Item("ИмяКолонки2").Value; Recordset.MoveNext(); КонецЦикла; КонецЦикла; ЗакрытьExcel(Connection); КонецПроцедуры
Функция ОткрытьExcel(ПутьКФайлу) Файл = Новый Файл(ПутьКФайлу); Если Файл.Расширение = ".xls" Тогда ТипФайла = ""; ИначеЕсли Файл.Расширение = ".xlsx" Тогда ТипФайла = " Xml"; Иначе ВызватьИсключение "Не поддерживаемый тип файла " + Файл.Расширение; КонецЕсли; СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + ПутьКФайлу + "; Extended Properties=""Excel 12.0" + ТипФайла + ";HDR=Yes;IMEX=1;"""; Connection = Новый COMОбъект("ADODB.Connection"); Connection.ConnectionString = СonnectionString; Connection.ConnectionTimeout = 10; Connection.CursorLocation = 3; Connection.Open(); Возврат Connection; КонецФункции
Функция ПолучитьЛистыExcel(Connection)
SchemaTables = 20; RecordsetTables = Connection.OpenSchema(SchemaTables); МассивЛистов = Новый Массив(); Пока НЕ RecordsetTables.Eof() Цикл МассивЛистов.Добавить( RecordsetTables.Fields("TABLE_NAME").Value ); RecordsetTables.MoveNext(); КонецЦикла; Возврат МассивЛистов; КонецФункции
Функция ПрочитатьЛистExcel(Connection, Лист)
Recordset = Новый COMОбъект("ADODB.Recordset"); Recordset.ActiveConnection = Connection; Recordset.LockType = 1; Recordset.CursorType = 3; Recordset.Open("SELECT * FROM [" + Лист + "]"); Возврат Recordset;
КонецФункции
Процедура ЗакрытьExcel(Connection)
Если Connection <> Неопределено Тогда Если Connection.State <> 0 Тогда Connection.Close(); КонецЕсли; Connection = Неопределено; КонецЕсли; КонецПроцедуры Примечание: ADO по умолчанию определяет тип данных столбца по первым 8 строкам (это настраивается). Если в файле есть текстовая колонка и в этих 8 строках размер текста не превышает 255 символов, то для всей колонки будет назначен текстовый тип ограниченный 255 символами. И если встретится значение больше 255, то строка будет обрезана. Для решения этой проблемы нужно в первой строке этой колонки вручную добавить пробелов к тексту, чтобы его длина стала например 300 символов. Тогда тип всей колонки определится как Memo, текст неограниченной длины.
Запись Excel файла Чтобы записать в файл Excel можно воспользоваться методами объектов Connection или Recordset. Но удобнее воспользоваться объектом ТабличныйДокумент встроенного языка, метод Записать(<ИмяФайла>, <ТипФайлаТаблицы>).
|