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)';
謝謝版大...這篇很有用,明天試試看
回覆刪除