Загрузка excel через ado

В 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 

   

Распечатать

1С 8.x : Загрузка данных из MS Excel через объект ADODB

Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.

Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB. Recordset

Код 1C v 8.х

 // Выполняет загрузку из файла Excel
// Параметры
// ПутьКФайлу - <Строка> - путь к файлу xls
// Автор: ---%%%Gmix 16.03.2006 12:38:48
// Возвращаемое значение:
// <Булево> – Истина загрузка произошла
// - Ложь загрузки не было
Функция ВыполнитьЗагрузку(ПутьКФайлу) Экспорт

Файл=Новый Файл(ПутьКФайлу);

Если Файл.Существует() Тогда
Стр_Файл=Файл.ПолноеИмя;
// Отрезаем слеш если он есть в конце пути
Стр_Путь=Файл.Путь;
Если Прав(Стр_Путь,1)="" Тогда
Стр_Путь=Лев(Стр_Путь,СтрДлина(Стр_Путь)-1);
КонецЕсли;
// Строка корнекта
Стр_Конект = "Driver={Microsoft Excel Driver (*.xls)};
|DriverId=790;
|Dbq="+Стр_Файл+";
|DefaultDir="+Стр_Путь+";";
Об_Конект = Новый COMОбъект("ADODB.Connection");
Попытка
Об_Конект.Open(Стр_Конект);
Исключение
Сообщить ("Не возможно подключится к Microsoft Excel Driver!!!
|Возможно файл ["+Стр_Файл+"] открыт другим пользователем.");
Возврат Ложь;
КонецПопытки;

// формируем запрос
// Здесь есть нюанс первая строка данных всегда будет являться заголовком
// если она пустая то имена клонок формируются следующим образом F<Номер колонки>
Стр_SQL = "S_elect
| F1 as Артикул,
| F2 as Наименование,
| F3 as ПолноеНаименование
| FROM [A1:AZ100000]
| WHERE ((F1 Is Not Null) AND (F1 <>''))";
Об_РекордСет = Новый COMОбъект("ADODB.Recordset");

Попытка
Об_РекордСет=Об_Конект.Execute(Стр_SQL);
Исключение
Сообщить("Не удадлось выполнить запрос к файлу Excel
|"+ ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;

Пока НЕ Об_РекордСет.EOF Цикл
// Получаем данные из Об_РекордСет
// ...
Сообщить("");
Для каждого ОБ_Поле Из Об_РекордСет.Fields Цикл
// Пример вывода информации Сообщить(ОБ_Поле.Name,Об_РекордСет.Fields(ОБ_Поле.Name).value);
КонецЦикла;
// ...
Об_РекордСет.MoveNext();
КонецЦикла;

Об_Конект.Close(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;

Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции

На чтение 9 мин Просмотров 26.9к. Опубликовано 09.11.2017

MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.

Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.

Содержание

  1. Обмен через табличный документ
  2. Обмен через OLE
  3. Использование COMSafeArray
  4. Обмен через ADO
  5. Выгрузка без программирования

Обмен через табличный документ

Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:

  • Записать(<ИмяФайла>, <ТипФайлаТаблицы>) для выгрузки данных в файл;
  • Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>) для загрузки данных из файла.

Внимание!

Метод Записать() доступен как на клиенте, так и на сервере. Метод Прочитать() доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.


Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:

ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:

  • XLS95 — формат Excel 95;
  • XLS97 — формат Excel 97;
  • XLSX — формат Excel 2007.

Загрузка из файла осуществляется также достаточно просто:

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Значение);

Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:

  • Значение;
  • Текст.

Обмен через OLE

Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:

  • На компьютере конечного пользователя, если обмен происходит на стороне клиента;
  • На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.

Пример выгрузки:

// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель.WorkBooks.Add();
// Позиционирование на первом листе
Лист = Книга.Worksheets(1);

// Запись значения в ячейку
Лист.Cells(НомерСтроки, НомерКолонки).Value = ЗначениеЯчейки;

// Сохранение файла
Книга.SaveAs(ИмяФайла);

// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;

Примеры чтения:

// —— ВАРИАНТ 1 ——

// Создание COM-объекта
Эксель = Новый COMОбъект(«Excel.Application»);
// Открытие книги
Книга = Эксель.Workbooks.Open(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;

// Закрытие книги
Книга.Close(0);

// Закрытие Эксель и освобождение памяти
Эксель.Quit();
Эксель = 0;

// —— ВАРИАНТ 2 ——

// Открытие книги
Книга = ПолучитьCOMОбъект(ПутьКФайлу);
// Позиционирование на нужном листе
Лист = Книга.Worksheets(1);

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;

// Закрытие книги
Книга.Application.Quit();

Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:

// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
КонецЦикла;

// —— ВАРИАНТ 2 ——
НомерСтроки = 0;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1;
ЗначениеЯчейки = Лист.Cells(НомерСтроки, НомерКолонки).Value;
Если НЕ ЗначениеЗаполнено(ЗначениеЯчейки) Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:

ВсегоКолонок = Лист.Cells(1, 1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1, 1).SpecialCells(11).Row;

Область = Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок));
Данные = Область.Value.Выгрузить();

В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:

Действие Код Комментарий
Работа с приложением
Установка видимости окна приложения Эксель.Visible = Ложь;
Установка режима вывода предупреждений (выводить/не выводить) Эксель.DisplayAlerts = Ложь;
Закрытие приложения Эксель.Quit();
Работа с книгой
Создание новой книги Книга = Эксель.WorkBooks.Add();
Открытие существующей книги Книга = Эксель.WorkBooks.Open(ИмяФайла);
Сохранение книги Книга.SaveAs(ИмяФайла);
Закрытие книги Книга.Close(0);
Работа с листом
Установка текущего листа Лист = Книга.WorkSheets(НомерЛиста);
Установка имени Лист.Name = Имя;
Установка защиты Лист.Protect();
Снятие защиты Лист.UnProtect();
Установка ориентации страницы Лист.PageSetup.Orientation = 2; 1 — книжная, 2 — альбомная
Установка левой границы Лист.PageSetup.LeftMargin = Эксель.CentimetersToPoints(Сантиметры);
Установка верхней границы Лист.PageSetup.TopMargin = Эксель.CentimetersToPoints(Сантиметры);
Установка правой границы Лист.PageSetup.RightMargin = Эксель.CentimetersToPoints(Сантиметры);
Установка нижней границы Лист.PageSetup.BottomMargin = Эксель.CentimetersToPoints(Сантиметры);
Работа со строками, колонками, ячейками
Установка ширины колонки Лист.Columns(НомерКолонки).ColumnWidth = Ширина;
Удаление строки Лист.Rows(НомерСтроки).Delete();
Удаление колонки Лист.Columns(НомерКолонки).Delete();
Удаление ячейки Лист.Cells(НомерСтроки, НомерКолонки).Delete();
Установка значения Лист.Cells(НомерСтроки, НомерКолонки).Value = Значение;
Объединение ячеек Лист.Range(Лист.Cells(НомерСтроки, НомерКолонки), Лист.Cells(НомерСтроки1, НомерКолонки1)).Merge();
Установка шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Name = ИмяШрифта;
Установка размера шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Size = РазмерШрифта;
Установка жирного шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Bold = 1; 1 — жирный шрифт, 0 — нормальный
Установка курсива Лист.Cells(НомерСтроки, НомерКолонки).Font.Italic = 1; 1 — курсив, 0 — нормальный
Установка подчеркнутого шрифта Лист.Cells(НомерСтроки, НомерКолонки).Font.Underline = 2; 2 — подчеркнутый, 1 — нет

Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.

Использование COMSafeArray

При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.

// Создание COMSafeArray
МассивКом = Новый COMSafeArray(«VT_Variant», ВсегоКолонок, ВсегоСтрок);
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок1 Цикл
Для Кол = 0 По ВсегоКолонок1 Цикл
МассивКом.SetValue(Кол, Стр, Значение);
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист.Range(Лист.Cells(1, 1), Лист.Cells(ВсегоСтрок, ВсегоКолонок)).Value = МассивКом;

Обмен через ADO

Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.

Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.

Пример выгрузки:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);

// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения

// Создание COM-объекта для команды
Команда = Новый COMОбъект(«ADODB.Command»);
Команда.ActiveConnection = Соединение;

// Присвоение текста команды для создания таблицы
Команда.CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)»;
Команда.Execute(); // Выполнение команды

// Присвоение текста команды для добавления строки таблицы
Команда.CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)»;
Команда.Execute(); // Выполнение команды

// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение.Close();
Соединение = Неопределено;

Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:

// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект(«ADOX.Catalog»);
Книга.ActiveConnection = Соединение;

// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект(«ADOX.Table»);
Таблица.Name = «Лист1»;
Таблица.Columns.Append(«Колонка1», 202);
Таблица.Columns.Append(«Колонка2», 7);
Таблица.Columns.Append(«Колонка3», 5);
Таблица.Columns.Append(«Колонка4», 5);

// Создание в книге листа с описанной структурой
Книга.Tables.Append(Таблица);
Таблица = Неопределено;
Книга = Неопределено;

В приведенном примере в методе

Таблица.Columns.Append(«Колонка1», 202);

во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:

  • 5 — adDouble;
  • 6 — adCurrency;
  • 7 — adDate;
  • 11 — adBoolean;
  • 202 — adVarWChar;
  • 203 — adLongVarWChar.

Пример чтения:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект(«ADODB.Connection»);

// Установка строки соединения
Соединение.ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=»+ИмяФайла+«;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;»;
Соединение.Open(); // Открытие соединения

// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект(«ADODB.Recordset»);
ТекстЗапроса = «SELECT * FROM [Лист1$]»;

// Выполнение запроса
Выборка.Open(ТекстЗапроса, Соединение);

// Обход результата выборки
Пока НЕ Выборка.EOF() Цикл
ЗначениеКолонки1 = Выборка.Fields.Item(«Колонка1»).Value; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка.Fields.Item(0).Value; // Обращение по индексу колонки
Выборка.MoveNext();
КонецЦикла;

Выборка.Close();
Выборка = Неопределено;
Соединение.Close();
Соединение = Неопределено;

В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:

  • YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
  • NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.

В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:

  • Connection;
  • Command;
  • Recordset;
  • Record;
  • Fields;
  • Stream;
  • Errors;
  • Parameters;
  • Properties.

Выгрузка без программирования

Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.

Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.

Сохранение табличного документа 1С

В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.

Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:

  1. Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
  2. Сохранить табличный документ в требуемый формат.

Сохранение динамического списка

  • Главная
  • О сайте
  • Главная
  • Содержание

Рукопашный бой Карташ

Категории

—>

рубрики: ADO | Дата: 28 января, 2014

Несмотря на кажущуюся сложность, читать информацию из файлов Excel с помощью интерфейса ADO очень удобно. И по скорости это гораздо быстрее чем через COM соединение.

Прежде всего сформируем строку подключения



СтрокаСоединения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=ПутьКФайлу;Extended Properties=""Excel 12.0;HDR=YES"";Persist Security Info=False";

Несколько слов о параметрах строки подключения

Provider=Microsoft.ACE.OLEDB.12.0 — здесь мы выбираем провайдера подключения. Зависит от версии Excel. в данном случае используется провайдер для версии MS Excel 2010;

Data Source=ПутьКФайлу — путь к файлу Excel вида «С:musorMyFile.xlsx»;

Extended Properties=»Excel 12.0;HDR=YES» — дополнительные свойства. Первый параметр (Excel 12.0) зависит от версии Excel. HDR=YES означает что первая строка на листе не будет восприниматься как данные. И в этом случае в момент построения запроса данные находящиеся в первой строке воспринимаются как имена полей, что существенно облегчает жизнь при написании запроса, да и в момент обхода выборки обращаться к значениям выборки через имена гораздо удобней. Причем в этом случае абсолютно неважно в каком порядке расположены колонки в файле. Конечно это накладывает определенные ограничения на содержимое ячеек первой строки. Если в ячейке будет «Фамилия, имя, отчество», мы не сможем выбрать в запросе это поле. А вот если «ФИО» или «ФамилияИмяОтчество», то все отработает корректно.

Подключаемся к файлу



Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = СтрокаСоединения;

Попытка
	
	Connection.Open();
	
Исключение
	
	Сообщить ("Не удалось подключиться к файлу Excel" );
	Возврат;
	
КонецПопытки;

Сформируем текст запроса.
Допустим что в нашем файле на листе «Лист1» есть колонки «ФИО» и «ДатаРождения». Текст запроса будет выглядеть следующим образом (обратите внимание на знак $ после имени листа):



ТекстЗапроса =
"SELECT
|    Лист.ФИО				AS ФИО,
|    Лист.ДатаРождения 		AS ДатаРождения
|FROM
|    [Лист1$] as Лист"
;

