立即注册 登录
公卫人 返回首页

PH_Pr的个人空间 https://www.epiman.cn/?139252 [收藏] [复制] [RSS]

日志

利用WPS JS自动化拆分工作簿的其中一个场景的应用

已有 181 次阅读2025-1-1 12:04 |个人分类:聊点技术活| WPS, JS, JavaScript, 自动化

 近期,遇到1问题描述如下。日常有个财务汇总表,每日产生很多流水数据,都记录在WPS表。要求能随时随地依据第4列项目“收款人”的公司名称,进行分类汇总并拆分到不同的工作簿。对每个工作簿特定列,要计算求和。并且求和项要夹在标题项目下面的一行,而非通常的将合计自上而下放在每行最下面。对每个拆分出来的工作簿的命名要求是,拆分出来哪个公司,就以哪个公司名称+本公司名称+结算时间,来命名。目前,有5家子公司都要统一使用上述表格。请设计出这么个表,并保证其具有通用性,便于后期维护。

    关于拆分功能,网上很多,抄抄改改即可。为了通用,我们增加个设置的功能。设置,可以按上图技术路径自选。打个样如下:

拆分:

function CF(){

Application.DisplayAlerts=false; //关闭提醒,防止拆分过程被打断

new_custab();//调用新建客户表程序

Sheets.Item("设置").Visible=false;

// 获取"设置"工作表

    var sheet = Sheets.Item("设置");

    

    // 获取A2:AZ2的范围

    var range = sheet.Range("A2:AZ2");

    

    // 将范围的值加载到数组中

    var dataArray = range.Value2[0];

    

obj={}; //定义一个字典对象obj,用于存放文件标题

//获取公司名字字段

let isheet = ThisWorkbook.Sheets.Item("结算及尾款");

let icellValue = isheet.Range("A1").Value2;

// 定义要检查的关键字

let keywords = ["金桂", "玖龙", "理文", "太阳", "仙鹤"];

// 初始化变量

let globalVar = "";

// 检查单元格值是否包含关键字

for (let bf = 0; bf < keywords.length; bf++) {

    if(icellValue.indexOf(keywords[bf])!== -1) {

        globalVar = keywords[bf];

        break; // 找到匹配的关键字后跳出循环

    }

}

p=ThisWorkbook.Path+"//"+globalVar+" - "; //拆分文件夹

//p="C:\\Users\\Administrator\\Desktop\\拆分";

th=ThisWorkbook.ActiveSheet;

//t = parseInt(InputBox("请输入标题行数","标题行数",3)); //标题行数,接受用户输入

t=3;

//col=InputBox("请输入拆分列名","拆分列名",'d'); //拆分列名,接受用户输入

col="D";

c = th.Range(col+1).Column; //获取拆分列号

rn=th.Range("A"+Rows.Count).End(xlUp).Row; //最后一行数据行号

tg=Rows("1:"+t); //将标题区域写入单元格对象tg

ar=th.Range(col+(t+1)+":"+col+rn).Value2; //将关键列写入数组ar

ar.forEach(v=>obj[v]=v); //将拆分列写入字典对象obj,目的是去重

for(k of Object.keys(obj)){

th.Range("A"+t).AutoFilter(); //取消筛选

let nw = Workbooks.Add(); //新建工作簿

let sh = nw.Sheets.Item(1); //新工作簿的第一张工作表

tg.Copy(sh.Range("A1:AX"+t));

th.Range("A"+t).AutoFilter(c,k); //筛选数据

th.Range("A"+t).CurrentRegion.Offset(1,0).Copy(

sh.Range("A"+(t+1))); //复制筛选后的数据

q=k+"-"+Range("A2")+"-";

//求和

for(let ii=0;ii<=51;ii++){

let da=dataArray[ii];

if(da==1||da=="1"){

var kk=4;

let iisum=0;

let wo=ii+1;

while(nw.Sheets.Item(1).Cells(kk,wo).Value2!=undefined){

iisum+=nw.Sheets.Item(1).Cells(kk,wo).Value2;

kk+=1;

}

nw.Sheets.Item(1).Cells(kk,wo).Value2=iisum;

nw.Sheets.Item(1).Cells(kk,3).Value2="合计";

//格式调整

nw.Sheets.Item(1).Columns.Item(wo).Select();

Selection.ColumnWidth =40;

nw.Sheets.Item(1).Cells(kk,wo).Select();

Selection.NumberFormatLocal = "G/通用格式";

Selection.NumberFormatLocal = "#,##0.000_ ";


(obj=>{

obj.HorizontalAlignment = xlHAlignCenter;

obj.VerticalAlignment = xlVAlignCenter;

})(Selection);

}

}

//把合计弄到第4行

let c_n=4;

while(nw.Sheets.Item(1).Cells(c_n,3).Value2!=undefined){//确定合计所在的行

c_n+=1;

}

c_n-=1;

Rows.Item(c_n).Select();

Selection.Cut(undefined);

Rows.Item("4:4").Select();

Rows.Item(c_n).Cut(undefined);

ActiveSheet.Select(false);

Selection.Insert(xlShiftDown, undefined);

ActiveSheet.Select(false);

Range("A4").Select();

//把序号重新排排序

var inum=c_n-4;

for(icle=1;icle<=inum;icle++){

let ddd=4+icle;

Range("A"+ddd).Value2=icle;

}


//保存

nw.SaveAs(p + q + ".xlsx", undefined, undefined, undefined, undefined, undefined, xlNoChange, 1, -1, undefined, undefined); //保存表格

nw.Close(); //关闭表格

th.Range("A"+t).AutoFilter(); //取消筛选

}

th.Range("A"+t).AutoFilter(); //取消筛选

//删除客户表

var sh;

for (sh of Sheets){ 

if(sh.Name!="润港发玖龙结算及尾款" && sh.Name!="设置"){

sh.Delete(); 

}

}

//关闭“设置”表

set_tab_close();

//打开提醒

Application.DisplayAlerts=true; 

alert("拆分完成!"); 

}

