Чтение файла Excel через ADO
Столкнулся я на этой неделе с тем, что после замены операционной системы на сервере приложений 1С с Windows 2003 Server на Windows 2008 Server начала вылазить ошибка при попытке загрузки данных из Excel'я (парсинг происходит на стороне сервера). Попытка создания COM-объекта заканчивалась неудачей, хотя MS Office был установлен. Я перепробовал много всего, но так и не завелось. Было решено переделать функцию парсинга Excel под работу через ADO. Достаточно быстро нашелся в инете подходящий сорец.
Передаваемые значения: пФайл - путь к файлу, пЛист - имя листа с данными, СтруктураКолонок - структура вида "ИмяКолонки" - "НомерКолонки"(если не задано, созадуться колонки вида "К1", "К2"), НачСтрока - номер начальной строки для считывания, КонСтрока - номер последней строки. Возвращаемое значение - ТаблицаЗначений.
Приведу ещё пример структуры колонок. Пусть нам нужно считывать колонки со второй по восьмую. Тогда объявление структуры будет выглядеть следующим образом:
СтруктураКолонок = Новый Структура("ФИОАнг, ФИОРус, Пол, МестоРождения, ДатаРождения, НомерПаспорта, СрокДействия", 2, 3, 4, 5, 6, 7, 8)Сама функция:
Функция ПарсингЭкселя(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 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");
ТекстЗапроса =
"SELECT
| Лист.*
|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();
Возврат Таблица;
КонецФункции- Lord_of_fear's блог
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 633 просмотра



Комментарии
1 комментария(ев)Дата: ПТ, 17/02/2012 - 21:52
Молодца, Lord!
Если кого интересует работа с Access через Ado, то рекомендую: http://www.vr-online.ru/blog/vzaimodejstvie-1spredprijatie-8x-s-ms-access-3645