Показать сообщение отдельно
Старый 11.09.2013, 01:41   #2
YuKa2000
Неактивный пользователь
 
Пол:Мужской
Регистрация: 10.01.2008
Сообщений: 8
Репутация: 2
По умолчанию Re: Delphi + Excel => Delphi + Calc

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

Последний раз редактировалось YuKa2000; 11.09.2013 в 01:50..
YuKa2000 вне форума
 
Ответить с цитированием Вверх
 
Время генерации страницы 0.02156 секунды с 10 запросами