Показать сообщение отдельно

  #9  
Старый 06.01.2010, 08:03
StealthMaster
Познающий
Регистрация: 03.12.2008
Сообщений: 56
Провел на форуме:
140714

Репутация: 29
По умолчанию

Цитата:
Сообщение от ronald  
Подскажите, как из StringGrid при помощи Delphi конвертировать данные в таблицу через OpenOffice.org (есть способ через MS Excel, но есть необходимость использовать средства OpenOffice). Версия дельфей - седьмая.
И ещё: как определить количество строк в StringGrid?
За количество строк отвечает свойство RowCount
Код:
smth := StringGrid1.RowCount;
По поводу вставки текста в OpenOffice. Подключаешься к серверу автоматизации ОО, создаешь новый или открываешь имеющийся документ, вставляешь текст в нужную ячейку.

Вот класс, который реализует часть нужных действий:

Код:
type
   TOpenOffice = class
      function Connect: boolean;
      procedure Disconnect;
      function CreateDocument (Application: string): boolean;
      procedure InsertTextCalc(Text: string; Index: integer = 0;
      col: integer = 0; row: integer = 0; Border: boolean = false;
      Bold: boolean = false);
      
   private
      StarOffice: Variant;
      Document: Variant;
   end;

implementation
{$D+,L+}

function TOpenOffice.Connect: boolean;
begin
   if VarIsEmpty(StarOffice) then
      StarOffice := CreateOleObject('com.sun.star.ServiceManager');
   Result := not (VarIsEmpty(StarOffice) or VarIsNull(StarOffice));
end;

procedure TOpenOffice.Disconnect;
begin
   StarOffice := Unassigned;
end;


function TOpenOffice.CreateDocument(Application: String): boolean;
var
   StarDesktop: Variant;
begin
   StarDesktop := StarOffice.createInstance('com.sun.star.frame.Desktop');
   Document := StarDesktop.LoadComponentFromURL(
                  'private:factory/s'+Application, '_blank', 0,
                  VarArrayCreate([0, -1], varVariant));
   Result := not (VarIsEmpty(Document) or VarIsNull(Document));
end;


procedure TOpenOffice.InsertTextCalc(Text: string; Index: integer = 0;
            col: integer = 0; row: integer = 0; Border: boolean = false;
            Bold: boolean = false);
var
  Sheets, Sheet, Cell, Struct: variant;
begin
   Sheets := Document.GetSheets;
   Sheet := Sheets.getByIndex(Index);
   Cell := Sheet.getCellByPosition(col, row);
   Cell.setString(Text);

   if Border then
    begin
      Struct := StarOffice.Bridge_GetStruct('com.sun.star.table.BorderLine');

      Struct.lineDistance := 0;
      Struct.innerLineWidth := 0;
      Struct.outerLineWidth := 1;

      cell.leftBorder := Struct;
      Cell.rightBorder := Struct;
      Cell.topBorder := Struct;
      Cell.bottomBorder := Struct;

    end;

   if Bold then
    Cell.CharWeight:= 200;
end;

end; // TOpenOffice
А использовать примерно так:
Код:
var
  OpenOffice: TOpenOffice

procedure TfmMain.bOOConnectClick(Sender: TObject);
begin
  OpenOffice := TOpenOffice.Create;
  OpenOffice.Connect;
  OpenOffice.CreateDocument('calc');
  OpenOffice.InsertTextCalc(StringGrid1.Cells[1,1], 0, 1, 1, true);
  OpenOffice.Disconnect;
end;
Скажу сразу, что в качестве кода класса скопировал кусок одного из своих старых модулей, а часть кода написал прямо здесь, поэтому мог ошибиться. Если есть желание - пиши после праздников в аську, поболтаем на эту тему.

Последний раз редактировалось StealthMaster; 06.01.2010 в 08:05..
 
Ответить с цитированием