下面我们通过一个例子,来了解一下日常宏编程中最常面临的任务(因为使用了全局表达式,请将【工具】》【选项】》【编译】》【禁止全局作用域表达式】取消勾选):

    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. Colors : {
    16. Black : 0, //黑色
    17. DarkRed : 192, //深红
    18. Red : 255, //红色
    19. Orange : 49407, //橙色
    20. Yellow : 65535, //黄色
    21. LightGreen : 5296274, //浅绿
    22. Green : 5287936, //绿色
    23. LightBlue : 15773696, //浅蓝
    24. Blue : 12611584, //蓝色
    25. DarkBlue : 6299648, //深蓝
    26. Purpose : 10498160, //紫色
    27. Magenta : 0xFF00FF, //紫红色
    28. Cyan : 0xFFFF00, //青色
    29. White : 0xFFFFFF, //白色
    30. },
    31. /*
    32. 获取鼠标选取的单元格区域对象
    33. prompt : 对话框提示信息
    34. title : 对话框标题
    35. must : 是否强制返回一个单元格区域对象
    36. */
    37. GetRange : function(prompt = '请用鼠标框选单元格区域',
    38. title = '选取单元格区域', must = false) {
    39. if (!g.IsType(prompt, 'String') ||
    40. !g.IsType(title, 'String') ||
    41. !g.IsType(must, 'Boolean'))
    42. throw new TypeError('参数 prompt/title/must 分别必' +
    43. '须是 String/String/Boolean 对象');
    44. if (must) title += '[必须]';
    45. while(true) {
    46. var rng = Application.InputBox(prompt, title, undefined,
    47. undefined, undefined, undefined, undefined, 8);
    48. if (!must) break;
    49. if (must && (typeof rng == 'object')) break;
    50. }
    51. return rng;
    52. },
    53. /*获取指定列的列字母
    54. columnIndex : 列序数,Number 类型
    55. */
    56. GetColumnLetter : function(columnIndex) {
    57. if (!g.IsType(columnIndex, 'Number'))
    58. throw new TypeError('参数 columnIndex 必须是一个数字');
    59. if (columnIndex <= 0 || columnIndex > 16384)
    60. throw new Error('Please make sure 1 <= columnIndex <= 16384.');
    61. let address = ActiveSheet.Columns.Item(columnIndex).Address();
    62. return address.substr(1, address.indexOf(':') - 1);
    63. },
    64. /*
    65. 功能:为单元格区域的每个单元格值上面加(数字)或追加(文本)指定数据
    66. value : 要加/追加的值
    67. rng : 目标单元格区域
    68. */
    69. AddOrAppend : function(value, rng) {
    70. if (!(typeof value == 'string' ||
    71. typeof value == 'number'))
    72. throw new Error('Parameter "value" must be a number/string object.');
    73. if (typeof rng == 'undefined')
    74. rng = XLS.GetRange(undefined, undefined, true);
    75. if (rng.constructor.name != 'Range')
    76. throw new Error('Parameter "rng" must be a Range object.');
    77. for (let iArea = 1; iArea <= rng.Areas.Count; iArea++) {
    78. let area = rng.Areas.Item(iArea);
    79. for (let iRow = 1; iRow <= area.Rows.Count; iRow++) {
    80. for (let iColumn = 1; iColumn <= area.Columns.Count; iColumn++) {
    81. let cell = area.Cells.Item(iRow, iColumn);
    82. if (typeof cell.Value2 == 'undefined')
    83. cell.Value2 = value;
    84. else
    85. cell.Value2 += value;
    86. }
    87. }
    88. }
    89. },
    90. /*获取单元格区域的所有数据,如果有多个子区域,将返回一个多维数组,
    91. 否则,返回一维数组*/
    92. GetValues : function(rng) {
    93. if (typeof rng == 'undefined')
    94. rng = XLS.GetRange(undefined, undefined, true);
    95. if (rng.constructor.name != 'Range')
    96. throw new Error('Parameter "rng" must be a Range object.');
    97. let result = [];
    98. for (let iArea = 1; iArea <= rng.Areas.Count; iArea++) {
    99. let values = [];
    100. let area = rng.Areas.Item(iArea);
    101. for (let iRow = 1; iRow <= area.Rows.Count; iRow++) {
    102. for (let iColumn = 1; iColumn <= area.Columns.Count; iColumn++) {
    103. values.push(area.Cells.Item(iRow, iColumn).Value());
    104. }
    105. }
    106. result.push(values);
    107. }
    108. if (result.length == 1)
    109. return result[0];
    110. else
    111. return result;
    112. },
    113. /*获取单元格区域的完全引用的地址*/
    114. GetRangeFullAddress : function(rng) {
    115. if (typeof rng == 'undefined')
    116. rng = XLS.GetRange(undefined, undefined, true);
    117. if (rng.constructor.name != 'Range')
    118. throw new Error('Parameter "rng" must be a Range object.');
    119. return "'" + rng.Worksheet.Parent.Path + "\\[" +
    120. rng.Worksheet.Parent.Name + "]" + rng.Worksheet.Name +
    121. "'!" + rng.Address();
    122. },
    123. /*为单元格区域创建简单的边框*/
    124. MakeSimpleBorders : function(rng, color, weight, lineStyle) {
    125. if (!XLS.IsRange(rng))
    126. throw new TypeError('参数 rng 必须是一个单元格区域对象');
    127. if (typeof color == 'undefined')
    128. color = 0; //黑色
    129. if (typeof color != 'number' ||
    130. Math.ceil(color) != color)
    131. throw new TypeError('参数 color 必须是一个整数');
    132. if (typeof weight == 'undefined')
    133. weight = xlThin; //细
    134. if (typeof weight != 'number' ||
    135. Math.ceil(weight) != weight)
    136. throw new TypeError('参数 weight 必须是一个整数');
    137. if (typeof lineStyle == 'undefined')
    138. lineStyle = xlContinuous;
    139. if (typeof lineStyle != 'number' ||
    140. Math.ceil(lineStyle) != lineStyle)
    141. throw new TypeError('参数 lineStyle 必须是一个整数');
    142. let indices = [xlEdgeLeft, xlEdgeTop,
    143. xlEdgeBottom, xlEdgeRight,
    144. xlInsideHorizontal, xlInsideVertical];
    145. for (let index of indices) {
    146. (obj=>{
    147. obj.Weight = weight;
    148. obj.LineStyle = lineStyle;
    149. obj.Color = color;
    150. })(rng.Borders.Item(index));
    151. }
    152. },
    153. /*判断一个对象是否是 Range 类型的对象*/
    154. IsRange : function(rng) {
    155. return g.IsType(rng, 'Range');
    156. },
    157. SetFormatConditionByExampleRange : function() {
    158. {//与用户交互,取得操作需要的输入
    159. //指定数据表所在的单元格区域
    160. let title = '选取数据表';
    161. let prompt = '请用鼠标框选你要按值表样例加设条件格式的工作' +
    162. '表数据所在的单元格区域(请不要连带选中表头行)';
    163. var rngMain = XLS.GetRange(prompt, title, true);
    164. //指定值表样例所在的单元格区域
    165. title = '选取值表样例';
    166. prompt = '请用鼠标框选你要设置条件格式参照的值表样例所在的' +
    167. '单元格区域(请确保设置了格式)';
    168. var rngExample = XLS.GetRange(prompt, title, true);
    169. //指定条件格式的基准列
    170. title = '选取条件格式基准列';
    171. prompt = '请用鼠标选取为数据表设置条件格式时的基准列';
    172. var rngBaseColumn;
    173. while(true) {
    174. rngBaseColumn = XLS.GetRange(prompt, title, true);
    175. if (rngBaseColumn.Columns.Count > 1)
    176. alert('此类型条件的基准列只能是一列,请只选择一个列');
    177. else {
    178. if (Application.Intersect(rngBaseColumn, rngMain) == undefined)
    179. alert('你指定的基准列与之前选取的数据表之间没有交集,所以' +
    180. '此列不能作为基准列,请重新选取');
    181. else
    182. break;
    183. }
    184. }
    185. }
    186. {//为条件格式准备需要的公式
    187. let rngIntersect = Application.Intersect(rngBaseColumn, rngMain);
    188. let addrFirstCell = rngIntersect.Cells.Item(1).Address();
    189. let columnAddress = addrFirstCell.substr(
    190. 0, addrFirstCell.lastIndexOf('$'));
    191. var tempFormula = '=INDIRECT("Column" & ROW()) = "Value"';
    192. tempFormula = tempFormula.replace('Column', columnAddress);
    193. }
    194. //从值表样例单元格区域创建可迭代对象,以迭代每个单元格
    195. let ociCells = new OfficeCollectionIterator(rngExample);
    196. //按值表样例增加条件格式
    197. for (let cell of ociCells) {
    198. let info = {
    199. Value : cell.Value(),
    200. BackColor : cell.Interior.Color,
    201. };
    202. //因为是要写在公式中,双写可能存在的引号
    203. if (typeof info.Value === 'string')
    204. info.Value = info.Value.replace('"', '""');
    205. let fcFormula = tempFormula.replace('Value', info.Value);
    206. let formatCondition = rngMain.FormatConditions
    207. .Add(xlExpression, -1, fcFormula, "",
    208. undefined, undefined, undefined, undefined);
    209. //formatCondition.SetFirstPriority();
    210. formatCondition.Interior.Color = info.BackColor
    211. formatCondition.StopIfTrue = false;
    212. }
    213. },
    214. /*列出菜单栏清单*/
    215. ListAllCommandBarsInTable : function() {
    216. let cbs = new OfficeCollectionIterator(
    217. Application.CommandBars);
    218. let data = Enumerable.from(cbs)
    219. .select((cb, i) => [i, cb.Name,
    220. cb.NameLocal, cb.Type, cb.BuiltIn])
    221. .toArray();
    222. //写数据到表
    223. let writter = new XLSTableWritter(
    224. '序号,名称,友好名,类型,内建?'.split(','), data, '菜单栏清单',
    225. '类型有:\n0 => 默认菜单栏;\n1 => 菜单栏;\n2 => 快捷菜单');
    226. writter.WriteTo(new Range('B40'));
    227. },
    228. }
    229. /*一个数据表测试
    230. 它向外静态提供了一个数据表的完整数据
    231. 并以实例的方式围绕一个数据表,向用户初步测试各类相关对象与功能
    232. */
    233. class XLSExample {
    234. constructor(rng) {
    235. if (rng == null ||
    236. rng == undefined ||
    237. rng.constructor.name != 'Range')
    238. throw new TypeError('要求传入的 rng 参数是一个单元格区域对象');
    239. this.TopLeftCell = rng.Cells.Item(1);
    240. this.RowCount = XLSExample.Data.length;
    241. this.ColumnCount = XLSExample.Headers.length;
    242. //标题区域
    243. this.TitleRange = this.TopLeftCell.Resize(1, this.ColumnCount);
    244. //表头区域
    245. this.HeadersRange = this.TopLeftCell.Offset(1, 0)
    246. .Resize(1, this.ColumnCount);
    247. //主数据区域
    248. this.MainRange = this.TopLeftCell.Offset(1, 0)
    249. .Resize(XLSExample.Data.length + 1, this.ColumnCount);
    250. this.TableRange = this.TopLeftCell.Resize(
    251. XLSExample.Data.length + 2, XLSExample.Headers.length);
    252. this.IsTableCreated = false;
    253. this.Comment = null;
    254. this.Borders = null;
    255. this.Validation = null;
    256. this.FormatCondition = null;
    257. this.Sort = null;
    258. this.WriteData();
    259. }
    260. //表格样例的标题
    261. static get Title() {
    262. if (XLSExample._Title == undefined)
    263. XLSExample._Title = '古名人成绩单';
    264. return XLSExample._Title;
    265. }
    266. //表格样例的表头
    267. static get Headers() {
    268. if (XLSExample._Headers == undefined)
    269. XLSExample._Headers = ['姓名' , '性别',
    270. '年龄', '语文', '数学', '外语'];
    271. return XLSExample._Headers;
    272. }
    273. //表格样例的数据
    274. static get Data() {
    275. if (XLSExample._Data == undefined)
    276. XLSExample._Data = [
    277. ['李白' , '男', 23, 99, 57, 80],
    278. ['赵云' , '男', 32, 77, 63, 55],
    279. ['貂蝉' , '女', 18, 80, 80, 80],
    280. ['李清照', '女', 25, 98, 66, 90],
    281. ['赵佶' , '男', 54, 96, 33, 82],
    282. ['武曌' , '女', 78, 65, 66, 63],
    283. ['力士' , '阉', 55, 79, 67, 77],
    284. ['赵高' , '阉', 43, 82, 88, 83],
    285. ['玄奘' , '僧', 56, 78, 54, 98],
    286. ['罗麽' , '僧', 42, 88, 77, 66]
    287. ];
    288. return XLSExample._Data;
    289. }
    290. //将数据写到初始化时的单元格位置
    291. WriteData() {
    292. //写标题数据
    293. this.TitleRange.Merge();
    294. this.TitleRange.Cells.Item(1).Value2 = XLSExample.Title;
    295. //写表头
    296. this.HeadersRange.Value2 = XLSExample.Headers;
    297. //写表内容
    298. for (let i = 0; i < XLSExample.Data.length; i++) {
    299. this.TopLeftCell.Offset(i + 2).Resize(1,
    300. this.ColumnCount).Value2 = XLSExample.Data[i];
    301. }
    302. }
    303. //添加批注,并保存创建的批注对象的引用,以备更多探索访问
    304. AddComment() {
    305. this.TitleRange.ClearComments();
    306. let comment = this.TopLeftCell.AddComment();
    307. comment.Visible = true;
    308. let now = new Date(Date.now());
    309. comment.Text('批注添加于 :\n' + now.toLocaleString());
    310. comment.Shape.Width = 136;
    311. comment.Shape.Height = 30;
    312. //这里只右移了 2 列,可见单元格区域是否被合并,会影响
    313. //Range.Offset() 方法的功能
    314. let rngLocation = this.TopLeftCell.Offset(8, 2);
    315. comment.Shape.Left = rngLocation.Left;
    316. comment.Shape.Top = rngLocation.Top;
    317. this.Comment = comment;
    318. }
    319. //给单元格区域添加边框
    320. AddBorders() {
    321. let borders = this.MainRange.Borders;
    322. //1.外边框
    323. for (let iBorder of [
    324. xlEdgeBottom,
    325. xlEdgeLeft,
    326. xlEdgeRight,
    327. xlEdgeTop
    328. ]) {
    329. let border = borders.Item(iBorder);
    330. border.Color = XLS.Colors.Blue/*color:蓝色*/;
    331. border.LineStyle = xlDouble/*lineStyle:双实线*/;
    332. border.Weight = xlMedium/*weight:中等粗细*/;
    333. }
    334. //2.内边框
    335. for (let iBorder of [xlInsideHorizontal, xlInsideVertical]) {
    336. let border = borders.Item(iBorder);
    337. border.Color = XLS.Colors.Red/*color:红色*/;
    338. border.LineStyle = xlDot/*lineStyle:点线*/;
    339. border.Weight = xlThin/*weight:细线*/;
    340. }
    341. /*
    342. //3.斜边框
    343. for (let iBorder of [xlDiagonalDown, xlDiagonalUp]){
    344. let border = borders.Item(iBorder);
    345. border.Color = XLS.Colors.Blue; //color:蓝色
    346. border.LineStyle = xlContinuous;//lineStyle:实线
    347. border.Weight = xlThin;//weight:细线
    348. }
    349. */
    350. //最后,留存边框对象的引用,以备更多探索访问
    351. this.Borders = borders;
    352. }
    353. //设置字体与对齐方式
    354. SetFontAndAlignment() {
    355. //将表标题加粗,并水平分散缩进5对齐
    356. (obj=>{
    357. obj.Font.Bold = true;
    358. obj.HorizontalAlignment = xlHAlignDistributed;
    359. obj.VerticalAlignment = xlVAlignCenter;
    360. obj.AddIndent = false;
    361. obj.IndentLevel = 5;
    362. })(this.TitleRange);
    363. //将表头行加粗
    364. this.HeadersRange.Font.Bold = true;
    365. //设置主区域的第一列为楷体,水平分散对齐
    366. let rngFirstColumn = this.MainRange.Columns.Item(1);
    367. rngFirstColumn.HorizontalAlignment = xlHAlignDistributed;
    368. rngFirstColumn.Font.Name = '楷体';
    369. //设置主区域除第一列以外的区域,水平居中对齐
    370. for (let iColumn = 2; iColumn <= this.ColumnCount; iColumn++)
    371. this.MainRange.Columns.Item(iColumn)
    372. .HorizontalAlignment = xlHAlignCenter;
    373. }
    374. //给单元格区域添加数据有效性验证
    375. AddValidation() {
    376. let iColumn = XLSExample.Headers.indexOf('性别') + 1;
    377. let rngValidation = this.MainRange.Columns.Item(iColumn);
    378. rngValidation.Validation.Delete();
    379. rngValidation.Validation.Add(
    380. /*JSA不支持 XlDVType 枚举,在此用全局变量,模拟自定义了一个 Enum,为使 JSA 能编译
    381. 通过,请确保【工具】》【选项】》【编译】》【禁止全局作用域表达式】处于未被勾选状态*/
    382. XLS.XlDVType.xlValidateList,
    383. xlValidAlertStop, xlBetween, "男,女,阉,僧", undefined);
    384. (obj => {
    385. obj.InputTitle = "性别";
    386. obj.InputMessage = "允许的性别是:男,女,阉,僧";
    387. obj.ErrorTitle = "数据非法";
    388. obj.ErrorMessage = "只接受“男,女,阉,僧”四种性别";
    389. obj.InCellDropdown = true;
    390. })(rngValidation.Validation);
    391. //留存数据有效对象的引用,以备更多探索访问
    392. this.Validation = rngValidation.Validation;
    393. }
    394. //添加条件格式:当各科都及格时,把行单元格的字段设置为绿色
    395. AddFormatCondition() {
    396. this.MainRange.FormatConditions.Delete();
    397. //如果“语文、数学、英语”都及格了,将字体颜色改为绿色
    398. let formatCondition = this.MainRange.FormatConditions
    399. .Add(xlExpression, -1, '=AND(' +
    400. 'ISNUMBER(INDIRECT("$E" & ROW())),' +
    401. 'INDIRECT("$E" & ROW())>=60,' +
    402. 'INDIRECT("$F" & ROW())>=60,' +
    403. 'INDIRECT("$G" & ROW())>=60)',
    404. "", undefined, undefined, undefined, undefined);
    405. formatCondition.SetFirstPriority();
    406. formatCondition.Font.Color = XLS.Colors.Green;//绿色
    407. formatCondition.Font.TintAndShade = 0;
    408. formatCondition.StopIfTrue = false;
    409. //留存创建的条件格式对象,以备更多探索
    410. this.FormatCondition = formatCondition;
    411. }
    412. //添加自动筛选
    413. AddAutoFilter() {
    414. if (this.TopLeftCell.Worksheet.AutoFilter != undefined) {
    415. alert('数据自动筛选已经开启,无法再次开启');
    416. return;
    417. }
    418. this.MainRange.AutoFilter(undefined,
    419. undefined, xlAnd, undefined, undefined);
    420. let refersTo = "='" + this.MainRange.Worksheet.Name +
    421. "'!" + this.MainRange.Address();
    422. this.MainRange.Worksheet.Names.Add(XLSExample.name,
    423. refersTo, false, undefined, undefined, undefined,
    424. undefined, undefined, undefined, undefined, undefined);
    425. }
    426. //添加排序规则:按年龄升序排列
    427. AddSortRule() {
    428. //获取排序基准列内容区域
    429. let iColumn = XLSExample.Headers.indexOf('年龄') + 1;
    430. let rngSortBy = this.HeadersRange.Cells
    431. .Item(iColumn).Offset(1, 0)
    432. .Resize(XLSExample.Data.length, 1);
    433. //添加排序规则
    434. (obj=>{
    435. (obj=>{
    436. obj.Clear();
    437. obj.Add(rngSortBy, xlSortOnValues,
    438. xlAscending, "", undefined);
    439. })(obj.SortFields);
    440. obj.Header = xlYes;
    441. obj.Orientation = xlSortColumns;
    442. obj.MatchCase = false;
    443. obj.SortMethod = xlPinYin;
    444. obj.SetRange(this.MainRange);
    445. obj.Apply();
    446. })(this.MainRange.Worksheet.Sort);
    447. //留存排序规则对象,以备更多探索
    448. this.Sort = this.MainRange.AutoFilter.Sort;
    449. }
    450. //为数据表创建条形图
    451. AddChart() {
    452. let rngMain = this.MainRange;
    453. let sht = rngMain.Worksheet;
    454. //取得给定数据表底部单元格,以定位新建的图表
    455. let rngLocation = rngMain.Cells.Item(1)
    456. .Offset(rngMain.Rows.Count + 2, 0);
    457. //在给定位置按给定大小创建【簇状条形图】
    458. let shape = sht.Shapes.AddChart(xlBarClustered,
    459. rngLocation.Left, rngLocation.Top,
    460. rngMain.Width, rngMain.Height * 2);
    461. let chart = shape.Chart;
    462. //将条形图的样式修改为 209
    463. chart.ChartStyle = 209;
    464. //设置引用的数据表
    465. chart.SetSourceData(rngMain, xlColumns);
    466. //Axes 方法返回坐标轴对象,无参时返回它们的集合
    467. //设置横坐标的最大刻度
    468. chart.Axes(xlValue).MaximumScale = 100;
    469. //设置纵坐标(分类轴)的分类,可以是 Range 对象
    470. let rngCategory = rngMain.Cells.Item(1)
    471. .Offset(1, 0).Resize(rngMain.Rows.Count - 1, 1);
    472. chart.Axes(xlCategory).CategoryNames = rngCategory;
    473. //删除图表名为【年龄】的系列;SeriesCollection 方法无参调用
    474. //会返回当前图表对象的所有系列的集合
    475. chart.SeriesCollection('年龄').Delete();
    476. //设置图表的标题
    477. let rngTitle = this.TitleRange.Cells.Item(1);
    478. //必须先设置 HasTitle 属性为 true,才能设置标题文本
    479. chart.HasTitle = true;
    480. chart.ChartTitle.Text = rngTitle.Value2;
    481. }
    482. //为数据表创建透视表
    483. AddPivotTable() {
    484. let rngMain = this.MainRange;
    485. let sht = rngMain.Worksheet;
    486. //Create() 方法:为创建数据透视表创建缓冲对象
    487. let address = `=${sht.Name}!${rngMain.Address(true, true, xlR1C1)}`;
    488. let pivotCache = sht.Parent.PivotCaches()
    489. .Create(xlDatabase, address, xlPivotTableVersion15)
    490. //在缓冲对象上创建数据透视表
    491. let rngLocation = rngMain.Cells.Item(1)
    492. .Offset(rngMain.Rows.Count + 25, 0);
    493. address = `${sht.Name}!${rngLocation.Address(true, true, xlR1C1)}`;
    494. //这个调用必须使用 xlR1C1 样式的地址
    495. let pivotTable = pivotCache.CreatePivotTable(
    496. address, undefined, false, xlPivotTableVersion15);
    497. (obj=>{
    498. obj.Orientation = xlRowField;
    499. obj.Position = 1;
    500. })(pivotTable.PivotFields("性别"));
    501. (obj=>{
    502. obj.Orientation = xlRowField;
    503. obj.Position = 2;
    504. })(pivotTable.PivotFields("姓名"));
    505. pivotTable.AddDataField(
    506. pivotTable.PivotFields("语文"), undefined, undefined);
    507. pivotTable.AddDataField(
    508. pivotTable.PivotFields("数学"), undefined, undefined);
    509. pivotTable.AddDataField(
    510. pivotTable.PivotFields("外语"), undefined, undefined);
    511. //设置字段
    512. pivotTable.PivotFields("求和项:语文").Function = xlMax;
    513. pivotTable.PivotFields("最大值项:语文").Caption = "最大值项:语文";
    514. pivotTable.PivotFields("求和项:数学").Function = xlMax;
    515. pivotTable.PivotFields("最大值项:数学").Caption = "最大值项:数学";
    516. pivotTable.PivotFields("求和项:外语").Function = xlMax;
    517. pivotTable.PivotFields("最大值项:外语").Caption = "最大值项:外语";
    518. //创建计算型字段
    519. pivotTable.CalculatedFields()
    520. .Add("总分", "= 语文+ 数学+ 外语", true);
    521. pivotTable.PivotFields("总分").Orientation = xlDataField;
    522. //将【姓名】字段按【总分】字段降序排序
    523. pivotTable.PivotFields("姓名").AutoSort(xlDescending, '求和项:总分');
    524. //添加切片器 :JSA 调用 API 创建切片器,代码可以无误执行,但无任何效果
    525. //新创建的 slicer 对象,仍然是初始状态,Name/Caption = default,
    526. //Top/Left/Width/Height = 1,赋值语句也可执行,但仍然无效
    527. rngLocation = rngLocation.Offset(0, pivotTable.PivotFields().Count - 2);
    528. let slicerCache = sht.Parent.SlicerCaches.Add(pivotTable, "性别");
    529. let slicer = slicerCache.Slicers.Add(sht, undefined, "性别",
    530. "性别", rngLocation.Left, rngLocation.Top, 80, 100);
    531. //Console.WriteAll(slicer.Name, slicer.Caption);
    532. }
    533. //创建超链接
    534. AddHyperlinks() {
    535. let rngTable = this.TableRange;
    536. let sht = rngTable.Worksheet;
    537. //创建内部超链接
    538. let rngHeaders = rngTable.Rows.Item(2);
    539. let rngInnerLink = rngTable.Cells.Item(1)
    540. .Offset(rngTable.Rows.Count, 0);
    541. let address = `'${sht.Name}'!${rngHeaders.Address(false, false)}`
    542. sht.Hyperlinks.Add(rngInnerLink, "",
    543. address, "内部位置超链接", "表头");
    544. //创建外部文件的超链接
    545. address = 'C:\\Windows\\System32\\cmd.exe';
    546. let rngFile = rngInnerLink.Offset(0, 1);
    547. sht.Hyperlinks.Add(rngFile, address, '',
    548. '外部文件超链接', '文件');
    549. //创建网页超链接
    550. address = 'http://www.baidu.com';
    551. let rngUrl = rngFile.Offset(0, 1);
    552. sht.Hyperlinks.Add(rngUrl, address, '',
    553. '外部网页超链接', '百度');
    554. //创建邮件超链接
    555. address = 'mailto:123456789@qq.com?subject=还好吗';
    556. let rngMail = rngUrl.Offset(0, 1);
    557. let lnk = sht.Hyperlinks.Add(rngMail,
    558. address, '', '邮件超链接', address);
    559. }
    560. //创建文本框
    561. AddTextBox() {
    562. let rngMain = this.MainRange;
    563. let rngLocation = rngMain.Cells.Item(1)
    564. .Offset(0, rngMain.Columns.Count);
    565. let shape = ActiveSheet.Shapes.AddTextbox(
    566. msoTextOrientationVertical, rngLocation.Left,
    567. rngLocation.Top, rngLocation.Width, rngMain.Height);
    568. shape.Placement = xlMoveAndSize;
    569. let characters = shape.TextFrame.Characters();
    570. characters.Text = "文本框试验";
    571. characters.Font.Bold = true;
    572. characters.Font.Size = 15;
    573. }
    574. //添加标签
    575. AddLabel() {
    576. let rngMain = this.MainRange;
    577. let rngLocation = rngMain.Cells.Item(1)
    578. .Offset(0, rngMain.Columns.Count + 1);
    579. let label = this.TopLeftCell.Worksheet.Shapes
    580. .AddLabel(msoTextOrientationVertical,
    581. rngLocation.Left, rngLocation.Top,
    582. rngLocation.Width, this.MainRange.Height);
    583. label.Placement = xlMoveAndSize;
    584. label.TextFrame.Characters().Text = "标签试验"
    585. }
    586. //添加直线
    587. AddLine() {
    588. let rngLocation = this.MainRange.Cells.Item(1)
    589. .Offset(0, this.MainRange.Columns.Count + 2);
    590. let shape = this.TopLeftCell.Worksheet.Shapes
    591. .AddLine(rngLocation.Left, rngLocation.Top,
    592. rngLocation.Left + rngLocation.Width,
    593. rngLocation.Top + rngLocation.Height);
    594. shape.Placement = xlMoveAndSize;
    595. let line = shape.Line;
    596. line.DashStyle = msoLineDashDotDot;
    597. }
    598. static RunAll() {
    599. let rng = new Range('B1');
    600. let eg = new XLSExample(rng);
    601. eg.AddComment();
    602. eg.AddBorders();
    603. eg.SetFontAndAlignment();
    604. eg.AddValidation();
    605. eg.AddFormatCondition();
    606. eg.AddAutoFilter();
    607. eg.AddSortRule();
    608. eg.AddChart();
    609. eg.AddPivotTable();
    610. eg.AddHyperlinks();
    611. eg.AddTextBox();
    612. eg.AddLabel();
    613. eg.AddLine();
    614. }
    615. }