API - OpenOffice
ISO 639
ISO 3166
Creating A Border In Calc Using VB
注意:
現在 LibreOffice 有 x86 和 x64 版本,若您的程式是以 delphi32 編譯,就要搭配安裝 libreoffice x86 版本。
本篇筆記以 Delphi XE6 編譯 32 位元程式,搭配 LibreOffice_5.1.4_Win_x86。
uses
// 主要要有 uses 這兩個
... System.Variants, comobj;
procedure TForm1.Button1Click(Sender: TObject);
var
ServiceManager, StarDesktop, Document, args, Sheets, Sheet, myCol, Control,
Range, cell, NumberFormats, LocalSettings, LineBorder,
Border, TopLine, BottomLine, LeftLine, RightLine: Variant;
col, row, i: integer;
NumberFormatString: string;
NumberFormatId: long;
begin
ServiceManager := CreateOleObject('com.sun.star.ServiceManager');
StarDesktop := ServiceManager.createInstance('com.sun.star.frame.Desktop');
args := VarArrayCreate([0,1],varVariant);
Document := StarDesktop.LoadComponentFromURL('private:factory/scalc','_blank',0, args);
Sheets := Document.Sheets;
// 第 1 張工作表的位置為 0
// 插入一張新工作表, 參數 1 為工作表名稱, 參數 2 為工作表的位置順序
// 當指定的位置大於現有的工作表數量時, 就是最後一張工作表
Sheets.insertNewByName('oneMore',0);
Sheets.insertNewByName('twoMore',4);
Sheets.insertNewByName('threeMore',4);
Sheets.insertNewByName('fourMore',4);
Sheets.insertNewByName('五',4);
Sheets.insertNewByName('六',3);
// 移除工作表
Sheets.removeByName('twoMore');
// 顯示/隱藏 工作表
Sheet := Sheets.getByName('oneMore');
Sheet.IsVisible := false;
Sheet := Sheets.getByName('工作表1');
// Calc 的欄、列是以 0 為起點
col := 0; // 第 1 欄
row := 9; // 第 10 列
Sheet.getCellByPosition(col,row).string := 'test';
// 水平文字對齊
// 0: STANDARD - 預設值
// 1: LEFT - 靠左對齊
// 2: CENTER - 置中
// 3: RIGHT - 靠右對齊
// 4: BLOCK - 左右對齊
// 5: REPEAT - 重覆
Sheet.getCellByPosition(0,0).string := '水平文字對齊-預設';
Sheet.getCellByPosition(0,0).HoriJustify := 0;
Sheet.getCellByPosition(1,0).string := '水平文字對齊-靠左對齊';
Sheet.getCellByPosition(1,0).HoriJustify := 1;
Sheet.getCellByPosition(2,0).string := '水平文字對齊-置中';
Sheet.getCellByPosition(2,0).HoriJustify := 2;
Sheet.getCellByPosition(3,0).string := '水平文字對齊 - 靠右對齊';
Sheet.getCellByPosition(3,0).HoriJustify := 3;
Sheet.getCellByPosition(4,0).string := '水平文字對齊 - 左右對齊';
Sheet.getCellByPosition(4,0).HoriJustify := 4;
Sheet.getCellByPosition(5,0).string := '水平文字對齊 - 重覆';
Sheet.getCellByPosition(5,0).HoriJustify := 5;
// 垂直文字對齊
// 0: STANDARD - 預設值
// 1: TOP - 靠上對齊
// 2: CENTER - 置中
// 3: BOTTOM - 靠下對齊
Sheet.getCellByPosition(0,1).string := '垂直文字對齊 - 預設值';
Sheet.getCellByPosition(0,1).VertJustify := 0;
Sheet.getCellByPosition(1,1).string := '垂直文字對齊 - 靠上對齊';
Sheet.getCellByPosition(1,1).VertJustify := 1;
Sheet.getCellByPosition(2,1).string := '垂直文字對齊 - 置中';
Sheet.getCellByPosition(2,1).VertJustify := 2;
Sheet.getCellByPosition(3,1).string := '垂直文字對齊 - 靠下對齊';
Sheet.getCellByPosition(3,1).VertJustify := 3;
// 自動調整欄寬
// 第 1 種寫法
myCol := Sheet.Columns.getByIndex(0);
myCol.OptimalWidth := true;
// 第 2 種寫法
Sheet.Columns.getByIndex(0).OptimalWidth := true;
// 凍結窗格
Control := Document.getCurrentController;
Control.freezeAtPosition(0,1);
// 合併儲存格
Sheet.getCellByPosition(0,5).string := '合併儲存格';
Range := Sheet.getCellRangeByName('A6:B10');
Range.Merge(true);
// 畫儲存格框線
LineBorder := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
LineBorder.Color := RGB(0, 0, 0);
// 目前只要 OuterLineWidth 和 InnerLineWidth 同時存在
// 就畫不出框線, 只好先 disable 其中一個
LineBorder.OuterLineWidth := 5;
// LineBorder.InnerLineWidth := 1;
// LineBorder.LineDistance := 50;
Border := ServiceManager.Bridge_GetStruct('com.sun.star.table.TableBorder');
Border.IsTopLineValid := true;
Border.IsBottomLineValid := true;
Border.IsLeftLineValid := true;
Border.IsRightLineValid := true;
Border.TopLine := LineBorder;
Border.BottomLine := LineBorder;
Border.LeftLine := LineBorder;
Border.RightLine := LineBorder;
Range.TableBorder := Border;
// 上框線
TopLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
TopLine.Color := RGB(255, 0, 0);
TopLine.OuterLineWidth := 15;
// 下框線
BottomLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
BottomLine.Color := RGB(0, 255, 0);
BottomLine.OuterLineWidth := 15;
// 左框線
LeftLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
LeftLine.Color := RGB(0, 0, 255);
LeftLine.OuterLineWidth := 15;
// 右框線
RightLine := ServiceManager.Bridge_GetStruct('com.sun.star.table.BorderLine');
RightLine.Color := RGB(255, 255, 0);
RightLine.OuterLineWidth := 15;
// 指定範圍內的水平框線
Border.HorizontalLine := LineBorder;
Border.IsHorizontalLineValid := true;
// 指定範圍內的垂直框線
Border.VerticalLine := LineBorder;
Border.IsVerticalLineValid := true;
Border.TopLine := TopLine;
Border.BottomLine := BottomLine;
Border.LeftLine := LeftLine;
Border.RightLine := RightLine;
Sheet.getCellRangeByName('D10:F15').TableBorder := Border;
// 區域文字對齊
// 0: 靠左
// 1: 告右
// 2: 自動折行
// 3: 置中
Range.ParaAdjust := 3;
// 以名稱方式指定 儲存格
cell := sheet.getCellRangeByName('A1');
// Cell 背景色
// LibreOffice 的 RGB 剛好和 Delphi 順序相反, 是 B-G-R
cell.CellBackColor := RGB(0,0,255); // 紅色
// Cell 字體顏色
cell.CharColor := RGB(0,255,0); // 綠色
// Cell 英數字體高度, 對中文字無效
cell.CharHeight := 50;
// 設定數字格式
LocalSettings := ServiceManager.Bridge_GetStruct('com.sun.star.lang.Locale');
LocalSettings.Language := 'zh';
LocalSettings.Country := 'tw';
NumberFormats := Document.NumberFormats;
NumberFormatString := '#,##0.00';
NumberFormatId := NumberFormats.queryKey(NumberFormatString, LocalSettings, True);
if (NumberFormatId=-1) then
NumberFormatId := NumberFormats.addNew(NumberFormatString, LocalSettings);
// 以名稱方式指定 儲存格, 並輸入數字
Sheet.getCellRangeByName('A15').Value := 13579;
Sheet.getCellRangeByName('A15').NumberFormat := NumberFormatId;
Sheet.getCellRangeByName('A16').Value := -24680;
Sheet.getCellRangeByName('A16').NumberFormat := NumberFormatId;
// 輸入公式
Sheet.getCellRangeByName('A17').Formula := '=SUM(A15:A16)';
謝謝版大...這篇很有用,明天試試看
回覆刪除