Экспорт данных в OpenOffice.org Calc
15-12-2007 10:13
к комментариям - к полной версии
- понравилось!
Занимаюсь переводом документооборота юридической организации с MS Office на OpenOffice.org. Для начала скачал SDK, начиталсся api. Все было бы замечательно, если бы писал на .NET или Java, там просто подключаются сборки и все просто. Через COM в Delphi 7 почему то не все работает
Вот например кусок кода, как быстро выгрузить в OpenOffice.org большой массив данных:
var ServiceManager,vDesktop,Excel,Sheets,Sheet,Range:Variant;
i,j:integer;
begin
..........
ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
vDesktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
Excel := vDesktop.LoadComponentFromURL('file:///'+Shablon,'_blank',0,VarArrayCreate([0, - 1], varVariant));
//В случае, если необходимо создать новый документ, пишем:
//Excel := vDesktop.LoadComponentFromURL('private:factory/scalc','_blank',0,VarArrayCreate([0, - 1], varVariant))
Sheets := Excel.GetSheets;
Sheet:=Sheets.getByIndex(0);
//Выгружаем на лист данные объекта Grid типа TStringGrid
Range:= VarArrayCreate([1,Grid.ColCount,1,Grid.RowCount],varVariant);
For i:=0 to Grid.RowCount-1 do
For j:=0 to Grid.ColCount-1 do
Range[j+1,i+1]:=Grid.Cells[j,i];
Sheet.getCellRangeByName(PointToRange(X,Y)+':'+PointToRange(X+Grid.ColCount-1,Y+Grid.RowCount-1)).setDataArray(Range);
end;
Стоит отметить, что функция VarArrayCreate создает массив из объектов типа varVariant, в данном случае - Variant, с двумя измерениями, где первый индекс изменяется от 1 до Grid.ColCount, второй от 1 до Grid.RowCount.
Sheet.getCellRangeByName может вызвать RunTime Exception в случае если размерность Range не совпадает с диапозоном, куда эти данные помещаются, а именно: PointToRange(X,Y)+':'+PointToRange(X+Grid.ColCount-1,Y+Grid.RowCount-1)
Для справки: удобная функция
Function PointToRange(X,Y:Integer):String;
Var S1,S2:String; k:Integer;
Begin
Repeat
k:=X mod 27;
S1:=Letters[k+1]+S1;
k:=X div 26;
until k<=X;
S2:=IntToStr(Y+1);
Result:=S1+S2
End;
, где Const Letters='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
вверх^
к полной версии
понравилось!
в evernote