Немного не понятно, что значит работать с Calc-ом?
1. Пересохранить созданный *.xls в формате *.ods?
2. Просто открыть созданный *.xls в OO Calc?
3. Или же создавать с "нуля" в Calc?
1. Можно открыть файл в OO Calc (LoadComponentFromURL) и сохранить его (StoreToURL).
2. Да можно через реестр назначить для файлов xls программу Calc по-умолчанию и сохраненный файл будет открываться в Calc.
Но все это будет бесполезно, если установлен только OpenOffice.
3. Изменить код.
И еще, в качестве небольшого замечания - желательна проверка установленных как Excel, так и OO. Например, с помощью функции:
Код:
{УСТАНОВЛЕНО ЛИ ПРИЛОЖЕНИЕ}
function IsAppl(nApp: String): boolean;
var
ClassID: TCLSID;
Rez : HRESULT;
begin
Rez := CLSIDFromProgID(PWideChar(WideString(nApp)), ClassID);
if Rez = S_OK then
result := true
else
result := false;
end;
Вызов:
Код:
if IsAppl('Excel.Application') then {код};
if IsAppl('com.sun.star.ServiceManager') then {код};
По п.3 алгоритм примерно такой:
Код:
{ФУНКЦИЯ ФОРМИРОВАНИЯ ПАРАМЕТРОВ}
function MakePV(ServiceManager:variant;PropertyName:string;PropertyValue:variant):variant;
begin
Result:=ServiceManager.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
Result.Name:=PropertyName;
Result.Value:=PropertyValue;
end;
//======
//Подключаемся к запущенному OO или создаем новый
StarOffice := CreateOleObject('com.sun.star.ServiceManager');
//Получаем рабочую область
Desktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop');
//Создаем документ
SM := CreateOleObject('com.sun.star.ServiceManager');
Ar:=VarArrayCreate([0,0],varVariant);
Ar[0] := MakePV(SM,'Hidden',false);
Document := Desktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, Ar);
//Получаем листы
Sheets := Document.GetSheets;
//Получаем первый лист
Sheet := Sheets.getByIndex(0);
//Получаем интерфейс Dispatch
ooDispatch := StarOffice.createInstance('com.sun.star.frame.DispatchHelper');
//Получаем Область Документа
ooFrame := Document.CurrentController.Frame;
//А далее уже работа с ячейками и с документом
Sheet.getCellRangeByPosition(1,1,Count,3).ClearContents(16);
...
Sheet.getCellByPosition(i-1,j-1).Value := StringGrid1.Cells[j,i];
...
С форматом ячеек сложнее, но в интернете обсуждений много. Как собственно и с сохранением в файл.
Все переменные типа Variant. Для ранних ОО (до версии 1.1.4) алгоритм работы кое-где отличается, поэтому, если есть необходимость можно проверять версию и писать разный код.