1С и работа с Excel, OpenOffice/LibreOffice, ADODB

Нумерация строк и колонок начинается с 1!

http://www.1c-h.ru/?p=238 - перечислено множество функций для 1С 7.7 и 8.х

 Excel = Новый COMОбъект("Excel.application");
 Excel.WorkBooks.Open(ПолноеИмяФайла);
 Лист = Excel.Sheets(1); // Первый лист по индексу
Excel.DisplayAlerts = False;
 ВсегоКолонок = Лист.Cells(1,1).SpecialCells(11).Column;
 ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
 Excel.Application.Quit();
 Строка = Лист.Cells(Строка, Колонка).Value;

Нумерация колонок и строк начинается с 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();

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();     // Закрываем конект
                        Об_Конект=Неопределено;
                        Об_РекордСет=Неопределено;
 
                        Возврат Истина;
            Иначе
                        Сообщить("Файл "+ПутьКФайлу+" не найден!");
                        Возврат Ложь;
            КонецЕсли;
КонецФункции    
// 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;
 Сообщить(ОписаниеОшибки(),"!");
КонецПопытки;
КонецПроцедуры   
  • software/1c/1c-excel-openoffice.txt
  • Последнее изменение: 2017/05/09 18:34
  • 127.0.0.1