Выполняем запрос.



Выборка = Новый COMОбъект("ADODB.Recordset");

Попытка
	
	Выборка.Open(ТекстЗапроса, Connection);
	
Исключение
	
	Сообщить ("Проблемы с выполнением запроса");
	Возврат;
	
КонецПопытки;

Делаем обход выборки и создаем таблицу значений с прочитанными данными.



Таблица = Новый ТаблицаЗначений;

Таблица.Колонки.Добавить("ФИО",	Новый ОписаниеТипов("Строка"));
Таблица.Колонки.Добавить("ДатаРождения", Новый ОписаниеТипов("Строка"));

Пока НЕ Выборка.EOF() Цикл

	НоваяСтрока = Таблица.Добавить();
	
	НоваяСтрока.ФИО = СокрЛП(Выборка.Fields.Item("ФИО").Value);
	ДатаСтрока = СокрЛП(Выборка.Fields.Item("ДатаРождения").Value);
	
	Выборка.MoveNext();

КонецЦикла;

Выборка.Close();

Содержание

  1. Как запрашивать и обновлять данные Excel с помощью ADO из ASP
  2. Аннотация
  3. Дополнительная информация
  4. Действия по созданию примера приложения
  5. Профессия — 1С
  6. Работа с файлами Excel
  7. Обмен через табличный документ
  8. Обмен через OLE
  9. Использование COMSafeArray
  10. Обмен через ADO
  11. Выгрузка без программирования

Как запрашивать и обновлять данные Excel с помощью ADO из ASP

Аннотация

В этой статье показано, как запрашивать и обновлять сведения в электронной таблице Excel с помощью объектов данных ActiveX (ADO) со страницы страниц Active Server (ASP). В этой статье также описываются ограничения, связанные с этим типом приложения.

Хотя приложения ASP и ADO поддерживают многопользовательский доступ, электронная таблица Excel этого не делает. Таким образом, этот метод запроса и обновления информации не поддерживает одновременный доступ нескольких пользователей.

Дополнительная информация

Чтобы получить доступ к данным в электронной таблице Excel для этого примера, используйте microsoft ODBC Driver for Excel. Создайте таблицу для доступа к данным, создав именованный диапазон в электронной таблице Excel.

Действия по созданию примера приложения

Создайте файл Excel ADOtest.xls со следующими данными на листе 1:

column1 столбец 2 столбец3
Rr Это 15
Bb test 20
Ee Работает 25

Если столбец в электронной таблице Excel содержит текст и числа, драйвер Excel ODBC не может правильно интерпретировать тип данных, которым должен быть столбец. Убедитесь, что все ячейки в столбце имеют одинаковый тип данных. Следующие три ошибки могут возникнуть, если каждая ячейка в столбце не имеет одного типа или у вас есть типы, смешанные между «текстом» и «общим»:

  1. Ошибка 80040e21 поставщика Microsoft OLE DB для драйверов ODBC. Свойства запроса не могут поддерживаться этим драйвером ODBC.
  2. Ошибка «80004005» поставщика Microsoft OLE DB для драйверов ODBC не может быть обновлена, так как не содержит столбцов, доступных для поиска, для использования в качестве ключа ожидания.
  3. Ошибка поставщика Microsoft OLE DB для драйверов ODBC «80004005» на основе запроса. Не удалось найти обновляемую строку.

Создайте именованный диапазон myRange1 в электронной таблице:

  1. Выделите области строк и столбцов, в которых находятся данные.
  2. В меню «Вставка» наведите указатель мыши на «Имя» и нажмите кнопку «Определить».
  3. Введите имя myRange1 для имени именованного диапазона.
  4. Нажмите кнопку ОК.

Именованный диапазон myRange1 содержит следующие данные:

column1 столбец 2 столбец3
Rr Это 15
Bb test 20
Ee Работает 25
  • ADO предполагает, что первая строка запроса Excel содержит заголовки столбцов. Таким образом, именованный диапазон должен содержать заголовки столбцов. Это поведение отличается от DAO.
  • Заголовки столбцов не могут быть числом. Драйвер Excel не может интерпретировать их и вместо этого возвращает ссылку на ячейку. Например, заголовок столбца «F1» будет неправильно инпретирован.

