WPS JSA 宏編程(JS):4.最常見的宏編程任務


下面我們通過一個例子,來了解一下日常宏編程中最常面臨的任務(因為使用了全局表達式,請將【工具】》【選項】》【編譯】》【禁止全局作用域表達式】取消勾選):

  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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM