wps js宏实战案例:批量汇总订单数据、识别黑名单、自动统计业绩、每笔订单生成带条形码的发货单并输出为pdf文件用于打印

wps js支持ES6语法,对比vba能节省非常多的代码量,不过缺点也很明显,wps js环境暂时不支持调用win系统组件和第三方控件。小声比比:可能有调用的方法,只是我没发现。

基本需求:
  1. 可以选择订单文件,支持多选

  1. 生成订单汇总表,识别每笔订单的黑名单、外岛地区、边远地区的状态,并标用颜色标记

  1. 通过复选框决定是否生成发货单,要求除了黑名单外,每笔订单生成一个条形码,并将数据写入预先设定的发货单模板样式,相同交易序号的需要合并在同一个发货单里面,然后将所有发货单输出为一个pdf文件用于打印

  1. 通过复选框决定是否生成业绩表,除了黑名单之外,统计每个店铺的业绩

  1. 黑名单、外岛地区、边远地区,可以随时修改

  1. 加上客服名字

成品效果图:

订单汇总表、业绩表、发货单pdf的样式

原始订单表格数据

动图演示效果

实现思路:
  1. 用FileDialog对象弹出可供用户选择文件的对话框选择文件,以获取选中文件的完整路径

  1. 遍历所选文件,循环提取订单数据

  1. 获取用户选项,如获取(黑名单、外岛地区、边远地区)名单、模板、客服名字,处理订单数据

  1. 合并相同交易序号的订单,将数据写入模板

步骤过程:
一、创建一个按钮添加点击事件处理函数来执行代码;创建两个复选框,根据是否选中来生成发货单pdf、生成业绩表

模板存放位置

二、根据实现思路,先写好代码框架,功能再一个一个写,通过模块化开发,比较容易理清代码逻辑
//主框架,通过模块化开发,比较容易理清代码逻辑
function CommandButton1_Click() {
    let wb = ThisWorkbook       //获取当前工作簿
        , sht1 = wb.Sheets(1)   //获取Sheet1工作表
        , sht2 = wb.Sheets(2)   //获取汇总表模板
        , sht3 = wb.Sheets(3)   //获取发货单模板
        , sht4 = wb.Sheets(4)   //获取业绩表模板

    //调用文件对话框,如果用户未选择文件则退出函数执行
    let pth = getFilePath()
    if (!pth) return sht1.Range('B3').Value2 = ''

    //提取订单数据
    let data = getFileData(pth)
    sht1.Range('B3').Value2 = pth.join('\n')

    //提取Sheet1工作表的日期、客服名称、指定文件路径;处理数据,根据订单收件人、电话、地址,识别黑名单、外岛地区、边远地区
    let options = getOptions(sht1, data)

    //生成订单汇总表
    createSummary(sht2, options)

    //判断Sheet1工作表的复选框是否选中来生成发货单和业绩表
    if (CheckBox1.Value) createDelivery(sht3, options)
    if (CheckBox2.Value) createAchievement(sht4, options)

}

三、模块化函数,以下都是模块化封装的函数,可以重复利用,要用的时候直接复制到项目里,提升效率,节省时间
//弹出文件选择对话框,提取已选中文件的完整路径
function getFilePath() {
    let fd = Application.FileDialog(msoFileDialogFilePicker)
        , pth = []
    fd.Filters.Clear()
    fd.Filters.Add('Excel文件', '*.xls;*.xlsx;*.csv')
    fd.Title = '请选文件'
    if (fd.Show() != -1) {
        alert('你没选中文件!')
        return '' //结束代码执行并返回空,用于判断用户是否选择文件
    }
    for (let i = 0; i < fd.SelectedItems.Count; i++) {
        pth[i] = fd.SelectedItems.Item(i + 1) //提取文件路径
    }
    return pth
}

//提取Excel文件的活动工作表数据
function getFileData(pth) {
    let data = []
    for (let i = 0; i < pth.length; i++) {
        let wb = Workbooks.Open(pth[i])
            , arr = wb.ActiveSheet.Range('A1').CurrentRegion.Value2
        wb.Close(false)
        if (i > 0) arr.shift() //因为保留一行表头,所以循环到第二个工作簿开始要去掉表头
        data = data.concat(arr) //合并数组
    }
    return data
}

//日期格式化yyyy-mm-dd HH:MM:SS
function dateFormat(fmt, date) {
    const opt = {
        'y+': date.getFullYear().toString(),
        'm+': (date.getMonth() + 1).toString(),
        'd+': date.getDate().toString(),
        'H+': date.getHours().toString(),
        'M+': date.getMinutes().toString(),
        'S+': date.getSeconds().toString()
    }
    for (let k in opt) {
        let ret = new RegExp('(' + k + ')').exec(fmt)
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, '0')))
        }
    }
    return fmt
}

四、获取基本选项,生成汇总表、发货单pdf、业绩表的功能代码
//提取Sheet1工作表的当前日期、客服名称、黑名单、外岛地区、边远地区名单,指定文件路径
function getOptions(sht, data) {
    const options = {}
        , pth = ThisWorkbook.Path + '\\'
        , today = dateFormat('yyyy-m-d', new Date)

    options['日期'] = today
    options['客服'] = sht.Range('B2').Value2
    options['汇总表路径'] = pth + today + options['客服'] + '订单汇总表.xlsx'
    options['发货单路径'] = pth + today + options['客服'] + '发货单.pdf'
    options['业绩表路径'] = pth + today + options['客服'] + '业绩表.xlsx'

    let i = 0
        , arr = []
        , hmd, wd, by //黑名单、外岛地区、边远地区
    i = sht.Range('A8').End(xlDown).Row
    arr = sht.Range('A8:A' + i).Value2
    hmd = new RegExp(arr.join('|'))      //黑名单正则

    i = sht.Range('B8').End(xlDown).Row
    arr = sht.Range('B8:B' + i).Value2
    wd = new RegExp(arr.join('|'))       //外岛地区正则

    i = sht.Range('C8').End(xlDown).Row
    arr = sht.Range('C8:C' + i).Value2
    by = new RegExp(arr.join('|'))       //边远地区正则

    //识别黑名单、外岛地区、边远地区
    options['data'] = data.map(function (item) {
        let str = item[5] + item[6] + item[8]
        item.unshift('正常')
        if (by.test(str)) item[0] = '边远地区'
        if (wd.test(str)) item[0] = '外岛地区'
        if (hmd.test(str)) item[0] = '黑名单'
        return item
    })
    return options
}

//生成订单汇总表
function createSummary(sht, options) {
    //复制订单汇总表模板到新工作簿
    let wb = Workbooks.Add()
    sht.Copy(wb.ActiveSheet)

    let mysht = wb.ActiveSheet
        , data = options['data']
        , ros = data.length

    //订单汇总表预处理
    mysht.Range('B2, C2:R2, U2:AC2, AF2, AH2:AJ2').Value2 = ''
    mysht.Range('A2:AM' + ros).FillDown()
    mysht.Rows('2:' + ros).RowHeight = 36

    //写入数据
    mysht.Range('A1:A' + ros).Value2 = data.map(function (item) {
        return item.slice(0, 1)
    })
    mysht.Range('A1').Value2 = '区分类'
    mysht.Range('B2:B' + ros).Value2 = options['客服']
    mysht.Range('C1:F' + ros).Value2 = data.map(function (item) {
        return item.slice(1, 5)
    })
    mysht.Range('L1:P' + ros).Value2 = data.map(function (item) {
        return item.slice(5, 10)
    })
    mysht.Range('U1:U' + ros).Value2 = data.map(function (item) {
        return item.slice(10, 11)
    })
    mysht.Range('V1:AB' + ros).Value2 = data.map(function (item) {
        return item.slice(11)
    })

    //标记颜色
    data.forEach(function (item, i) {
        let j = i + 1
        if (item[0] == '边远地区') mysht.Range(`A${j}:AM${j}`).Interior.ColorIndex = 33
        if (item[0] == '外岛地区') mysht.Range(`A${j}:AM${j}`).Interior.ColorIndex = 43
        if (item[0] == '黑名单') mysht.Range(`A${j}:AM${j}`).Interior.ColorIndex = 15
    })

    //删除Sheet1工作表
    Application.DisplayAlerts = false //禁止弹出警告提示
    wb.Sheets('Sheet1').Delete()
    Application.DisplayAlerts = true

    //保存工作簿
    wb.SaveAs(options['汇总表路径'])
    
}

//生成发货单
function createDelivery(sht, options) {
    let wb = Workbooks.Add()
    sht.Copy(wb.ActiveSheet)

    let mysht = wb.ActiveSheet
        , data = options['data']
    
    //利用对象方法查重订单
    const order = {}
    data.forEach(function (item, i) {
        if (i == 0) return
        if (item[0] == '黑名单') return

        let num = item[5]
        if (order[num]) {
            let con = order[num]
                , ros = mysht.Cells(65536, con + 2).End(xlUp).Row + 1
            mysht.Range(mysht.Cells(ros, con), mysht.Cells(ros, con + 6)).Value2 = item.slice(11)
            mysht.Cells(5, con + 5).Value2 += Number(item[16]) + Number(item[17])

        } else {
            mysht.Range('A3:I3, A5:I5, A7:I7').Value2 = ''
            mysht.Range('A3:E3').Value2 = [options['客服'], item[1], item[2], item[3], item[4]]
            mysht.Range('A5:E5').Value2 = item.slice(5, 10)
            mysht.Range('F5').Value2 = Number(item[16]) + Number(item[17])
            mysht.Range('G5').Value2 = item[10]
            mysht.Range('A7:G7').Value2 = item.slice(11)

            let mod = mysht.Range('A2:I12')
                , arr = [12, 12, 12, 12, 10, 9, 9, 9, 9] //列宽
                , con = mysht.Cells(6, Columns.Count).End(xlToLeft).Column + 1 //列号
                , link = `https://bwipjs-api.metafloor.com/?bcid=code128&text=${num}&height=9`

            mod.Copy(mysht.Cells(2, con))
            for (let i in arr) {
                mysht.Columns(Number(i) + con).ColumnWidth = arr[i] //设置列宽
            }

            let lef = mysht.Cells(6, con).Left + 220
            mysht.Shapes.AddPicture(link, true, true, lef, 12, 151.5, 40) //插入条形码图片
            order[num] = con  //记录列号
        }

    })

    //删除A:I列
    mysht.Columns('A:I').Delete()
    wb.Sheets('Sheet1').Visible = false //隐藏Sheet1工作表
    wb.SaveAs(options['发货单路径'], 103) //导出pdf
    wb.Close(false) //关闭工作簿
    Shell('wps.exe ' + options['发货单路径'], jsNormalNoFocus) //打开pdf文件
    
}

//生成业绩表
function createAchievement(sht, options) {
    let wb = Workbooks.Add()
    sht.Copy(wb.ActiveSheet)

    let mysht = wb.ActiveSheet
        , data = options['data']

    //利用对象查重
    const order = {}
    data.forEach(function (item, i) {
        if (i == 0) return
        if (item[0] == '黑名单') return

        let shop = item[3] //店名
        if (order[shop]) { //如果存在店名
            order[shop][0] += 1
            order[shop][1] += Number(item[16]) + Number(item[17])

        } else { //如果不存在店名
            order[shop] = [1, Number(item[16]) + Number(item[17])]
        }

    })

    //遍历对象写入数据
    let ros = 2
    for (let item in order) {
        mysht.Range(`C${ros}:E${ros}`).Value2 = [item, order[item][0], order[item][1]]
        ros++
    }

    //设置样式
    ros = ros - 1
    mysht.Rows('2:' + ros).RowHeight = 33 //设置行高
    mysht.Range('A1:G' + ros).Borders.LineStyle = xlContinuous //设置边框
    mysht.Range(`A2:A${ros}, B2:B${ros}, F2:F${ros}, G2:G${ros}`).Merge() //合并单元格

    mysht.Range('F2').Formula = `=SUM(D2:D${ros})` //设置单元格公式
    mysht.Range('G2').Formula = `=SUM(E2:E${ros})`
    mysht.Range('A2:B2').Value2 = [options['日期'], options['客服']]

    Application.DisplayAlerts = false
    wb.Sheets('Sheet1').Delete() //生成Sheet1工作表
    Application.DisplayAlerts = true
    wb.SaveAs(options['业绩表路径'])
    
}

源码地址(含4个原始订单数据文件):

https://download.csdn.net/download/huaermeier/87453744

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WPS JS开发电商订单转换工具是一种能够帮助电商企业批量汇总订单数据识别黑名单自动统计业绩的工具。 首先,这个工具可以批量汇总订单数据。电商企业的订单数据通常分散在不同的系统或表格中,手动整理非常耗时且容易出错。使用WPS JS开发的工具,可以自动将各个系统和表格中的订单数据收集起来,形成一个统一的订单汇总表格,大大提高了数据整理的效率。 其次,这个工具可以识别黑名单。对于电商企业来说,黑名单客户往往是一种风险,因为这些客户可能存在欺诈行为或者频繁退货等问题。使用WPS JS开发的工具,可以根据预设的规则或黑名单列表,自动识别黑名单客户,并在订单汇总表格中标记或筛选出来,帮助企业加强风险管控。 另外,这个工具还可以自动统计业绩。电商企业常常需要统计不同业务部门或销售人员的销售额以及其他关键业绩指标,这个工具可以根据订单数据自动生成对应的统计报表,并自动计算出各项指标,节省了手工统计的时间和精力。 最后,这个工具可以定时执行。通过设置定时任务,工具可以在每天或每周指定的时间自动执行相应的操作,比如更新订单数据识别黑名单统计业绩等,提高了工作效率和数据准确性。 综上所述,WPS JS开发电商订单转换工具是一款功能全面的工具,可以帮助电商企业提高订单数据的整理效率,降低风险,自动统计业绩,实现自动化的数据处理,提升企业的运营效率和竞争力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Excel效率人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值