Создайте имя источника системных данных (DSN) ODBC, указывав на ADOTest.xls файла.

  1. В панель управления откройте администратор ODBC.
  2. На вкладке «Системный DSN» нажмите кнопку «Добавить».
  3. Выберите microsoft Excel Driver (*.xls) и нажмите кнопку «Готово». Если этот параметр не существует, необходимо установить драйвер Microsoft ODBC для Excel из программы установки Excel.
  4. Выберите ADOExcel для имени источника данных.
  5. Убедитесь, что для версии установлена правильная версия Excel.
  6. Щелкните «Выбрать книгу. «, перейдите к ADOTest.xls файла и нажмите кнопку «ОК».
  7. Нажмите кнопку «Параметры>>» и снимите флажок «Только для чтения».
  8. Нажмите кнопку «ОК» и еще раз нажмите кнопку «ОК».

Задайте разрешения для ADOTest.xls файла.

Если доступ к странице active Server выполняется анонимно, необходимо убедиться, что у анонимной учетной записи (IUSR_ ) по крайней мере есть доступ на чтение и запись (RW) к электронной таблице. Если вы хотите удалить сведения из электронной таблицы, необходимо предоставить соответствующие разрешения.

При проверке подлинности доступа к странице Active Server необходимо убедиться, что все пользователи, которые имеют доступ к приложению, имеют соответствующие разрешения.

Если вы не настроите соответствующие разрешения для электронной таблицы, вы получите сообщение об ошибке, аналогичное следующему:

Создайте страницу ASP и вставьте следующий код:

Сохраните и наведите имя на страницу активного сервера и просмотрите ее в браузере. Отобразится следующее:

Обновление выполнено в первой строке именованного диапазона (после заголовков).

Источник

Профессия — 1С

  • Excel (2)
  • Интеграция (6)
  • Виртуальные таблицы (3)

рубрики: ADO | Дата: 28 января, 2014

Несмотря на кажущуюся сложность, читать информацию из файлов Excel с помощью интерфейса ADO очень удобно. И по скорости это гораздо быстрее чем через COM соединение.

Прежде всего сформируем строку подключения

Несколько слов о параметрах строки подключения

Provider=Microsoft.ACE.OLEDB.12.0 — здесь мы выбираем провайдера подключения. Зависит от версии Excel. в данном случае используется провайдер для версии MS Excel 2010;

Data Source=ПутьКФайлу — путь к файлу Excel вида «С:musorMyFile.xlsx»;

Extended Properties=»Excel 12.0;HDR=YES» — дополнительные свойства. Первый параметр (Excel 12.0) зависит от версии Excel. HDR=YES означает что первая строка на листе не будет восприниматься как данные. И в этом случае в момент построения запроса данные находящиеся в первой строке воспринимаются как имена полей, что существенно облегчает жизнь при написании запроса, да и в момент обхода выборки обращаться к значениям выборки через имена гораздо удобней. Причем в этом случае абсолютно неважно в каком порядке расположены колонки в файле. Конечно это накладывает определенные ограничения на содержимое ячеек первой строки. Если в ячейке будет «Фамилия, имя, отчество», мы не сможем выбрать в запросе это поле. А вот если «ФИО» или «ФамилияИмяОтчество», то все отработает корректно.

Подключаемся к файлу

Сформируем текст запроса.
Допустим что в нашем файле на листе «Лист1» есть колонки «ФИО» и «ДатаРождения». Текст запроса будет выглядеть следующим образом (обратите внимание на знак $ после имени листа):

Делаем обход выборки и создаем таблицу значений с прочитанными данными.

Источник

Работа с файлами Excel

MS Excel давно стал стандартом для работы с электронными таблицами. В статье рассматриваются способы программной выгрузки и загрузки из 1С в файлы Excel.

Существует несколько способов программной работы с файлами Excel из 1С. Каждый из них имеет свои преимущества и недостатки.

Обмен через табличный документ

Данный способ простой. Его суть заключается в том, что объект ТабличныйДокумент имеет методы:

  • Записать ( ИмяФайла >, ТипФайлаТаблицы >) для выгрузки данных в файл;
  • Прочитать ( ИмяФайла >, СпособЧтенияЗначений >) для загрузки данных из файла.

Внимание!

Метод Записать () доступен как на клиенте, так и на сервере. Метод Прочитать () доступен только на стороне сервера. Необходимо помнить об этом
при планировании клиент-серверного взаимодействия.

