Консультация № 170831
27.07.2009, 12:36
0.00 руб.
0 1 0
Здравствуйте уважаемые эксперты. 1С Предприятие 8.1, выгрузка данных в OpenOffice calc. Данные успешно выгружаются в шаблон Ms office excel 2007 через Новый COMОбъект("Excel.Application") у кого стоит MS Office 2007, но у некоторых наших бухов стоит OpenOffice v3.0. Нужен рабочий пример подключения к документу excel OpenOffice. Заранее спасибо!

Обсуждение

Неизвестный
28.07.2009, 08:50
общий
Иван Ч:

Похоже, Вам нужно, чтобы OpenOffice.Calc открывался из 1С и работал с .XLS документом? Напишите, пожалуйста, подробно, что у Вас уже есть, что получилось, и как должно быть.

А по этой ссылке описана интеграция OpenOffice Calc с 1С 7.7. По восьмерке попадались обработки, работающие с OpenOffice, но они платные и я не стал их смотреть.

Вот пример кода для семерки. Можно попробовать его перевести в код 8. Автор использует скрипт на бейсике, чтобы было проще работать с массивами.

Цитата: www.forum.mista.ru
Код:
   ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
ScrptCtrl.Language="vbscript";
ТекстКода =
"Function MakePropertyValue(cName, uValue)
| Set oSM = CreateObject(""com.sun.star.ServiceManager"")
| Set oPropertyValue = oSM.Bridge_GetStruct(""com.sun.star.beans.PropertyValue"")
| oPropertyValue.Name = cName
| oPropertyValue.Value = uValue
| Set MakePropertyValue = oPropertyValue
|End Function
|
|Function ConvertToUrl(strFile)
| strFile = Replace(strFile, """", ""/"")
| strFile = Replace(strFile, "":"", ""|"")
| strFile = Replace(strFile, "" "", ""%20"")
| strFile = ""file:///"" + strFile

| ConvertToUrl = strFile
|End Function
|
|Sub MySub
|
| Dim oSM, ODesk
| Dim oDoc
| Dim OpenPar(0)
| Dim Sheet1, Sheet2
| Dim oBorder, oTableBorder
| Dim my1(0)
|
| 'Instanciate OOo : the first line is always required from Visual Basic for OOo
| Set oSM = CreateObject(""com.sun.star.ServiceManager"")
| Set oDesk = oSM.createInstance(""com.sun.star.frame.Desktop"")
|
| 'Откроем с параметром Скрытый
| Set OpenPar(0) = MakePropertyValue(""Hidden"", True)
| 'Создадим пустую книгу в ОО
| Set oDoc = oDesk.loadComponentFromURL(""private:factory/scalc"", ""_blank"", 0, OpenPar)
| 'Обратимся к листам
| Set Sheet1 = oDoc.Sheets.GetByIndex(0)
| Set Sheet2 = oDoc.Sheets.GetByIndex(1)
| 'Переименуем листы
| Sheet1.setName(""Info"")
| Sheet2.setName(""Payments"")
|
| 'Оставим только 2 листа, остальные удалим
| For i=2 to (oDoc.Sheets.Count - 1)
| oDoc.Sheets.removeByName(oDoc.Sheets.GetByIndex(2).getName())
| Next
|
| Sheet1.getCellByPosition(0, 0).setFormula(""Наименование организации"")
| Sheet1.getCellByPosition(0, 1).setFormula(""ИНН организации"")
| Sheet1.getCellByPosition(0, 2).setFormula(""Расчетный счет"")
| Sheet1.getCellByPosition(0, 3).setFormula(""Id организации"")";

НаименованиеОрганизации = "Тест";
Если спФирм.ТекущаяСтрока() > 0 Тогда
Зн = спФирм.ПолучитьЗначение(спФирм.ТекущаяСтрока());
Если ПустоеЗначение(Зн) = 0 Тогда
ТекстКода = ТекстКода +
"
| Sheet1.getCellByPosition(1, 0).setFormula(""" + Зн.Получить("Наименование") + """)
|
| Sheet1.getCellByPosition(1, 1).NumberFormat = 1
| Sheet1.getCellByPosition(1, 1).setValue(""" + Зн.Получить("ИНН") + """)
|
| Sheet1.getCellByPosition(1, 2).NumberFormat = 100
| Sheet1.getCellByPosition(1, 2).setFormula(""'"" & """ + Зн.Получить("НомерСчета") + """)
|";
НаименованиеОрганизации = Зн.Получить("Наименование");
КонецЕсли;
КонецЕсли; //"Если ПустоеЗначение(спФирм.ТекущаяСтрока()) > 0 Тогда



ТекстКода = ТекстКода +
"
|
| Sheet1.getCellByPosition(0, 4).setFormula(""Дата подготовки файла"")
| Sheet1.getCellByPosition(1, 4).NumberFormat = 36
| Sheet1.getCellByPosition(1, 4).setFormula(""" + Строка(ТекущаяДата()) + """)
|
| Sheet1.getCellByPosition(0, 5).setFormula(""Дата платежной ведомости"")
| Sheet1.getCellByPosition(1, 5).NumberFormat = 36
| Sheet1.getCellByPosition(1, 5).setFormula(""" + Строка(ТекущаяДата()) + """)
|
| Sheet1.getCellByPosition(0, 6).setFormula(""Основание (код)"")
| " + ?(спВидПлатежа.ТекущаяСтрока() > 0, "Sheet1.getCellByPosition(1, 6).setFormula(""" + спВидПлатежа.ПолучитьЗначение(спВидПлатежа.ТекущаяСтрока()) +""")", "Sheet1.getCellByPosition(1, 6).setFormula(""1"")") + "
|
| Sheet1.getCellByPosition(0, 7).setFormula(""Валюта ПВ"")
| Sheet1.getCellByPosition(1, 7).setFormula(""RUR"")
| Sheet1.getCellRangeByName(""A1:A9"").CharColor = 16711680
| Sheet1.getCellRangeByName(""A1:A9"").CharWeight = 150
|
| 'Ширина колонок
| Sheet1.Columns.GetByName(""A"").Width = 6000
| Sheet1.Columns.GetByName(""B"").Width = 4100
|
| 'Построим границы у ячеек
| Set oTableBorder = Sheet1.getCellRangeByName(""A1"").TableBorder
|
| With oTableBorder
|
| Set oBorder = .TopLine
|
| With oBorder
| .Color = 0
| .InnerLineWidth = 0
| .OuterLineWidth = 35
| .LineDistance = 0
| End With
|
| .TopLine = oBorder
| .IsTopLineValid = True
|
| .BottomLine = oBorder
| .IsBottomLineValid = True
|
| .LeftLine = oBorder
| .IsLeftLineValid = True
|
| .RightLine = oBorder
| .IsRightLineValid = True
|
| .HorizontalLine = oBorder
| .IsHorizontalLineValid = True
|
| .VerticalLine = oBorder
| .IsVerticalLineValid = True
|
| .Distance = 0
| .IsDistanceValid = True
| End With
|
| Sheet1.getCellRangeByName(""A1:B8"").TableBorder = oTableBorder
|
| 'Лист 2
| 'Установим форматы на колонки
| 'Sheet2.getCellRangeByName(""B1:B1000"").NumberFormat = 2
| 'Sheet2.getCellRangeByName(""A1:A1000"").NumberFormat = 100
| Sheet2.Columns.GetByName(""B"").NumberFormat = 2
| Sheet2.Columns.GetByName(""A"").NumberFormat = 100
|
| 'Ширина колонок
| Sheet2.Columns.GetByName(""A"").Width = 4200
| Sheet2.Columns.GetByName(""B"").Width = 2000
|
| 'Заголовок
| Sheet2.getCellByPosition(0, 0).setFormula(""Номер счета"")
| Sheet2.getCellByPosition(1, 0).setFormula(""Сумма"")
| Sheet2.getCellRangeByName(""A1:B1"").CharColor = 16711680
| Sheet2.getCellRangeByName(""A1:B1"").CharWeight = 150";


ВремТЗ = СоздатьОбъект("ТаблицаЗначений");
ВыбВыплатаЗаработнойПлаты.ВыгрузитьТабличнуюЧасть(ВремТЗ);

СписокСотрудников = СоздатьОбъект("ТаблицаЗначений");
СписокСотрудников.НоваяКолонка("Сотрудник", "Справочник.Сотрудники");
СписокСотрудников.НоваяКолонка("НомерСчета", "Строка");
СписокСотрудников.НоваяКолонка("Сумма", "Число");

НомерСтроки = 1;

ВремТЗ.ВыбратьСтроки();
Пока ВремТЗ.ПолучитьСтроку() > 0 Цикл

Сотрудник = ВремТЗ.Сотрудник;
Сумма = ВремТЗ.Сумма + ВремТЗ.Компенсация;

Если (ПустоеЗначение(Сумма) = 1) ИЛИ (ПустоеЗначение(Сотрудник) = 1) Тогда
Сообщить("Пропущена строка: " + Строка(ВремТЗ.НомерСтроки) + " сотрудник: " + СокрЛП(Сотрудник) + " сумма: " + Строка(Сумма));
Продолжить;
КонецЕсли;

НомерСчета = СокрЛП(Сотрудник.НомерЗарплатногоСчета);

Если ПустоеЗначение(НомерСчета) = 1 Тогда
Сообщить("Пропущена строка: " + Строка(ВремТЗ.НомерСтроки) + " сотрудник: " + СокрЛП(Сотрудник) + " сумма: " + Строка(Сумма) + " не указан номер счета");
Продолжить;
КонецЕсли;

СписокСотрудников.НоваяСтрока();
СписокСотрудников.Сотрудник = Сотрудник;
СписокСотрудников.НомерСчета = НомерСчета;
СписокСотрудников.Сумма = Сумма;

ТекстКода = ТекстКода + "
|
| Sheet2.getCellByPosition(0, " + НомерСтроки +").setFormula(""'"" & """ + Строка(НомерСчета) + """)
| Sheet2.getCellByPosition(1, " + НомерСтроки +").setValue(" + Сумма + ")
|
|";

НомерСтроки = НомерСтроки + 1;

КонецЦикла; //"Пока ВремТЗ.ПолучитьСтроку() > 0 Цикл


ИмяФайла = СокрЛП(Путь);
Если Прав(Путь, 1) <> "" Тогда
ИмяФайла = ИмяФайла + "";
КонецЕсли;

ИмяФайла = ИмяФайла + Формат(ТекущаяДата(),"ДГГГГММДД") + " " + СокрЛП(НаименованиеОрганизации) + ".xls";
ИмяФайла = СтрЗаменить(ИмяФайла, """", "");

Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда
Если Вопрос("Перезаписать файл" + РазделительСтрок + """" + ИмяФайла + """?", "Да+Нет+Отмена", 30) <> "Да" Тогда
Возврат;
КонецЕсли;
КонецЕсли; //"Если ФС.СуществуетФайл(ИмяФайла) = 1 Тогда


ТекстКода = ТекстКода +
"
| 'Запишем в формате Excel
| Set my1(0) = MakePropertyValue(""FilterName"", ""MS Excel 97"")
| Call oDoc.storeToURL(convertToURL(""" + ИмяФайла + """), my1)
|
| 'Закроем все
| Set oDesk = Nothing
| Set oSM = Nothing
|
|End Sub
|";

//Сообщить(ТекстКода);

ScrptCtrl.AddCode(ТекстКода);
ScrptCtrl.Run("MySub");

Сообщить("Записан файл: " + ИмяФайла);
ЗапуститьПриложение(ИмяФайла);
Форма ответа