• Авторизация


Экспорт данных в 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
Комментарии (1):
17-12-2009-07:59 удалить
Куча печали, не работает(


Комментарии (1): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Экспорт данных в OpenOffice.org Calc | Бляндер - Ничто на свете не проходит бесследно... | Лента друзей Бляндер / Полная версия Добавить в друзья Страницы: раньше»