Рассмотрим пример сохранения табличного документа в файл. Необходимо любым способом создать и заполнить объект ТабличныйДокумент, а выгрузка в файл осуществляется всего лишь одной строкой:

ТабДок . Записать ( ПутьКФайлу , ТипФайлаТабличногоДокумента . XLSX );

Здесь ТабДок — сформированный табличный документ, ПутьКФайлу — имя файла для выгрузки, ТипФайлаТабличногоДокумента.XLSX — формат создаваемого файла. Поддерживаются следующие форматы Excel:

  • XLS95 — формат Excel 95;
  • XLS97 — формат Excel 97;
  • XLSX — формат Excel 2007.

Загрузка из файла осуществляется также достаточно просто:

ТабДок = Новый ТабличныйДокумент ;
ТабДок . Прочитать ( ПутьКФайлу , СпособЧтенияЗначенийТабличногоДокумента.Значение );

Здесь ПутьКФайлу — путь к загружаемому файлу Excel. СпособЧтенияЗначенийТабличногоДокумента.Значение определяет, каким образом нужно интерпретировать данные, считываемые из исходного документа. Доступны варианты:

Обмен через OLE

Обмен через технологию OLE automation, пожалуй, самый распространенный вариант программной работы с файлами Excel. Он позволяет использовать весь функционал, предоставляемый Excel, но отличается медленной скоростью работы по сравнению с другими способами. Для обмена через OLE требуется установка MS Excel:

  • На компьютере конечного пользователя, если обмен происходит на стороне клиента;
  • На компьютере сервера 1С:Предприятие, если обмен происходит на стороне сервера.

Пример выгрузки:

// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Отключение вывода предупреждений и вопросов
Эксель . DisplayAlerts = Ложь;
// Создание новой книги
Книга = Эксель . WorkBooks . Add ();
// Позиционирование на первом листе
Лист = Книга . Worksheets ( 1 );

// Запись значения в ячейку
Лист . Cells ( НомерСтроки , НомерКолонки ). Value = ЗначениеЯчейки ;

// Сохранение файла
Книга . SaveAs ( ИмяФайла );

// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;

Примеры чтения:

// Создание COM-объекта
Эксель = Новый COMОбъект ( «Excel.Application» );
// Открытие книги
Книга = Эксель . Workbooks . Open ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;

// Закрытие книги
Книга . Close ( 0 );

// Закрытие Эксель и освобождение памяти
Эксель . Quit ();
Эксель = 0 ;

// Открытие книги
Книга = ПолучитьCOMОбъект ( ПутьКФайлу );
// Позиционирование на нужном листе
Лист = Книга . Worksheets ( 1 );

// Чтение значения ячейки, обычно здесь располагается цикл обхода ячеек
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;

// Закрытие книги
Книга . Application . Qui t ();

Для обхода всех заполненных строк листа Excel можно использовать следующие приемы:

// —— ВАРИАНТ 1 ——
КоличествоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;
Для НомерСтроки = 1 По КоличествоСтрок Цикл
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
КонецЦикла;

// —— ВАРИАНТ 2 ——
НомерСтроки = 0 ;
Пока Истина Цикл
НомерСтроки = НомерСтроки + 1 ;
ЗначениеЯчейки = Лист . Cells ( НомерСтроки , НомерКолонки ). Value ;
Если НЕ ЗначениеЗаполнено ( ЗначениеЯчейки ) Тогда
Прервать;
КонецЕсли;
КонецЦикла;

Вместо последовательного обхода всех строк листа можно выгрузить все данные в массив и работать с ним. Такой подход будет быстрее при чтении большого объема данных:

ВсегоКолонок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Column ;
ВсегоСтрок = Лист . Cells ( 1 , 1 ). SpecialCells ( 11 ). Row ;

Область = Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок ));
Данные = Область . Value . Выгрузить ();

В таблице ниже приведены наиболее востребованные свойства и методы для работы с Excel через OLE:

Действие Код Комментарий
Работа с приложением
Установка видимости окна приложения Эксель . Visible = Ложь;
Установка режима вывода предупреждений (выводить/не выводить) Эксель . DisplayAlerts = Ложь;
Закрытие приложения Эксель . Quit ();
Работа с книгой
Создание новой книги Книга = Эксель . WorkBooks . Add ();
Открытие существующей книги Книга = Эксель . WorkBooks . Open ( ИмяФайла );
Сохранение книги Книга . SaveAs ( ИмяФайла );
Закрытие книги Книга . Close ( 0 );
Работа с листом
Установка текущего листа Лист = Книга . WorkSheets ( НомерЛиста );
Установка имени Лист . Name = Имя ;
Установка защиты Лист . Protect ();
Снятие защиты Лист . UnProtect ();
Установка ориентации страницы Лист . PageSetup . Orientation = 2 ; 1 — книжная, 2 — альбомная
Установка левой границы Лист . PageSetup . LeftMargin = Эксель . CentimetersToPoints ( Сантиметры );
Установка верхней границы Лист . PageSetup . TopMargin = Эксель . CentimetersToPoints ( Сантиметры );
Установка правой границы Лист . PageSetup . RightMargin = Эксель . CentimetersToPoints ( Сантиметры );
Установка нижней границы Лист . PageSetup . BottomMargin = Эксель . CentimetersToPoints ( Сантиметры );
Работа со строками, колонками, ячейками
Установка ширины колонки Лист . Columns ( НомерКолонки ). ColumnWidth = Ширина ;
Удаление строки Лист . Rows ( НомерСтроки ). Delete ();
Удаление колонки Лист . Columns ( НомерКолонки ). Delete ();
Удаление ячейки Лист . Cells ( НомерСтроки , НомерКолонки ). Delete ();
Установка значения Лист . Cells ( НомерСтроки , НомерКолонки ). Value = Значение ;
Объединение ячеек Лист . Range ( Лист . Cells ( НомерСтроки , НомерКолонки ), Лист . Cells ( НомерСтроки1 , НомерКолонки1 )). Merge ();
Установка шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Name = ИмяШрифта ;
Установка размера шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Size = РазмерШрифта ;
Установка жирного шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Bold = 1 ; 1 — жирный шрифт, 0 — нормальный
Установка курсива Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Italic = 1 ; 1 — курсив, 0 — нормальный
Установка подчеркнутого шрифта Лист . Cells ( НомерСтроки , НомерКолонки ). Font . Underline = 2 ; 2 — подчеркнутый, 1 — нет

Для того, чтобы узнать какое свойство нужно менять или какой метод вызвать можно воспользоваться макросами Excel. Если записать макрос с требуемыми действиями, то после можно посмотреть программный код на VBA записанного макроса.

Использование COMSafeArray

При выгрузке больших объемов данных из 1С в Excel для ускорения можно использовать объект COMSafeArray. Согласно определению из синтакс-помощника, COMSafeArray — объектная оболочка над многомерным массивом SafeArray из COM. Позволяет создавать и использовать SafeArray для обмена данными между COM-объектами. Проще говоря, это массив значений, который можно использовать для обмена между приложениями по технологии OLE.

// Создание COMSafeArray
МассивКом = Новый COMSafeArray ( «VT_Variant» , ВсегоКолонок , ВсегоСтрок );
// Заполнение COMSafeArray
Для Стр = 0 По ВсегоСтрок — 1 Цикл
Для Кол = 0 По ВсегоКолонок — 1 Цикл
МассивКом . SetValue ( Кол , Стр , Значение );
КонецЦикла;
КонецЦикла;
// Присвоение области листа Excel значений из COMSafeArray
Лист . Range ( Лист . Cells ( 1 , 1 ), Лист . Cells ( ВсегоСтрок , ВсегоКолонок )). Value = МассивКом ;

Обмен через ADO

Файл Excel при обмене через ADO представляет собой базу данных, к которой можно обращаться при помощи SQL-запросов. Установка MS Excel не требуется, но обязательно наличие драйвера ODBC, при помощи которого будет осуществляться доступ. Используемый драйвер ODBC определяется при указании строки соединения к файлу. Обычно требуемый драйвер уже установлен на компьютере.

Обмен через ADO заметно быстрее обмена через OLE, но при выгрузке нет возможности использовать функционал Excel для оформления ячеек, разметки страниц, задания формул и т.д.

Пример выгрузки:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );

// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения

// Создание COM-объекта для команды
Команда = Новый COMОбъект ( «ADODB.Command» );
Команда . ActiveConnection = Соединение ;

// Присвоение текста команды для создания таблицы
Команда . CommandText = «CREATE TABLE [Лист1] (Колонка1 char(255), Колонка2 date, Колонка3 int, Колонка4 float)» ;
Команда . Execute (); // Выполнение команды