拆分总表吗?不,做一个辅助表来拆更好保护原表:

function new_custab(){//新增客户表
//删除所有的表
Application.DisplayAlerts=false; //关闭提示
Sheets.Item("设置").Visible=false;
Sheets(1).Name="结算及尾款";
let sh;
for (sh of Sheets){ //遍历所有工作表
if(sh.Name!="结算及尾款" && sh.Name!="设置"){
sh.Delete(); //删除工作表
}
}
//新增一个“客户表”
let th=Sheets.Item("结算及尾款");
let nh=Sheets.Add(undefined,After=th); //新建工作表
nh.Name="客户表";
//将项目从总表写入客户表
Sheets.Item("润港发玖龙结算及尾款").Activate();
//先处理一下表头,把居中格式改成跨列居中
Sheets.Item("润港发玖龙结算及尾款").Activate();
(obj=>{
obj.UnMerge();
obj.HorizontalAlignment = xlHAlignGeneral;
})(Selection);
(obj=>{
obj.HorizontalAlignment = xlHAlignCenterAcrossSelection;
obj.VerticalAlignment = xlVAlignCenter;
obj.ReadingOrder = -5002;
obj.AddIndent = false;
obj.IndentLevel = 0;
obj.Orientation = 0;
obj.WrapText = false;
obj.ShrinkToFit = false;
})(Selection);
Range("A2:M2").Select();
(obj=>{
obj.UnMerge();
obj.HorizontalAlignment = xlHAlignGeneral;
})(Selection);
for(let i=1;i<=52;i++){//将“设置”表里的勾选的项目所在列,复制到客户表
if(Sheets.Item("设置").Cells(1,i).Value2==1||Sheets.Item("设置").Cells(1,i).Value2=="1"||Sheets.Item("设置").Cells(2,i).Value2==1||Sheets.Item("设置").Cells(1,i).Value2=="1"){
Sheets.Item("润港发玖龙结算及尾款").Columns.Item(i).Select();
Selection.Copy(undefined);
Sheets.Item("客户表").Activate();
Columns.Item(i).Select();
ActiveSheet.Paste(undefined, undefined);
Sheets.Item("润港发玖龙结算及尾款").Activate();
}
}
//删除客户表的空列
Sheets.Item("客户表").Activate();
var flag=0;
for(i=1;1<=38;i++){
if(Sheets.Item("客户表").Cells(3,i).Value2===undefined){
Columns.Item(i).Select();
Selection.Delete(xlShiftToLeft);
i-=1;
flag+=1;
if(flag==104){
break;
}
}
}
//将空行删除
Rows.Item("4:4").Select();
Selection.Delete(xlShiftUp);
Range("A1").Select();
Sheets.Item("设置").Visible=true;
}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

改名|钢镚|会员|联系我们|公卫人 ( 沪ICP备06060850号-3|沪公网安备31010402334125号 )

GMT+8, 2025-8-31 23:43 , Processed in 0.033058 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部