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; Сообщить(ОписаниеОшибки(),"!"); КонецПопытки; КонецПроцедуры