// Присвоение текста команды для добавления строки таблицы
Команда . CommandText = «INSERT INTO [Лист1] (Колонка1, Колонка2, Колонка3, Колонка4) values (‘абвгдеё’, ‘8/11/2017’, ‘12345’, ‘12345,6789’)» ;
Команда.Execute(); // Выполнение команды

// Удаление команды и закрытие соединения
Команда = Неопределено;
Соединение . Close ();
Соединение = Неопределено ;

Для создания нового листа и формирования его структуры можно воспользоваться объектами ADOX.Catalog и ADOX.Table. В этом случае код примет вид:

// Создание COM-объекта для работы с книгой
Книга = Новый COMОбъект ( «ADOX.Catalog» );
Книга . ActiveConnection = Соединение ;

// Создание COM-объекта для работы со структурой данных на листе
Таблица = Новый COMОбъект ( «ADOX.Table» );
Таблица . Name = «Лист1» ;
Таблица . Columns . Append ( «Колонка1» , 202 );
Таблица . Columns . Append ( «Колонка2» , 7 );
Таблица . Columns . Append ( «Колонка3» , 5 );
Таблица . Columns . Append ( «Колонка4» , 5 );

// Создание в книге листа с описанной структурой
Книга . Tables . Append ( Таблица );
Таблица = Неопределено;
Книга = Неопределено;

В приведенном примере в методе

Таблица . Columns . Append ( «Колонка1» , 202 );

во втором параметре указывается тип колонки. Параметр необязательный, вот некоторые значения типа колонки:

  • 5 — adDouble;
  • 6 — adCurrency;
  • 7 — adDate;
  • 11 — adBoolean;
  • 202 — adVarWChar;
  • 203 — adLongVarWChar.

Пример чтения:

// Создание COM-объекта для соединения
Соединение = Новый COMОбъект ( «ADODB.Connection» );

// Установка строки соединения
Соединение . ConnectionString = «
|Provider=Microsoft.ACE.OLEDB.12.0;
|Data Source=» + ИмяФайла + «;
|Extended Properties=»»Excel 12.0 XML;HDR=YES»»;» ;
Соединение . Open (); // Открытие соединения

// Создание COM-объекта для получения выборки
Выборка = Новый COMОбъект ( «ADODB.Recordset» );
ТекстЗапроса = «SELECT * FROM [Лист1$]» ;

// Выполнение запроса
Выборка . Open ( ТекстЗапроса , Соединение );

// Обход результата выборки
Пока НЕ Выборка . EOF () Цикл
ЗначениеКолонки1 = Выборка . Fields . Item ( «Колонка1» ). Value ; // Обращение по имени колонки
ЗначениеКолонки2 = Выборка . Fields . Item ( 0 ). Value ; // Обращение по индексу колонки
Выборка . MoveNext ();
КонецЦикла;

Выборка . Close ();
Выборка = Неопределено;
Соединение . Close ();
Соединение = Неопределено;

В строке соединения параметр HDR определяет как будет восприниматься первая строка на листе. Возможны варианты:

  • YES — первая строка воспринимается как названия колонок. К значениям можно обращаться по имени и по индексу колонки.
  • NO — первая строка воспринимается как данные. К значениям можно обращаться только по индексу колонки.

В приведенных примерах рассмотрено лишь несколько объектов ADO. Объектная модель ADO состоит из следующих объектов:

Выгрузка без программирования

Для сохранения данных из 1С в Excel не всегда целесообразно прибегать к программированию. Если в режиме Предприятия пользователь может отобразить требуемые для выгрузки данные, то, их возможно сохранить в Excel без программирования.

Для сохранения табличного документа (например, результата отчета) можно вызвать команду Сохранить или Сохранить как… главного меню.

В открывшемся окне требуется выбрать каталог, имя и формат сохраняемого файла.

Для сохранения данных динамических списков (например, списка номенклатуры) необходимо:

  1. Вывести данные в табличный документ при помощи команды Еще ⇒ Вывести список…;
  2. Сохранить табличный документ в требуемый формат.

Источник

Понравилась статья? Поделить с друзьями:
  • Загрузка excel файлов в power bi
  • Загрузка excel таблицы в табличный документ
  • Загрузка excel для 1с розница
  • Загрузка excel в массив
  • Загрузка excel в mysql php