====== 1С и работа с Excel, OpenOffice/LibreOffice, ADODB ======
===== Excel =====
Нумерация строк и колонок начинается с 1!
http://www.1c-h.ru/?p=238 - перечислено множество функций для 1С 7.7 и 8.х
==== Открыть файл ====
Excel = Новый COMОбъект("Excel.application");
Excel.WorkBooks.Open(ПолноеИмяФайла);
Лист = Excel.Sheets(1); // Первый лист по индексу
==== Отключаем всякие вопросы со стороны Excel ====
Excel.DisplayAlerts = False;
==== Узнать количество строк и столбцов ====
ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
==== Закрыть файл ====
Excel.Application.Quit();
==== Прочитать значение из ячейки ====
Строка = Лист.Cells(Строка, Колонка).Value;
===== OpenOffice/LibreOffice =====
Нумерация колонок и строк начинается с 0!
==== Открыть документ ====
OpenOffice = Новый ComОбъект("com.sun.star.ServiceManager"); // Создаем СОМ-объект
scr = Новый ComОбъект("MSScriptControl.ScriptControl");
scr.language = "javascript";
scr.eval("MassivParametrov = new Array()");
MassivParametrov = scr.eval("MassivParametrov");
scr.AddObject("OpenOffice", OpenOffice);
scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
scr.eval("MassivParametrov[0].Name='Hidden'");
scr.eval("MassivParametrov[0].Value=true");
Desktop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); // Создаем Desktop
URL = ConvertToURL(ПолноеИмяФайла); // Правильно формируем имя файла
Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov);
Doc.lockControllers();
Doc.addActionLock();
Sheets = Doc.GetSheets();
Лист = Sheets.GetByIndex(0); // Открываем первый лист по индексу
и функция ConvertToURL:
// Для преобразования имени файла при обращении к OpenOffice/LibreOffice
Функция ConvertToURL(FileName)
ИмяФайла = СтрЗаменить(FileName," ","%20" );
ИмяФайла = СтрЗаменить(ИмяФайла,"\","/");
Возврат "file:/" + "/localhost/" + ИмяФайла;
КонецФункции
==== Узнать количество строк и столбцов ====
oCell = Лист.GetCellbyPosition(0, 0);
oCursor = Лист.createCursorByRange(oCell);
oCursor.GotoEndOfUsedArea(Истина);
aAddress = oCursor.RangeAddress;
ВсегоКолонок = aAddress.EndColumn;
ВсегоСтрок = aAddress.EndRow;
==== Закрыть файл ====
Doc.close(true);
Desktop.terminate();
==== Прочитать значение из ячейки ====
Читаем как строку:
Строка = Лист.getCellByPosition(Колонка,Строка).getText().String();
===== ADODB =====
http://help1c.com/faq8/view/702.html
Данный метод обладает гораздо большей производительностью и простотой, чем банальный объектный метод через COM соединение.
Все что потребуется это создание 2 объектов
* ADODB.Connection
* ADODB.Recordset
Здесь универсальная обработка по загрузке Номенклатуры из Excel:
// Функция для Платформы 1С 8.0 или 8.1
// Выполняет загрузку из файла 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 = "select
| 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(); // Закрываем конект
Об_Конект=Неопределено;
Об_РекордСет=Неопределено;
Возврат Истина;
Иначе
Сообщить("Файл "+ПутьКФайлу+" не найден!");
Возврат Ложь;
КонецЕсли;
КонецФункции
===== Быстрая загрузка данных большого размера файла Excel в многомерный Массив =====
// OldthiefXXX
Перем СерверExcel;
Процедура КнопкаВыполнитьНажатие(Кнопка)
ФайлХЛС=СерверExcel.Application.Workbooks.Open(ДокументХЛС);
КонечнаяСтрокаДанных=ФайлХЛС.ActiveSheet.UsedRange.Rows.Count;
КоличествоКолонокДанных=ФайлХЛС.ActiveSheet.UsedRange.Columns.Count;
Состояние("Загрузка в память данных ведомости...");
ExcelЛист=ФайлХЛС.ActiveSheet;
Область = СерверExcel.Range(ExcelЛист.Cells(1,1), ExcelЛист.Cells(КонечнаяСтрокаДанных,КоличествоКолонокДанных));
МассивДанныхEXEL = Область.Value.Выгрузить();
КонецПроцедуры
Процедура ИнициализацииЕкселя()
Состояние("Происходит инициализация EXCEL...");
Попытка
СерверExcel1 = Новый COMОбъект("Excel.Application");
СерверExcel1.DisplayAlerts = 0;
Исключение
ЗапущенExcel = 0;
Сообщить(ОписаниеОшибки(),"!");
КонецПопытки;
КонецПроцедуры
{{tag>1с excel эксель openoffice libreoffice опенофис либраофис}}