我花了幾個小時試圖在 Delphi 的 OpenOffice Calc 中對資料進行排序。我嘗試遵循基本(來自“OpenOffice.org Macros Explained”*)或 C# 中的示例,但仍然沒有結果。資料根本不會改變。我究竟做錯了什么?也許問題出在資料型別上?
* https://www.pitonyak.org/OOME_3_0.pdf,第 488 頁。
最小可重現示例:
program OpenOfficeCalcSortingIssue;
{$APPTYPE CONSOLE}
uses
System.SysUtils, Variants, ComObj, ActiveX;
var
StarOffice: OleVariant;
SODesktop: OleVariant;
SOCalc: OleVariant;
CalcSheets: OleVariant;
CalcSheet: OleVariant;
SortFields: OleVariant;
SortDescriptor: OleVariant;
begin
CoInitialize(nil);
try
try
StarOffice:=CreateOleObject('com.sun.star.ServiceManager');
SODesktop:=StarOffice.CreateInstance('com.sun.star.frame.Desktop');
SOCalc:=SODesktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, VarArrayCreate([0, -1], varVariant));
CalcSheets:=SOCalc.GetSheets;
CalcSheet:=CalcSheets.GetByIndex(0);
CalcSheet.GetCellByPosition(0, 0).SetValue(2);
CalcSheet.GetCellByPosition(0, 1).SetValue(1);
CalcSheet.GetCellByPosition(0, 2).SetValue(4);
CalcSheet.GetCellByPosition(0, 3).SetValue(3);
SortFields:=VarArrayCreate([0, 0], varVariant);
SortFields[0]:=StarOffice.Bridge_GetStruct('com.sun.star.util.SortField');
SortFields[0].Field:=0;
SortFields[0].SortAscending:=True;
SortDescriptor:=VarArrayCreate([0, 0], varVariant);
SortDescriptor[0]:=StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
SortDescriptor[0].Name:='SortFields';
SortDescriptor[0].Value:=SortFields;
CalcSheet.GetCellRangeByName('A1:A4').Sort(SortDescriptor);
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
CoUninitialize;
end;
end.
uj5u.com熱心網友回復:
像往常一樣,在將問題暴露給全世界后不久,解決方案就出現了:-) 我從互聯網的深處找到了一個例子。希望偶然發現這個問題的人可以更輕松地在 google 上搜索這個關于 SO 的主題。答案是:SortFields 不僅僅是一個變體陣列。它是一個“值物件”,必須像這樣設定:
ValueObject:=StarOffice.Bridge_GetValueObject;
ValueObject.Set('[]com.sun.star.table.TableSortField', SortFields);
在我發現的示例中,它被評論為“您必須指定將哪種型別的序列傳輸到 SortFields 屬性”。
所以整個代碼應該是:
StarOffice:=CreateOleObject('com.sun.star.ServiceManager');
SODesktop:=StarOffice.CreateInstance('com.sun.star.frame.Desktop');
SOCalc:=SODesktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0, VarArrayCreate([0, -1], varVariant));
CalcSheets:=SOCalc.GetSheets;
CalcSheet:=CalcSheets.GetByIndex(0);
CalcSheet.GetCellByPosition(0, 0).SetValue(2);
CalcSheet.GetCellByPosition(0, 1).SetValue(1);
CalcSheet.GetCellByPosition(0, 2).SetValue(4);
CalcSheet.GetCellByPosition(0, 3).SetValue(3);
SortFields:=VarArrayCreate([0, 0], varVariant);
SortFields[0]:=StarOffice.Bridge_GetStruct('com.sun.star.table.TableSortField');
SortFields[0].Field:=0;
SortFields[0].IsAscending:=True;
ValueObject:=StarOffice.Bridge_GetValueObject;
ValueObject.Set('[]com.sun.star.table.TableSortField', SortFields);
SortDescriptor:=VarArrayCreate([0, 0], varVariant);
SortDescriptor[0]:=StarOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue');
SortDescriptor[0].Name:='SortFields';
SortDescriptor[0].Value:=ValueObject;
CalcSheet.GetCellRangeByName('A1:A4').Sort(SortDescriptor);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/357955.html
標籤:排序 德尔福 openoffice.org 计算
