下面我們通過一個例子,來了解一下日常宏編程中最常面臨的任務(因為使用了全局表達式,請將【工具】》【選項】》【編譯】》【禁止全局作用域表達式】取消勾選):
1 /*提供一些表格相關的工具函數與常數*/ 2 const XLS = { 3 //數據有效性類型枚舉 Range.Validation.Add(...)方法的第一個參數 4 XlDVType : { 5 xlValidateInputOnly : 0,//僅在用戶更改值時進行驗證。 6 xlValidateWholeNumber : 1,//全部數值。 7 xlValidateDecimal : 2,//數值。 8 xlValidateList : 3,//值必須存在於指定列表中。 9 xlValidateDate : 4,//日期值。 10 xlValidateTime : 5,//時間值。 11 xlValidateTextLength : 6,//文本長度。 12 xlValidateCustom : 7//使用任意公式驗證數據有效性。 13 }, 14 15 //常用顏色常數 16 Colors : { 17 Black : 0, //黑色 18 DarkRed : 192, //深紅 19 Red : 255, //紅色 20 Orange : 49407, //橙色 21 Yellow : 65535, //黃色 22 LightGreen : 5296274, //淺綠 23 Green : 5287936, //綠色 24 LightBlue : 15773696, //淺藍 25 Blue : 12611584, //藍色 26 DarkBlue : 6299648, //深藍 27 Purpose : 10498160, //紫色 28 Magenta : 0xFF00FF, //紫紅色 29 Cyan : 0xFFFF00, //青色 30 White : 0xFFFFFF, //白色 31 32 }, 33 /* 34 獲取鼠標選取的單元格區域對象 35 prompt : 對話框提示信息 36 title : 對話框標題 37 must : 是否強制返回一個單元格區域對象 38 */ 39 GetRange : function(prompt = '請用鼠標框選單元格區域', 40 title = '選取單元格區域', must = false) { 41 if (!g.IsType(prompt, 'String') || 42 !g.IsType(title, 'String') || 43 !g.IsType(must, 'Boolean')) 44 throw new TypeError('參數 prompt/title/must 分別必' + 45 '須是 String/String/Boolean 對象'); 46 47 if (must) title += '[必須]'; 48 49 while(true) { 50 var rng = Application.InputBox(prompt, title, undefined, 51 undefined, undefined, undefined, undefined, 8); 52 if (!must) break; 53 if (must && (typeof rng == 'object')) break; 54 } 55 56 return rng; 57 }, 58 59 /*獲取指定列的列字母 60 columnIndex : 列序數,Number 類型 61 */ 62 GetColumnLetter : function(columnIndex) { 63 if (!g.IsType(columnIndex, 'Number')) 64 throw new TypeError('參數 columnIndex 必須是一個數字'); 65 66 if (columnIndex <= 0 || columnIndex > 16384) 67 throw new Error('Please make sure 1 <= columnIndex <= 16384.'); 68 69 let address = ActiveSheet.Columns.Item(columnIndex).Address(); 70 return address.substr(1, address.indexOf(':') - 1); 71 }, 72 73 /* 74 功能:為單元格區域的每個單元格值上面加(數字)或追加(文本)指定數據 75 value : 要加/追加的值 76 rng : 目標單元格區域 77 */ 78 AddOrAppend : function(value, rng) { 79 if (!(typeof value == 'string' || 80 typeof value == 'number')) 81 throw new Error('Parameter "value" must be a number/string object.'); 82 83 if (typeof rng == 'undefined') 84 rng = XLS.GetRange(undefined, undefined, true); 85 86 if (rng.constructor.name != 'Range') 87 throw new Error('Parameter "rng" must be a Range object.'); 88 89 for (let iArea = 1; iArea <= rng.Areas.Count; iArea++) { 90 let area = rng.Areas.Item(iArea); 91 for (let iRow = 1; iRow <= area.Rows.Count; iRow++) { 92 for (let iColumn = 1; iColumn <= area.Columns.Count; iColumn++) { 93 let cell = area.Cells.Item(iRow, iColumn); 94 if (typeof cell.Value2 == 'undefined') 95 cell.Value2 = value; 96 else 97 cell.Value2 += value; 98 } 99 } 100 } 101 }, 102 103 /*獲取單元格區域的所有數據,如果有多個子區域,將返回一個多維數組, 104 否則,返回一維數組*/ 105 GetValues : function(rng) { 106 if (typeof rng == 'undefined') 107 rng = XLS.GetRange(undefined, undefined, true); 108 109 if (rng.constructor.name != 'Range') 110 throw new Error('Parameter "rng" must be a Range object.'); 111 112 let result = []; 113 for (let iArea = 1; iArea <= rng.Areas.Count; iArea++) { 114 let values = []; 115 let area = rng.Areas.Item(iArea); 116 for (let iRow = 1; iRow <= area.Rows.Count; iRow++) { 117 for (let iColumn = 1; iColumn <= area.Columns.Count; iColumn++) { 118 values.push(area.Cells.Item(iRow, iColumn).Value()); 119 } 120 } 121 result.push(values); 122 } 123 if (result.length == 1) 124 return result[0]; 125 else 126 return result; 127 }, 128 129 /*獲取單元格區域的完全引用的地址*/ 130 GetRangeFullAddress : function(rng) { 131 if (typeof rng == 'undefined') 132 rng = XLS.GetRange(undefined, undefined, true); 133 134 if (rng.constructor.name != 'Range') 135 throw new Error('Parameter "rng" must be a Range object.'); 136 137 return "'" + rng.Worksheet.Parent.Path + "\\[" + 138 rng.Worksheet.Parent.Name + "]" + rng.Worksheet.Name + 139 "'!" + rng.Address(); 140 }, 141 142 /*為單元格區域創建簡單的邊框*/ 143 MakeSimpleBorders : function(rng, color, weight, lineStyle) { 144 if (!XLS.IsRange(rng)) 145 throw new TypeError('參數 rng 必須是一個單元格區域對象'); 146 147 if (typeof color == 'undefined') 148 color = 0; //黑色 149 if (typeof color != 'number' || 150 Math.ceil(color) != color) 151 throw new TypeError('參數 color 必須是一個整數'); 152 if (typeof weight == 'undefined') 153 weight = xlThin; //細 154 if (typeof weight != 'number' || 155 Math.ceil(weight) != weight) 156 throw new TypeError('參數 weight 必須是一個整數'); 157 if (typeof lineStyle == 'undefined') 158 lineStyle = xlContinuous; 159 if (typeof lineStyle != 'number' || 160 Math.ceil(lineStyle) != lineStyle) 161 throw new TypeError('參數 lineStyle 必須是一個整數'); 162 163 let indices = [xlEdgeLeft, xlEdgeTop, 164 xlEdgeBottom, xlEdgeRight, 165 xlInsideHorizontal, xlInsideVertical]; 166 for (let index of indices) { 167 (obj=>{ 168 obj.Weight = weight; 169 obj.LineStyle = lineStyle; 170 obj.Color = color; 171 })(rng.Borders.Item(index)); 172 } 173 }, 174 175 /*判斷一個對象是否是 Range 類型的對象*/ 176 IsRange : function(rng) { 177 return g.IsType(rng, 'Range'); 178 }, 179 180 SetFormatConditionByExampleRange : function() { 181 {//與用戶交互,取得操作需要的輸入 182 //指定數據表所在的單元格區域 183 let title = '選取數據表'; 184 let prompt = '請用鼠標框選你要按值表樣例加設條件格式的工作' + 185 '表數據所在的單元格區域(請不要連帶選中表頭行)'; 186 var rngMain = XLS.GetRange(prompt, title, true); 187 188 //指定值表樣例所在的單元格區域 189 title = '選取值表樣例'; 190 prompt = '請用鼠標框選你要設置條件格式參照的值表樣例所在的' + 191 '單元格區域(請確保設置了格式)'; 192 var rngExample = XLS.GetRange(prompt, title, true); 193 194 //指定條件格式的基准列 195 title = '選取條件格式基准列'; 196 prompt = '請用鼠標選取為數據表設置條件格式時的基准列'; 197 var rngBaseColumn; 198 while(true) { 199 rngBaseColumn = XLS.GetRange(prompt, title, true); 200 if (rngBaseColumn.Columns.Count > 1) 201 alert('此類型條件的基准列只能是一列,請只選擇一個列'); 202 else { 203 if (Application.Intersect(rngBaseColumn, rngMain) == undefined) 204 alert('你指定的基准列與之前選取的數據表之間沒有交集,所以' + 205 '此列不能作為基准列,請重新選取'); 206 else 207 break; 208 } 209 } 210 } 211 212 {//為條件格式准備需要的公式 213 let rngIntersect = Application.Intersect(rngBaseColumn, rngMain); 214 let addrFirstCell = rngIntersect.Cells.Item(1).Address(); 215 let columnAddress = addrFirstCell.substr( 216 0, addrFirstCell.lastIndexOf('$')); 217 var tempFormula = '=INDIRECT("Column" & ROW()) = "Value"'; 218 tempFormula = tempFormula.replace('Column', columnAddress); 219 } 220 221 //從值表樣例單元格區域創建可迭代對象,以迭代每個單元格 222 let ociCells = new OfficeCollectionIterator(rngExample); 223 //按值表樣例增加條件格式 224 for (let cell of ociCells) { 225 let info = { 226 Value : cell.Value(), 227 BackColor : cell.Interior.Color, 228 }; 229 //因為是要寫在公式中,雙寫可能存在的引號 230 if (typeof info.Value === 'string') 231 info.Value = info.Value.replace('"', '""'); 232 let fcFormula = tempFormula.replace('Value', info.Value); 233 let formatCondition = rngMain.FormatConditions 234 .Add(xlExpression, -1, fcFormula, "", 235 undefined, undefined, undefined, undefined); 236 //formatCondition.SetFirstPriority(); 237 formatCondition.Interior.Color = info.BackColor 238 formatCondition.StopIfTrue = false; 239 } 240 }, 241 242 /*列出菜單欄清單*/ 243 ListAllCommandBarsInTable : function() { 244 let cbs = new OfficeCollectionIterator( 245 Application.CommandBars); 246 let data = Enumerable.from(cbs) 247 .select((cb, i) => [i, cb.Name, 248 cb.NameLocal, cb.Type, cb.BuiltIn]) 249 .toArray(); 250 //寫數據到表 251 let writter = new XLSTableWritter( 252 '序號,名稱,友好名,類型,內建?'.split(','), data, '菜單欄清單', 253 '類型有:\n0 => 默認菜單欄;\n1 => 菜單欄;\n2 => 快捷菜單'); 254 writter.WriteTo(new Range('B40')); 255 }, 256 257 258 } 259 /*一個數據表測試 260 它向外靜態提供了一個數據表的完整數據 261 並以實例的方式圍繞一個數據表,向用戶初步測試各類相關對象與功能 262 */ 263 class XLSExample { 264 constructor(rng) { 265 if (rng == null || 266 rng == undefined || 267 rng.constructor.name != 'Range') 268 throw new TypeError('要求傳入的 rng 參數是一個單元格區域對象'); 269 270 this.TopLeftCell = rng.Cells.Item(1); 271 this.RowCount = XLSExample.Data.length; 272 this.ColumnCount = XLSExample.Headers.length; 273 //標題區域 274 this.TitleRange = this.TopLeftCell.Resize(1, this.ColumnCount); 275 //表頭區域 276 this.HeadersRange = this.TopLeftCell.Offset(1, 0) 277 .Resize(1, this.ColumnCount); 278 //主數據區域 279 this.MainRange = this.TopLeftCell.Offset(1, 0) 280 .Resize(XLSExample.Data.length + 1, this.ColumnCount); 281 this.TableRange = this.TopLeftCell.Resize( 282 XLSExample.Data.length + 2, XLSExample.Headers.length); 283 this.IsTableCreated = false; 284 this.Comment = null; 285 this.Borders = null; 286 this.Validation = null; 287 this.FormatCondition = null; 288 this.Sort = null; 289 this.WriteData(); 290 } 291 292 //表格樣例的標題 293 static get Title() { 294 if (XLSExample._Title == undefined) 295 XLSExample._Title = '古名人成績單'; 296 return XLSExample._Title; 297 } 298 299 //表格樣例的表頭 300 static get Headers() { 301 if (XLSExample._Headers == undefined) 302 XLSExample._Headers = ['姓名' , '性別', 303 '年齡', '語文', '數學', '外語']; 304 return XLSExample._Headers; 305 } 306 307 //表格樣例的數據 308 static get Data() { 309 if (XLSExample._Data == undefined) 310 XLSExample._Data = [ 311 ['李白' , '男', 23, 99, 57, 80], 312 ['趙雲' , '男', 32, 77, 63, 55], 313 ['貂蟬' , '女', 18, 80, 80, 80], 314 ['李清照', '女', 25, 98, 66, 90], 315 ['趙佶' , '男', 54, 96, 33, 82], 316 ['武曌' , '女', 78, 65, 66, 63], 317 ['力士' , '閹', 55, 79, 67, 77], 318 ['趙高' , '閹', 43, 82, 88, 83], 319 ['玄奘' , '僧', 56, 78, 54, 98], 320 ['羅麽' , '僧', 42, 88, 77, 66] 321 ]; 322 return XLSExample._Data; 323 } 324 325 //將數據寫到初始化時的單元格位置 326 WriteData() { 327 //寫標題數據 328 this.TitleRange.Merge(); 329 this.TitleRange.Cells.Item(1).Value2 = XLSExample.Title; 330 //寫表頭 331 this.HeadersRange.Value2 = XLSExample.Headers; 332 //寫表內容 333 for (let i = 0; i < XLSExample.Data.length; i++) { 334 this.TopLeftCell.Offset(i + 2).Resize(1, 335 this.ColumnCount).Value2 = XLSExample.Data[i]; 336 } 337 } 338 339 //添加批注,並保存創建的批注對象的引用,以備更多探索訪問 340 AddComment() { 341 this.TitleRange.ClearComments(); 342 let comment = this.TopLeftCell.AddComment(); 343 comment.Visible = true; 344 let now = new Date(Date.now()); 345 comment.Text('批注添加於 :\n' + now.toLocaleString()); 346 comment.Shape.Width = 136; 347 comment.Shape.Height = 30; 348 //這里只右移了 2 列,可見單元格區域是否被合並,會影響 349 //Range.Offset() 方法的功能 350 let rngLocation = this.TopLeftCell.Offset(8, 2); 351 comment.Shape.Left = rngLocation.Left; 352 comment.Shape.Top = rngLocation.Top; 353 this.Comment = comment; 354 } 355 356 //給單元格區域添加邊框 357 AddBorders() { 358 let borders = this.MainRange.Borders; 359 //1.外邊框 360 for (let iBorder of [ 361 xlEdgeBottom, 362 xlEdgeLeft, 363 xlEdgeRight, 364 xlEdgeTop 365 ]) { 366 let border = borders.Item(iBorder); 367 border.Color = XLS.Colors.Blue/*color:藍色*/; 368 border.LineStyle = xlDouble/*lineStyle:雙實線*/; 369 border.Weight = xlMedium/*weight:中等粗細*/; 370 } 371 //2.內邊框 372 for (let iBorder of [xlInsideHorizontal, xlInsideVertical]) { 373 let border = borders.Item(iBorder); 374 border.Color = XLS.Colors.Red/*color:紅色*/; 375 border.LineStyle = xlDot/*lineStyle:點線*/; 376 border.Weight = xlThin/*weight:細線*/; 377 } 378 /* 379 //3.斜邊框 380 for (let iBorder of [xlDiagonalDown, xlDiagonalUp]){ 381 let border = borders.Item(iBorder); 382 border.Color = XLS.Colors.Blue; //color:藍色 383 border.LineStyle = xlContinuous;//lineStyle:實線 384 border.Weight = xlThin;//weight:細線 385 } 386 */ 387 388 //最后,留存邊框對象的引用,以備更多探索訪問 389 this.Borders = borders; 390 } 391 392 //設置字體與對齊方式 393 SetFontAndAlignment() { 394 //將表標題加粗,並水平分散縮進5對齊 395 (obj=>{ 396 obj.Font.Bold = true; 397 obj.HorizontalAlignment = xlHAlignDistributed; 398 obj.VerticalAlignment = xlVAlignCenter; 399 obj.AddIndent = false; 400 obj.IndentLevel = 5; 401 })(this.TitleRange); 402 //將表頭行加粗 403 this.HeadersRange.Font.Bold = true; 404 //設置主區域的第一列為楷體,水平分散對齊 405 let rngFirstColumn = this.MainRange.Columns.Item(1); 406 rngFirstColumn.HorizontalAlignment = xlHAlignDistributed; 407 rngFirstColumn.Font.Name = '楷體'; 408 //設置主區域除第一列以外的區域,水平居中對齊 409 for (let iColumn = 2; iColumn <= this.ColumnCount; iColumn++) 410 this.MainRange.Columns.Item(iColumn) 411 .HorizontalAlignment = xlHAlignCenter; 412 } 413 414 //給單元格區域添加數據有效性驗證 415 AddValidation() { 416 let iColumn = XLSExample.Headers.indexOf('性別') + 1; 417 let rngValidation = this.MainRange.Columns.Item(iColumn); 418 rngValidation.Validation.Delete(); 419 rngValidation.Validation.Add( 420 /*JSA不支持 XlDVType 枚舉,在此用全局變量,模擬自定義了一個 Enum,為使 JSA 能編譯 421 通過,請確保【工具】》【選項】》【編譯】》【禁止全局作用域表達式】處於未被勾選狀態*/ 422 XLS.XlDVType.xlValidateList, 423 xlValidAlertStop, xlBetween, "男,女,閹,僧", undefined); 424 (obj => { 425 obj.InputTitle = "性別"; 426 obj.InputMessage = "允許的性別是:男,女,閹,僧"; 427 obj.ErrorTitle = "數據非法"; 428 obj.ErrorMessage = "只接受“男,女,閹,僧”四種性別"; 429 obj.InCellDropdown = true; 430 })(rngValidation.Validation); 431 432 //留存數據有效對象的引用,以備更多探索訪問 433 this.Validation = rngValidation.Validation; 434 } 435 436 //添加條件格式:當各科都及格時,把行單元格的字段設置為綠色 437 AddFormatCondition() { 438 this.MainRange.FormatConditions.Delete(); 439 //如果“語文、數學、英語”都及格了,將字體顏色改為綠色 440 let formatCondition = this.MainRange.FormatConditions 441 .Add(xlExpression, -1, '=AND(' + 442 'ISNUMBER(INDIRECT("$E" & ROW())),' + 443 'INDIRECT("$E" & ROW())>=60,' + 444 'INDIRECT("$F" & ROW())>=60,' + 445 'INDIRECT("$G" & ROW())>=60)', 446 "", undefined, undefined, undefined, undefined); 447 formatCondition.SetFirstPriority(); 448 formatCondition.Font.Color = XLS.Colors.Green;//綠色 449 formatCondition.Font.TintAndShade = 0; 450 formatCondition.StopIfTrue = false; 451 452 //留存創建的條件格式對象,以備更多探索 453 this.FormatCondition = formatCondition; 454 } 455 456 //添加自動篩選 457 AddAutoFilter() { 458 if (this.TopLeftCell.Worksheet.AutoFilter != undefined) { 459 alert('數據自動篩選已經開啟,無法再次開啟'); 460 return; 461 } 462 this.MainRange.AutoFilter(undefined, 463 undefined, xlAnd, undefined, undefined); 464 let refersTo = "='" + this.MainRange.Worksheet.Name + 465 "'!" + this.MainRange.Address(); 466 this.MainRange.Worksheet.Names.Add(XLSExample.name, 467 refersTo, false, undefined, undefined, undefined, 468 undefined, undefined, undefined, undefined, undefined); 469 } 470 471 //添加排序規則:按年齡升序排列 472 AddSortRule() { 473 //獲取排序基准列內容區域 474 let iColumn = XLSExample.Headers.indexOf('年齡') + 1; 475 let rngSortBy = this.HeadersRange.Cells 476 .Item(iColumn).Offset(1, 0) 477 .Resize(XLSExample.Data.length, 1); 478 //添加排序規則 479 (obj=>{ 480 (obj=>{ 481 obj.Clear(); 482 obj.Add(rngSortBy, xlSortOnValues, 483 xlAscending, "", undefined); 484 })(obj.SortFields); 485 obj.Header = xlYes; 486 obj.Orientation = xlSortColumns; 487 obj.MatchCase = false; 488 obj.SortMethod = xlPinYin; 489 obj.SetRange(this.MainRange); 490 obj.Apply(); 491 })(this.MainRange.Worksheet.Sort); 492 493 //留存排序規則對象,以備更多探索 494 this.Sort = this.MainRange.AutoFilter.Sort; 495 } 496 497 //為數據表創建條形圖 498 AddChart() { 499 let rngMain = this.MainRange; 500 let sht = rngMain.Worksheet; 501 //取得給定數據表底部單元格,以定位新建的圖表 502 let rngLocation = rngMain.Cells.Item(1) 503 .Offset(rngMain.Rows.Count + 2, 0); 504 //在給定位置按給定大小創建【簇狀條形圖】 505 let shape = sht.Shapes.AddChart(xlBarClustered, 506 rngLocation.Left, rngLocation.Top, 507 rngMain.Width, rngMain.Height * 2); 508 let chart = shape.Chart; 509 //將條形圖的樣式修改為 209 510 chart.ChartStyle = 209; 511 //設置引用的數據表 512 chart.SetSourceData(rngMain, xlColumns); 513 //Axes 方法返回坐標軸對象,無參時返回它們的集合 514 //設置橫坐標的最大刻度 515 chart.Axes(xlValue).MaximumScale = 100; 516 //設置縱坐標(分類軸)的分類,可以是 Range 對象 517 let rngCategory = rngMain.Cells.Item(1) 518 .Offset(1, 0).Resize(rngMain.Rows.Count - 1, 1); 519 chart.Axes(xlCategory).CategoryNames = rngCategory; 520 //刪除圖表名為【年齡】的系列;SeriesCollection 方法無參調用 521 //會返回當前圖表對象的所有系列的集合 522 chart.SeriesCollection('年齡').Delete(); 523 //設置圖表的標題 524 let rngTitle = this.TitleRange.Cells.Item(1); 525 //必須先設置 HasTitle 屬性為 true,才能設置標題文本 526 chart.HasTitle = true; 527 chart.ChartTitle.Text = rngTitle.Value2; 528 } 529 530 //為數據表創建透視表 531 AddPivotTable() { 532 let rngMain = this.MainRange; 533 let sht = rngMain.Worksheet; 534 //Create() 方法:為創建數據透視表創建緩沖對象 535 let address = `=${sht.Name}!${rngMain.Address(true, true, xlR1C1)}`; 536 let pivotCache = sht.Parent.PivotCaches() 537 .Create(xlDatabase, address, xlPivotTableVersion15) 538 //在緩沖對象上創建數據透視表 539 let rngLocation = rngMain.Cells.Item(1) 540 .Offset(rngMain.Rows.Count + 25, 0); 541 address = `${sht.Name}!${rngLocation.Address(true, true, xlR1C1)}`; 542 //這個調用必須使用 xlR1C1 樣式的地址 543 let pivotTable = pivotCache.CreatePivotTable( 544 address, undefined, false, xlPivotTableVersion15); 545 546 (obj=>{ 547 obj.Orientation = xlRowField; 548 obj.Position = 1; 549 })(pivotTable.PivotFields("性別")); 550 (obj=>{ 551 obj.Orientation = xlRowField; 552 obj.Position = 2; 553 })(pivotTable.PivotFields("姓名")); 554 pivotTable.AddDataField( 555 pivotTable.PivotFields("語文"), undefined, undefined); 556 pivotTable.AddDataField( 557 pivotTable.PivotFields("數學"), undefined, undefined); 558 pivotTable.AddDataField( 559 pivotTable.PivotFields("外語"), undefined, undefined); 560 //設置字段 561 pivotTable.PivotFields("求和項:語文").Function = xlMax; 562 pivotTable.PivotFields("最大值項:語文").Caption = "最大值項:語文"; 563 pivotTable.PivotFields("求和項:數學").Function = xlMax; 564 pivotTable.PivotFields("最大值項:數學").Caption = "最大值項:數學"; 565 pivotTable.PivotFields("求和項:外語").Function = xlMax; 566 pivotTable.PivotFields("最大值項:外語").Caption = "最大值項:外語"; 567 //創建計算型字段 568 pivotTable.CalculatedFields() 569 .Add("總分", "= 語文+ 數學+ 外語", true); 570 pivotTable.PivotFields("總分").Orientation = xlDataField; 571 //將【姓名】字段按【總分】字段降序排序 572 pivotTable.PivotFields("姓名").AutoSort(xlDescending, '求和項:總分'); 573 //添加切片器 :JSA 調用 API 創建切片器,代碼可以無誤執行,但無任何效果 574 //新創建的 slicer 對象,仍然是初始狀態,Name/Caption = default, 575 //Top/Left/Width/Height = 1,賦值語句也可執行,但仍然無效 576 rngLocation = rngLocation.Offset(0, pivotTable.PivotFields().Count - 2); 577 let slicerCache = sht.Parent.SlicerCaches.Add(pivotTable, "性別"); 578 let slicer = slicerCache.Slicers.Add(sht, undefined, "性別", 579 "性別", rngLocation.Left, rngLocation.Top, 80, 100); 580 //Console.WriteAll(slicer.Name, slicer.Caption); 581 } 582 583 //創建超鏈接 584 AddHyperlinks() { 585 let rngTable = this.TableRange; 586 let sht = rngTable.Worksheet; 587 //創建內部超鏈接 588 let rngHeaders = rngTable.Rows.Item(2); 589 let rngInnerLink = rngTable.Cells.Item(1) 590 .Offset(rngTable.Rows.Count, 0); 591 let address = `'${sht.Name}'!${rngHeaders.Address(false, false)}` 592 sht.Hyperlinks.Add(rngInnerLink, "", 593 address, "內部位置超鏈接", "表頭"); 594 //創建外部文件的超鏈接 595 address = 'C:\\Windows\\System32\\cmd.exe'; 596 let rngFile = rngInnerLink.Offset(0, 1); 597 sht.Hyperlinks.Add(rngFile, address, '', 598 '外部文件超鏈接', '文件'); 599 //創建網頁超鏈接 600 address = 'http://www.baidu.com'; 601 let rngUrl = rngFile.Offset(0, 1); 602 sht.Hyperlinks.Add(rngUrl, address, '', 603 '外部網頁超鏈接', '百度'); 604 //創建郵件超鏈接 605 address = 'mailto:123456789@qq.com?subject=還好嗎'; 606 let rngMail = rngUrl.Offset(0, 1); 607 let lnk = sht.Hyperlinks.Add(rngMail, 608 address, '', '郵件超鏈接', address); 609 } 610 611 //創建文本框 612 AddTextBox() { 613 let rngMain = this.MainRange; 614 let rngLocation = rngMain.Cells.Item(1) 615 .Offset(0, rngMain.Columns.Count); 616 let shape = ActiveSheet.Shapes.AddTextbox( 617 msoTextOrientationVertical, rngLocation.Left, 618 rngLocation.Top, rngLocation.Width, rngMain.Height); 619 shape.Placement = xlMoveAndSize; 620 let characters = shape.TextFrame.Characters(); 621 characters.Text = "文本框試驗"; 622 characters.Font.Bold = true; 623 characters.Font.Size = 15; 624 625 } 626 627 //添加標簽 628 AddLabel() { 629 let rngMain = this.MainRange; 630 let rngLocation = rngMain.Cells.Item(1) 631 .Offset(0, rngMain.Columns.Count + 1); 632 let label = this.TopLeftCell.Worksheet.Shapes 633 .AddLabel(msoTextOrientationVertical, 634 rngLocation.Left, rngLocation.Top, 635 rngLocation.Width, this.MainRange.Height); 636 label.Placement = xlMoveAndSize; 637 label.TextFrame.Characters().Text = "標簽試驗" 638 } 639 640 //添加直線 641 AddLine() { 642 let rngLocation = this.MainRange.Cells.Item(1) 643 .Offset(0, this.MainRange.Columns.Count + 2); 644 let shape = this.TopLeftCell.Worksheet.Shapes 645 .AddLine(rngLocation.Left, rngLocation.Top, 646 rngLocation.Left + rngLocation.Width, 647 rngLocation.Top + rngLocation.Height); 648 shape.Placement = xlMoveAndSize; 649 let line = shape.Line; 650 line.DashStyle = msoLineDashDotDot; 651 } 652 653 static RunAll() { 654 let rng = new Range('B1'); 655 let eg = new XLSExample(rng); 656 eg.AddComment(); 657 eg.AddBorders(); 658 eg.SetFontAndAlignment(); 659 eg.AddValidation(); 660 eg.AddFormatCondition(); 661 eg.AddAutoFilter(); 662 eg.AddSortRule(); 663 eg.AddChart(); 664 eg.AddPivotTable(); 665 eg.AddHyperlinks(); 666 eg.AddTextBox(); 667 eg.AddLabel(); 668 eg.AddLine(); 669 } 670 }