1CLenta.ru  

Использование ADO для записи и чтения Excel файлов

Настройка системы     09.01.2017 12:45     14769

В 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.
Но удобнее воспользоваться объектом ТабличныйДокумент встроенного языка, метод Записать(<ИмяФайла>, <ТипФайлаТаблицы>).

Комментарии (0)