Долго бился с OO, конечно. В конце концов оказалось проще сделать выгрузку отчета на базе template (шаблона).
Вот пример создания экземпляра документа OO из шаблона:
X++:
void createdocument()
{
COM MyStruct;
COM oDeskTop;
int i;
COMVariant arg;
COMVariant byte;
Array arr = new Array(Types::Class);
ComDispFunction Func;
COMVariant varArg1 = new COMVariant();
COMVariant var = new COMVariant();
str filepath;
;
//Создание экземпляра OpenOffice.org
OpenOffice = new Com("com.sun.star.ServiceManager");
oDeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop");
MyStruct = OpenOffice.Bridge_GetStruct("com.sun.star.beans.PropertyValue");
Func = new COMDispFunction(MyStruct, "Name", COMDispContext::PropertyPut);
varArg1.bStr("AsTemplate");
Func.call(varArg1);
Func = new COMDispFunction(MyStruct, "Value", COMDispContext::PropertyPut);
varArg1.boolean(true);
Func.call(varArg1);
var = COMVariant::createFromCOM(MyStruct);
arr.value(1,var);
// Создание документа
arg = COMVariant::createFromArray(arr);
filepath = "file://///path_to_template";
oDocument = oDeskTop.LoadComponentFromURL(filepath, "_blank", 0, arg);
}
Обращение к листу:
X++:
oSheets = oDocument.getSheets();
oSheet = oSheets.getByIndex(0);
Вставка значения в ячейку:
X++:
oRange = oSheet.getCellByPosition(5,0);
oRange.Setstring("Пример");
Форматирование ячейки:
X++:
#define.BOLD(150)
#define.FONTNAME("Arial Cyr")
#define.FONTHEIGHT(10)
;
oRange.setPropertyValue("CharWeight", #BOLD);
oRange.setPropertyValue("CharFontName", #FONTNAME);
oRange.setPropertyValue("CharHeight", #FONTHEIGHT);
oRange.setPropertyValue("HoriJustify",2);
Объединение ячейки:
Видимость столбца:
X++:
oColumn = oSheet.getColumns();
oColumn_new=oColumn.getByIndex(0);
oColumn_new.setPropertyValue("IsVisible", False);
Ширина столбца:
X++:
oColumn = oSheet.getColumns();
oColumn_new=oColumn.getByIndex(0);
oColumn_new.setPropertyValue("Width",2440);
Для установки границ ячейки применяю отдельный метод:
X++:
void SetBorder(COM range,boolean _left=true,boolean _right=true,boolean _top=true,boolean _bottom=true)
{
COM MyStruct;
ComDispFunction func;
COMVariant varArg1 = new COMVariant();
;
MyStruct = OpenOffice.Bridge_GetStruct("com.sun.star.table.BorderLine");
func = new COMDispFunction(MyStruct, "OuterLineWidth", COMDispContext::PropertyPut);
varArg1.int(1);
func.call(varArg1);
func = new COMDispFunction(MyStruct, "InnerLineWidth", COMDispContext::PropertyPut);
varArg1.int(0);
func.call(varArg1);
func = new COMDispFunction(MyStruct, "LineDistance", COMDispContext::PropertyPut);
varArg1.int(0);
func.call(varArg1);
if (_top)
range.SetPropertyValue('TopBorder', MyStruct);
if (_left)
range.SetPropertyValue('LeftBorder', MyStruct);
if (_right)
range.SetPropertyValue('RightBorder', MyStruct);
if (_bottom)
range.SetPropertyValue('BottomBorder', MyStruct);
}
Пример использования:
X++:
oRange = oSheet.getCellRangeByName("A1:B1");
this.SetBorder(oRange);
Для моих задач этого мне хватило. Такие вещи, как: ориентация листа, масштаб, поля..это все в template выставил..
Надеюсь это кому-то поможет..