|
楼主 |
发表于 2024-8-11 19:20
|
显示全部楼层
本帖最后由 yangqianming 于 2024-8-11 20:08 编辑
您觉得简单没意思我确好多看不懂,比如行列号怎么算出来的,怎么对应上的- function test(){
- let res = [year, month, area] = [['年'], ['月'], ['地区']], hj = {}; // 初始化结果数组,包含年、月、地区三个子数组, 初始化hj字典
- Sheets('源数据').Range('a1').CurrentRegion.Value2.slice(1).forEach(([a, y, m, s, j]) => { // 循环源数据,把各列结构
- let r, c; // r为行号,c为列号
- if (!month[y + m]) { // 如果月份在month数组中不存在
- hj[y + m] = [0, 0]; // 初始化合计对象中的年月键,用于存储数量和金额
- month[y + m] = year.push(y) - 1; // 处理年份行,并获取新添加年份的索引
- year.push(y); // 再次添加年份,用于构建列头
- month.push(m); // 处理月份行
- month.push(m); // 再次添加月份,用于构建列头
- area.push('数量'); // 处理数量行
- area.push('金额'); // 处理金额行
- }
- area[a] ??= res.push([a]) - 1; // 如果地区不存在,则添加到area数组中,并获取其索引
- r = area[a]; // 获取地区对应的行号
- c = month[y + m]; // 获取月份对应的列号
- res[r][c] = s; // 本行数据写入结果数组(数量)
- res[r][c + 1] = j; // 本行数据写入结果数组(金额)
- hj[y + m][0] += s; // 记录本月数量合计
- hj[y + m][1] += j; // 记录本月金额合计
- });
- res.push(['合计', ...Object.values(hj).flat()]); // 压入合计行
- Sheets('转表').Cells.Clear(); // 清除转表工作表中的内容
- Sheets('转表').Range('a1').Resize(res.length, res[0].length).Value2 = res; // 将结果数组写入转表工作表
- let rng=Sheets('转表').Range('a1').Resize(res.length, res[0].length);
- rng.Borders.LineStyle = xlContinuous;//边框
- rng.Borders.Item(xlEdgeLeft).Weight = xlMedium;
- rng.Borders.Item(xlEdgeBottom).Weight = xlMedium;
- rng.Borders.Item(xlEdgeTop).Weight = xlMedium;
- rng.Borders.Item(xlEdgeRight).Weight = xlMedium;
- rng.HorizontalAlignment=xlCenter;//水平居中
- rng.VerticalAlignment=xlCenter;//垂直居中
- rng.Font.Name="黑体"
- rng.Font.Size=16
-
- // 合并单元格
- let r = 1, c = 2, cs = 0, ce = 0;
- while(r <= 2){
- while(c <= res[0].length){
- if(Sheets('转表').Cells(r, c).Text != Sheets('转表').Cells(r, c - 1).Text){
- cs = c; // 开始新的合并区域
- } else {
- if(Sheets('转表').Cells(r, c).Text != Sheets('转表').Cells(r, c + 1).Text){
- ce = c; // 结束当前合并区域
- if(ce > cs) {
- Sheets('转表').Range(Sheets('转表').Cells(r, cs), Sheets('转表').Cells(r, ce)).Merge(true);
- }
- }
- }
- c++;
- }
- r++;
- }
- }
复制代码
|
|