2016-07-23

【Delphi】LibreOffice/OpenOffice Calc 試算表 API 操作

參考資料 ----
API - OpenOffice
ISO 639
ISO 3166
Creating A Border In Calc Using VB 



注意:
現在 LibreOfficex86x64 版本,若您的程式是以 delphi32 編譯,就要搭配安裝 libreoffice x86 版本。

本篇筆記以 Delphi XE6 編譯 32 位元程式,搭配 LibreOffice_5.1.4_Win_x86


  1.  
  2. uses
  3. // 主要要有 uses 這兩個
  4. ... System.Variants, comobj;
  5.  
  6. procedure TForm1.Button1Click(Sender: TObject);
  7. var
  8. ServiceManager, StarDesktop, Document, args, Sheets, Sheet, myCol, Control,
  9. Range, cell, NumberFormats, LocalSettings, LineBorder,
  10. Border, TopLine, BottomLine, LeftLine, RightLine: Variant;
  11. col, row, i: integer;
  12. NumberFormatString: string;
  13. NumberFormatId: long;
  14. begin
  15. ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
  16. StarDesktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
  17. args := VarArrayCreate([0,1],varVariant);
  18. Document := StarDesktop.LoadComponentFromURL('private:factory/scalc','_blank',0, args);
  19. Sheets := Document.Sheets;
  20. // 第 1 張工作表的位置為 0
  21. // 插入一張新工作表, 參數 1 為工作表名稱, 參數 2 為工作表的位置順序
  22. // 當指定的位置大於現有的工作表數量時, 就是最後一張工作表
  23. Sheets.insertNewByName('oneMore',0);
  24. Sheets.insertNewByName('twoMore',4);
  25. Sheets.insertNewByName('threeMore',4);
  26. Sheets.insertNewByName('fourMore',4);
  27. Sheets.insertNewByName('五',4);
  28. Sheets.insertNewByName('六',3);
  29.  
  30. // 移除工作表
  31. Sheets.removeByName('twoMore');
  32.  
  33. // 顯示/隱藏 工作表
  34. Sheet := Sheets.getByName('oneMore');
  35. Sheet.IsVisible := false;
  36.  
  37. Sheet := Sheets.getByName('工作表1');
  38. // Calc 的欄、列是以 0 為起點
  39. col := 0; // 第 1 欄
  40. row := 9; // 第 10 列
  41. Sheet.getCellByPosition(col,row).string := 'test';
  42.  
  43. // 水平文字對齊
  44. // 0: STANDARD - 預設值
  45. // 1: LEFT - 靠左對齊
  46. // 2: CENTER - 置中
  47. // 3: RIGHT - 靠右對齊
  48. // 4: BLOCK - 左右對齊
  49. // 5: REPEAT - 重覆
  50. Sheet.getCellByPosition(0,0).string := '水平文字對齊-預設';
  51. Sheet.getCellByPosition(0,0).HoriJustify := 0;
  52. Sheet.getCellByPosition(1,0).string := '水平文字對齊-靠左對齊';
  53. Sheet.getCellByPosition(1,0).HoriJustify := 1;
  54. Sheet.getCellByPosition(2,0).string := '水平文字對齊-置中';
  55. Sheet.getCellByPosition(2,0).HoriJustify := 2;
  56. Sheet.getCellByPosition(3,0).string := '水平文字對齊 - 靠右對齊';
  57. Sheet.getCellByPosition(3,0).HoriJustify := 3;
  58. Sheet.getCellByPosition(4,0).string := '水平文字對齊 - 左右對齊';
  59. Sheet.getCellByPosition(4,0).HoriJustify := 4;
  60. Sheet.getCellByPosition(5,0).string := '水平文字對齊 - 重覆';
  61. Sheet.getCellByPosition(5,0).HoriJustify := 5;
  62.  
  63. // 垂直文字對齊
  64. // 0: STANDARD - 預設值
  65. // 1: TOP - 靠上對齊
  66. // 2: CENTER - 置中
  67. // 3: BOTTOM - 靠下對齊
  68. Sheet.getCellByPosition(0,1).string := '垂直文字對齊 - 預設值';
  69. Sheet.getCellByPosition(0,1).VertJustify := 0;
  70. Sheet.getCellByPosition(1,1).string := '垂直文字對齊 - 靠上對齊';
  71. Sheet.getCellByPosition(1,1).VertJustify := 1;
  72. Sheet.getCellByPosition(2,1).string := '垂直文字對齊 - 置中';
  73. Sheet.getCellByPosition(2,1).VertJustify := 2;
  74. Sheet.getCellByPosition(3,1).string := '垂直文字對齊 - 靠下對齊';
  75. Sheet.getCellByPosition(3,1).VertJustify := 3;
  76.  
  77. // 自動調整欄寬
  78. // 第 1 種寫法
  79. myCol := Sheet.Columns.getByIndex(0);
  80. myCol.OptimalWidth := true;
  81. // 第 2 種寫法
  82. Sheet.Columns.getByIndex(0).OptimalWidth := true;
  83.  
  84. // 凍結窗格
  85. Control := Document.getCurrentController;
  86. Control.freezeAtPosition(0,1);
  87.  
  88. // 合併儲存格
  89. Sheet.getCellByPosition(0,5).string := '合併儲存格';
  90. Range := Sheet.getCellRangeByName('A6:B10');
  91. Range.Merge(true);
  92.  
  93. // 畫儲存格框線
  94. LineBorder := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
  95. LineBorder.Color := RGB(0, 0, 0);
  96. // 目前只要 OuterLineWidth 和 InnerLineWidth 同時存在
  97. // 就畫不出框線, 只好先 disable 其中一個
  98. LineBorder.OuterLineWidth := 5;
  99. // LineBorder.InnerLineWidth := 1;
  100. // LineBorder.LineDistance := 50;
  101. Border := ServiceManager.Bridge_GetStruct('com.sun.star.table.TableBorder');
  102. Border.IsTopLineValid := true;
  103. Border.IsBottomLineValid := true;
  104. Border.IsLeftLineValid := true;
  105. Border.IsRightLineValid := true;
  106. Border.TopLine := LineBorder;
  107. Border.BottomLine := LineBorder;
  108. Border.LeftLine := LineBorder;
  109. Border.RightLine := LineBorder;
  110. Range.TableBorder := Border;
  111.  
  112. // 上框線
  113. TopLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
  114. TopLine.Color := RGB(255, 0, 0);
  115. TopLine.OuterLineWidth := 15;
  116. // 下框線
  117. BottomLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
  118. BottomLine.Color := RGB(0, 255, 0);
  119. BottomLine.OuterLineWidth := 15;
  120. // 左框線
  121. LeftLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
  122. LeftLine.Color := RGB(0, 0, 255);
  123. LeftLine.OuterLineWidth := 15;
  124. // 右框線
  125. RightLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
  126. RightLine.Color := RGB(255, 255, 0);
  127. RightLine.OuterLineWidth := 15;
  128. // 指定範圍內的水平框線
  129. Border.HorizontalLine := LineBorder;
  130. Border.IsHorizontalLineValid := true;
  131. // 指定範圍內的垂直框線
  132. Border.VerticalLine := LineBorder;
  133. Border.IsVerticalLineValid := true;
  134.  
  135. Border.TopLine := TopLine;
  136. Border.BottomLine := BottomLine;
  137. Border.LeftLine := LeftLine;
  138. Border.RightLine := RightLine;
  139. Sheet.getCellRangeByName('D10:F15').TableBorder := Border;
  140.  
  141. // 區域文字對齊
  142. // 0: 靠左
  143. // 1: 告右
  144. // 2: 自動折行
  145. // 3: 置中
  146. Range.ParaAdjust := 3;
  147.  
  148. // 以名稱方式指定 儲存格
  149. cell := sheet.getCellRangeByName('A1');
  150. // Cell 背景色
  151. // LibreOffice 的 RGB 剛好和 Delphi 順序相反, 是 B-G-R
  152. cell.CellBackColor := RGB(0,0,255); // 紅色
  153. // Cell 字體顏色
  154. cell.CharColor := RGB(0,255,0); // 綠色
  155. // Cell 英數字體高度, 對中文字無效
  156. cell.CharHeight := 50;
  157.  
  158.  
  159. // 設定數字格式
  160. LocalSettings := ServiceManager.Bridge_GetStruct('com.sun.star.lang.Locale');
  161. LocalSettings.Language := 'zh';
  162. LocalSettings.Country := 'tw';
  163.  
  164. NumberFormats := Document.NumberFormats;
  165. NumberFormatString := '#,##0.00';
  166.  
  167. NumberFormatId := NumberFormats.queryKey(NumberFormatString, LocalSettings, True);
  168. if (NumberFormatId=-1) then
  169. NumberFormatId := NumberFormats.addNew(NumberFormatString, LocalSettings);
  170.  
  171. // 以名稱方式指定 儲存格, 並輸入數字
  172. Sheet.getCellRangeByName('A15').Value := 13579;
  173. Sheet.getCellRangeByName('A15').NumberFormat := NumberFormatId;
  174. Sheet.getCellRangeByName('A16').Value := -24680;
  175. Sheet.getCellRangeByName('A16').NumberFormat := NumberFormatId;
  176. // 輸入公式
  177. Sheet.getCellRangeByName('A17').Formula := '=SUM(A15:A16)';
  178.  

1 則留言: