Имя: Пароль:
1C
 
1С и LibreOffice
,
0 kalisto
 
12.08.14
23:37
Доброго времени суток.
Подскажите плиз, как правильно обратиться к LibreOffice.
Мне нужно данные из ТЧ документа выгрузить в файл xls. А на серваке стоит либерти.
1 Alexor
 
12.08.14
23:46
А платформа какая?
2 Поpyчик-4
 
12.08.14
23:51
3 kalisto
 
12.08.14
23:51
1C - 8.2.19.83
LibreOffice - dthcbz 3.6.1.2
4 kalisto
 
12.08.14
23:51
* версия
5 Defender aka LINN
 
12.08.14
23:55
(0) А разница, что стоит на сервере? От этого параметры метода "Записать" меняются, что ли?
6 Alexor
 
12.08.14
23:58
+5 Кстати да. Я думал загружать надо
7 kalisto
 
13.08.14
00:00
и загружать тоже потом надо будет
8 Defender aka LINN
 
13.08.14
00:08
(7) Ну вот с этого и начинать надо было :)
http://api.libreoffice.org/examples/examples.html#OLE_examples
9 GreatOne
 
13.08.14
00:46
Есть вот такое:
    Функция мПрочитатьТабличныйДокументИзOpenOffice(ТабличныйДокумент, ИмяФайла, НомерЛистаExcel = 1) Экспорт
        
        
        ВыбФайл = Новый Файл(ИмяФайла);
        Если НЕ ВыбФайл.Существует() Тогда
            Сообщить("Файл не существует!");
            Возврат Ложь;
        КонецЕсли;
        
        Попытка
            scr = Новый COMОбъект("MSScriptControl.ScriptControl");
            scr.language = "javascript";
            scr.eval("MyArray=new Array()");
            ServiceManager=Новый COMОбъект("com.sun.star.ServiceManager");
            scr.AddObject("ServiceManager",ServiceManager);
            scr.eval("MyArray[0]=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue')");
            scr.eval("MyArray[0].Name='Hidden'");
            scr.eval("MyArray[0].Value=true");
            Массив = scr.eval("MyArray");
            
            Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop");
            Document = Desktop.LoadComponentFromURL("file://localhost/"+ИмяФайла, "_blank", 0, Массив);
            Листы = Document.getSheets();
            Лист = Листы.getByIndex(0);
        Исключение
            Сообщить("Ошибка.");
            Возврат ложь;    
        КонецПопытки;
        
        
        
        
        ТабличныйДокумент.Очистить();
        
        oCell = Лист.GetCellbyPosition(0, 0);
        oCursor = Лист.createCursorByRange(oCell);
        oCursor.GotoEndOfUsedArea(Истина);
        aAddress = oCursor.RangeAddress;
        ВсегоКолонок = aAddress.EndColumn;
        ВсегоСтрок = aAddress.EndRow;
        
        Для Строка = 0 По ВсегоСтрок Цикл
            Для Столбец = 0 По ВсегоКолонок Цикл
                ТабличныйДокумент.Область("R" + (Строка+1) +"C" + (Столбец+1)).Текст = Лист.getCellByPosition(Столбец,Строка).String;
                
            КонецЦикла;
            
        КонецЦикла;
        Document.Close(-1);
        Сообщить("Количество строк в документе: " + (ВсегоСтрок+1) + "
        |Количество столбцов в документе: " + (ВсегоКолонок+1));
        
        Возврат Истина;
        
        
    КонецФункции
10 kalisto
 
13.08.14
01:47
(9) Классно. Спасибо. Если бы у вас еще был такой же пример для выгрузки в файл...
11 GreatOne
 
13.08.14
02:20
(10)OpenOffice пример выгрузки в формат Excel (зарплата на карту Альфа-Банка)
Хороший пример, там весь код OO с пояснениями. Склеить в единое целое "ТекстКода" и будет понятнее, а то шелухи много.
12 GreatOne
 
13.08.14
02:21
я бы даже сказал пример вообще зачетный. Ставлю себе закладку)
13 Злопчинский
 
13.08.14
02:23
а что - там суперспецифичные для экселя особенности используются? тупо сформировать макет и программно сохранить в эксель - не прокатит..?
14 МастерВопросов
 
13.08.14
06:25
(10) Процедура КнопкаВыполнитьНажатие(Кнопка)

Перем РезультатЗапроса, СписокТиповЦен;

ВыполнитьЗапросПостроителя(РезультатЗапроса, СписокТиповЦен);

//Прочитать файл из макета 1С
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xls");
МакетПрайса = ПолучитьМакет("ШаблонПрайсаXLS");
МакетПрайса.Записать(ИмяВременногоФайла);


ИмяФайлаОО = СтрЗаменить(ИмяВременногоФайла," ","%20");
ИмяФайлаОО = СтрЗаменить(ИмяФайлаОО,"\","/");


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.LoadComponentFromURL("file:///"+СокрЛП(ИмяФайлаОО), "_blank", 0, MassivParametrov);

//Чтение
//ТекущийЛист = ФайлОбмена.sheets.getByIndex(НомерЛиста);
//КоличествоСтрокНаЛисте = ТекущийЛист.rows.count - 1;
//Для НомерСтроки = 0 По КоличествоСтрокНаЛисте Цикл
//
//Для НомерЛиста = 0 По ФайлОбмена.sheets.count - 1 Цикл

//ДеньСобытия1 = ТекущийЛист.getCellByPosition(1, НомерСтроки).Value;
//КонецЦикла;
//КонецЦикла;


//Запись
ТекущийЛист = ФайлОбмена.sheets.getByIndex(1);
Состояние("Заполняем: "+ТекущийЛист.Name);

НомерКолонки = 4;
Для каждого СтрСписокТиповЦен Из СписокТиповЦен Цикл
ТекущийЛист.getCellByPosition(НомерКолонки,1).string = СокрЛП(СтрСписокТиповЦен);
//ТекущийЛист.Cell(НомерКолонки,1).Range.Font.Bold = 0;
//ТекущийЛист.getCellByPosition(НомерКолонки,1).Size = 9;
ТекущийЛист.getCellByPosition(НомерКолонки,2).string = "Цена";
ТекущийЛист.getCellByPosition(НомерКолонки+1,2).string = "Ед.";
Диапазон = ТекущийЛист.getCellRangeByPosition(НомерКолонки,1,НомерКолонки+1,1);
Диапазон.Merge(ИСТИНА); //Объединение ячеек
НомерКолонки = НомерКолонки + 2;
КонецЦикла;

//**** Начало работы с бордюром
Диапазон = ТекущийЛист.getCellRangeByPosition(1,1,НомерКолонки-1,2);
ЛинияБордюра = scr.eval("OpenOffice.Bridge_GetStruct('com.sun.star.table.BorderLine')");
ЛинияБордюра.OuterLineWidth = 35;
ЛинияБордюра.InnerLineWidth = 0;
ЛинияБордюра.Color = 0;

Бордюр = Диапазон.TableBorder;
Бордюр.IsTopLineValid = 1;
Бордюр.IsBottomLineValid = 1;
Бордюр.IsLeftLineValid = 1;
Бордюр.IsRightLineValid = 1;
Бордюр.IsHorizontalLineValid = 1;
Бордюр.IsVerticalLineValid = 1;
Бордюр.TopLine = ЛинияБордюра;
Бордюр.BottomLine = ЛинияБордюра;
Бордюр.LeftLine = ЛинияБордюра;
Бордюр.RightLine = ЛинияБордюра;
Бордюр.HorizontalLine = ЛинияБордюра;
Бордюр.VerticalLine = ЛинияБордюра;

Диапазон.TableBorder = Бордюр;
Диапазон.CharWeight = 150; // Жирный
Диапазон.CharHeight = 9;
//Центрирование 2 / 3 / 1
Диапазон.ParaAdjust = 3;

//Sheet2.getCellRangeByName(""A1:B1"").CharWeight = 100 // Normal
//**** Конец работы с бордюром


Выборка = РезультатЗапроса.Выбрать();
НомерСтроки = 2;
ТекНоменклатура = "";
Пока Выборка.Следующий() Цикл
Если Выборка.Цена <> NULL Тогда
Если ТекНоменклатура = Выборка.Ссылка Тогда
Иначе
//НомерСтроки = ТекущийЛист.rows.count;
НомерСтроки = НомерСтроки + 1;
//Сообщить(СтрЗаменить(Формат(Выборка.Цена,"ЧЦ=15; ЧДЦ=2; ЧРД=."),Символы.НПП,""));
ТекущийЛист.getCellByPosition(1,НомерСтроки).string = СокрЛП(Выборка.Код);
ТекущийЛист.getCellByPosition(2,НомерСтроки).string = СокрЛП(Выборка.Артикул);
ТекущийЛист.getCellByPosition(3,НомерСтроки).string = СокрЛП(Выборка.НаименованиеПолное);
ТекНоменклатура = Выборка.Ссылка;
КонецЕсли;
//выводим тип цен
ИндексТипаЦены = СписокТиповЦен.Найти(Выборка.ТипЦен);
Если ИндексТипаЦены <> Неопределено Тогда
ИндексТипаЦены = ((ИндексТипаЦены+1)*2);
//Если ВыводитьКолонкуБренд Тогда
// ИндексТипаЦены = ИндексТипаЦены +1;
//КонецЕсли;
ТекущийЛист.getCellByPosition(2+ИндексТипаЦены,НомерСтроки).string = Формат(Выборка.Цена,"ЧЦ=15; ЧДЦ=2; ЧРД=.");
ТекущийЛист.getCellByPosition(3+ИндексТипаЦены,НомерСтроки).string = СокрЛП(Выборка.ЕдиницаИзмерения);
КонецЕсли;

КонецЕсли;
КонецЦикла;

НомерКолонки = 4;
Для каждого СтрСписокТиповЦен Из СписокТиповЦен Цикл
Диапазон = ТекущийЛист.getCellRangeByPosition(НомерКолонки,3,НомерКолонки,НомерСтроки);
//Центрирование 2 / 3 / 1
Диапазон.ParaAdjust = 1;
Диапазон.CharWeight = 150; // Жирный
Диапазон = ТекущийЛист.getCellRangeByPosition(НомерКолонки+1,3,НомерКолонки+1,НомерСтроки);
Диапазон.ParaAdjust = 3;
НомерКолонки = НомерКолонки + 2;
КонецЦикла;

//**** Начало работы с бордюром
//Диапазон = ТекущийЛист.getCellRangeByName("B4:F"+СокрЛП(НомерСтроки+1));
Диапазон = ТекущийЛист.getCellRangeByPosition(1,3,НомерКолонки-1,НомерСтроки);
ЛинияБордюра = scr.eval("OpenOffice.Bridge_GetStruct('com.sun.star.table.BorderLine')");
ЛинияБордюра.OuterLineWidth = 25;
ЛинияБордюра.InnerLineWidth = 0;
ЛинияБордюра.Color = 0;

Бордюр = Диапазон.TableBorder;
Бордюр.IsTopLineValid = 1;
Бордюр.IsBottomLineValid = 1;
Бордюр.IsLeftLineValid = 1;
Бордюр.IsRightLineValid = 1;
Бордюр.IsHorizontalLineValid = 1;
Бордюр.IsVerticalLineValid = 1;
Бордюр.TopLine = ЛинияБордюра;
Бордюр.BottomLine = ЛинияБордюра;
Бордюр.LeftLine = ЛинияБордюра;
Бордюр.RightLine = ЛинияБордюра;
Бордюр.HorizontalLine = ЛинияБордюра;
Бордюр.VerticalLine = ЛинияБордюра;

Диапазон.TableBorder = Бордюр;
//**** Конец работы с бордюром



ФайлОбмена.store();
//ФайлОбмена.storeAsURL("file:///"+СокрЛП(ИмяФайлаОО),MassivParametrov);
ФайлОбмена.Close(Истина);

ЗапуститьПриложение(ИмяВременногоФайла);

КонецПроцедуры
15 miliko
 
13.08.14
07:08
(0) сохранить табличный документ как XML или даже HTML
16 miliko
 
13.08.14
07:09
табличное поле сорри
18 strange2007
 
13.08.14
09:35
(16) или как xlsx
19 vlandev
 
13.08.14
09:40
А выгрузить в xls через MS-ADO возможно?
20 strange2007
 
13.08.14
09:41
(19) Средствами 1С выгружай. Создаёшь нужный таб.док. и вызываешь его метод "Сохранить" с параметрами формата сохранения
21 kalisto
 
14.08.14
06:15
(14) Спасибо за пример.
22 kalisto
 
14.08.14
06:16
(15) Тоже вариант. Как-то про это сразу и не подумалось.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший