Сообщение от
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;
Скажу сразу, что в качестве кода класса скопировал кусок одного из своих старых модулей, а часть кода написал прямо здесь, поэтому мог ошибиться. Если есть желание - пиши после праздников в аську, поболтаем на эту тему.