【记者团】微信公众号文章生成Excel作品表

你在运营公众号的时候是否会遇到需要统计每篇文章下面的署名呢?

在社团中我就做过这种工作的时候,在以前我们都是发在线表格让大家去填写,但是这样非常耗费时间。

有的同学可能忘了自己编辑了什么推文,即使记得,一个人填写表格也要5分钟,10个人就是50分钟了。

而用程序只需要几分钟就好了,下面一起来和酷酷看看~

图1:微信公众号下方的文章署名

图2:最终保存的excel表格


温馨提示本篇文章较长,细节处较多,逻辑结构较为复杂。第一次操作前建议先阅读完整篇文章并理解,再从头开始跟着教程一步步操作。

操作步骤

前期准备(重点):推文下方在署名时,请如下图所示填写。第一,使用中文冒号;第二,姓名与姓名之间使用空格,不用使用其他任何符号,否则数据会有遗漏;第三,程序只会统计关键字为图片、文字、编辑、视频、校对的署名,类似于照片、文字征集、图片/视频不会进行统计。

微信公众号下方的文章署名

微信公众号下方的文章署名

步骤一:生成excel作品表及完善作品表

1、登录微信公众号后台,打开【发表记录】。

  1. Ctrl+S或右击网页,保存【html网页文件】。

3、记住html文件保存路径(如下图,最上面红色方框是html文件的保存路径),并设置【html文件名称】。

html文件:html是网页文件,里面保存着微信发布的推文链接,通过推文链接程序会自动解析每个网页文件中的文章署名。

注意:html文件由序号1~n,html文件名称格式数字+公众号.html,如1公众号.html,注意文件名称不要搞混了。

4、点击第2页的文章发表记录,重复步骤2、步骤3的操作。

5、效果图:下载好所有html文件

6、运行程序:在当前文件夹下(注意:html文件和exe文件在同一文件夹下)双击运行程序微信公众号文章生成excel作品表.exe此程序会自动生成excel公众号文章作品表。

程序:公众号“小知识酷”后台回复“230828公众号excel作品表”获取exe文件

html文件和exe文件在同一文件夹下

7、当我们在运行exe文件时会出现下方需要输入的内容。
其中输入3-3表示只生成3公众号.html里面的作品表;
输入1-2表示只生成1公众号.html2公众号.html里面的作品表;
输入2-4表示只生成2公众号.html3公众号.html4公众号.html里面的作品表。

8、打开excel文件查看,此时“作品表”已经生成。


9、在A列插入“统计人的姓名”,在G列I列插入“字数”和“张数”,让同学们统计“文字字数”和“图片张数”,如下:

官微作品表统计-要求说明(一定要看!!!)https://www.cnblogs.com/MrFlySand/p/17810635.html点击链接查看,把这个链接发给其他同学统计“字数”和“张数”,文章里面有统计文字字数的方法

image

10、让@抖音负责人及短视频成员填写《抖音作品表》,程序后面会自动统计官微和抖音的积分和稿费。(注:每次上报稿费还要让校报负责人单独统计校报稿费)
image

11、删除《官微作品表》中的A列(负责统计“字数”和“张数”的同学),效果如下图:
image

12、在“官微作品表”中删除无用数据(如下图中的红色方框),这些数据会影响后面的统计。

无用数据:非记者团成员的姓名、老师的姓名、“大学生记者团图库”等与记者团正式成员无关者的内容。我们只需要保留记者团正式成员的姓名,后面会根据正式成员的姓名统计积分和稿费。

13、Ctrl+H替换《官微作品表》和《抖音作品表》中的2个空格为1个空格,多次点击“全部替换”,直到查找个数为0。(避免统计空格的稿费)

操作步骤:在“查找内容”输入2个空格,在“替换为”输入1个空格,全部替换。
image

14、清除前后空字符串:查看编辑、文字、图片、视频、音频、抖音列中的姓名中是否有多余的空格,如下图中的红色方框。如果单元格姓名前面或后面有空格,单元格左上角会有绿色小三角图标提示,此时我们需要将姓名单元格前面和后面的空格删除,但姓名与姓名之间保存空格。

image

操作步骤(清除前后空字符串):
  1. A1单元格中的文字前面多输入一个空格,此时单元格左上角会出现绿色小三角图标提示
    image
  2. A1单元格(绿色小三角图标的单元格,首先选中含有空字符的单元格)开始选中全部内容,被选中的区域右上角会出现黄色感叹号,点击然后选择“清除前后空字符串”即可全部清除。需要注意,若没有首选含空字符的单元格而全选表格,则不会出现黄色感叹号。
    image
出处(WPS官方教程)
首先选中含有空字符的单元格,确保可以在此单元格右上角看到黄色感叹号,接着用「shift+鼠标左键」选中需要清除空字符的表格区域。被选中的区域右上角会出现黄色感叹号,点击然后选择“清除前后空字符串”即可全部清除,需要注意,若没有首选含空字符的单元格而全选表格,则不会出现黄色感叹号。

教程链接:https://bbs.wps.cn/topic/10958?chan=pc_win_errortips&chan=share&fromshare=copylink

15、当我们制作完成“作品表”(最基本的数据源)后可以实现2种功能:积分统计(工作量统计,功能一)或稿费统计(功能二)。往下滑动,查找功能一/功能二

手动制作《官微作品表》(exe无法正常运行请看这)

注意(前言): exe无法正常运行请看这。因为电脑系统或电脑环境,exe可以因为各种原因无法运行,此时我们就需要手动制作《官微作品表》。excel可以正常生成请跳到步骤二(往下查看)

操作步骤
  1. 当我们没有exe文件或exe文件无法正常运行时,此时前面的步骤就无效了。现在我们就只能手动制作在线文档版的作品表,操作如下。

  2. 登录到微信公众号后台——点击【内容分析】——【单篇群发】——设置时间段——【下载数据明细】

导出Excel
如下图黑色箭头,下面有一个绿色图标导出Excel是由“美编助手”插件提供,否则不会显示。(点击《简单、免费、快捷的公众号运营工具 — 模板样式》获取相关教程)

  1. 在浏览器中按Ctrl+J查看下载的软件,并打开excel表格。

浏览器下载的内容

刚才下载的数据表

  1. 删除C列~O列(教程:百度“excel删除指定列”)

  1. 修改表格如下图,一定要从C列开始的顺序是编辑、校对、文字、图片、视频、音频、学生主编(7个工作内容都不能少)

  1. 点击表格中的链接,此时浏览器会打开一个网页(或将链接复制到浏览器地址栏中,如图2红色方框)。

正常的网页后台网页链接页面

  1. 在“在线文档”中填写日期所对应的推文名称、推文署名等。
    图2

  2. 当我们制作完成“作品表”(最基本的数据源)后可以实现2种功能:积分统计(工作量统计,功能一)或稿费统计(功能二)。

步骤二:积分统计和稿费统计

重点说明(前言):前面我们制作了《官微作品表》和《抖音作品表》,2个工作表的格式一定要和下图中的内容一致,如:C列一定是“编辑”,F列一定是“字数”,I列一定是“视频”,K列一定是“学生主编”等。这样格式的excel才能使用下方的代码(正确率达95%),如果代码无法正常运行,一定要多次检查表格格式。

image

操作步骤

  1. 点击【开发工具】—【WPS宏编辑器】(只能使用【wps软件】-【wps宏编辑器】,其他软件无法使用),将下面代码复制到新打开的窗口中。

  1. 注意位置1那里必须是“wps宏编辑器”。如果位置1是“VBA编辑器”,可点击位置2处的“切换环境”

image

  1. 复制下方代码到新的窗口中
    img
/*
名称:积分统计
作用:微信公众号作品表统计每个人的工作量
链接:https://www.cnblogs.com/MrFlySand/p/17659466.html
更新时间:2023年8月26日21:01:59
*/
function 统计学生所有积分() {
    // sheet1SumLow:“官微作品表”的总行数
    var sheet1SumLow = Worksheets("官微作品表").UsedRange.Cells.Rows.Count;
    //alert("官微作品表总行数:" + sheet1SumLow);

    // 新建工作表名称为“积分表”
    var scoreTable = "积分表"
    var sht = Worksheets.Add(null, Sheets(Sheets.Count));
    sht.Name = scoreTable;

    // 设置表格标题
    var day = new Date();
    var month = day.getMonth() + 1;
    Sheets.Item(scoreTable).Range("A1").Value2 = "记者团" + (month - 1) + "月份积分表";
    /// 设置表格标题颜色为红色
    Range("A1").Select();
    (obj => {
        obj.Color = 192;
    })(Selection.Font)

    //“积分表”中录入基本职责
    var jobName = ["姓名", "编辑", "校对", "文字", "图片", "视频", "音频", "学生主编", "抖音", "活动", "总积分"];
    for (var letter = 65, i = 0; letter <= 77; letter++, i++) {
        Sheets.Item(scoreTable).Range(String.fromCharCode(letter) + "2").Value2 = jobName[i];
    }

    // 获取“官微作品表”和“抖音作品表”中所有的姓名
    let names = []; //存储所有的姓名
    ///“官微作品表”中获取所有姓名
    let arr = Sheets.Item("官微作品表").Range("A3:I" + sheet1SumLow).Value2 // 选中“官微作品表A3:I22”
    for (let j = 2; j <= 10; j++) { //获取“官微作品表”中第3列~第9列中的姓名
        if (j == 5 || j == 7) {
            j = j + 1;
        }
        for (let i = 0; i < arr.length; i++) {
            let name = arr[i][j];
            if (name != null) {
                if (name.includes("")) { // 判断是否有姓名
                    let n = name.split(" "); //对当前单元格姓名进行分割
                    for (let k = 0; k < n.length; k++) {
                        if (!(names.includes(n[k]))) {
                            names.push(n[k]);
                        }
                    }
                }
            }
        }
    }
    ///“抖音作品表”中获取所有姓名
    var tiktokSumLow = Worksheets("抖音作品表").UsedRange.Cells.Rows.Count; // “抖音作品表”总行数
    //alert("抖音作品表总行数:" + tiktokSumLow)
    arr = Sheets.Item("抖音作品表").Range("A3:C" + tiktokSumLow).Value2 // 选中“抖音作品表A3:I22”
    for (let j = 2; j <= 2; j++) { //获取“抖音作品表”中第3列中的姓名
        for (let i = 0; i < arr.length; i++) {
            let name = arr[i][j];
            if (name != null) {
                if (name.includes("")) { // 判断是否有姓名
                    let n = name.split(" "); //对当前单元格姓名进行分割
                    for (let k = 0; k < n.length; k++) {
                        if (!(names.includes(n[k]))) {
                            names.push(n[k]);
                        }
                    }
                }
            }
        }
    }
    /// 选择“积分表”A3~AmaxNun,names[j]所有姓名赋值给A列
    for (var i = 3, j = 0; names[j] != null; i++) {
        Sheets.Item(scoreTable).Range("A" + i).Value2 = names[j++];
    }

    //统计每个学生的官微积分
    var nameLen = names.length; //积分表所有的行数
    //alert(nameLen)
    /// 编辑、校对、文字、图片、视频、音频、学生主编积分分别如下:
    var cardNum = [1, 1, 1, 1, 1, 1, 1];

    ///遍历“积分表”A3~maxLow,得到所有的姓名
    for (var i = 3; i <= nameLen + 2; i++) {
        //遍历“积分表”B2~H2,统计各个职责中每个姓名出现的次数,low“积分表”的列,integRow“官微表”的列
        for (var low = 66, integRow = 67, cardIndex = 0; low != 73; low++, integRow++, cardIndex++) {
            var integration = 0; //每个名字出现的次数
            // 遍历“官微作品表”中所有的行A3~Amax
            for (var j = 3; j <= sheet1SumLow; j++) {
                //for (var k = 3; k <= nameLen + 2; k++) {
                var nameCell = Sheets.Item("官微作品表").Range(String.fromCharCode(integRow) + j).Value2; // 获取官微中每列出现的姓名值
                var cell = Sheets.Item(scoreTable).Range("A" + i).Value2; //获取积分表的姓名  
                for (var a = 0; nameCell != null && nameCell[a] != null && nameCell[a + 1] != null; a++) {
                    for (var b = 0; cell != null && cell[b] != null; b++) {
                        if (nameCell[a] == cell[b] && nameCell[a + 1] == cell[b + 1]) {
                            integration++;
                            a++;
                            b++;
                        }
                    }
                }
            }
            // 每列的积分赋值:“积分表”单个工作的积分
            Sheets.Item(scoreTable).Range(String.fromCharCode(low) + i).Value2 = integration * cardNum[cardIndex];
        }
        cardIndex = 0;
    }

    //统计抖音的积分
    for (var i = 3; i <= nameLen + 2; i++) { //遍历积分表A3~A100,得到所有姓名列
        var integration = 0;
        for (integRow = 67; integRow != 69; integRow++) { //low遍历积分表B2~H2
            for (var j = 3; j <= tiktokSumLow; j++) {
                var nameCell = Sheets.Item("抖音作品表").Range(String.fromCharCode(integRow) + j).Value2; // 获取“抖音作品表”中每列的姓名
                var cell = Sheets.Item(scoreTable).Range("A" + i).Value2; //获取“积分表”表头的姓名  
                for (var a = 0; nameCell != null && nameCell[a] != null && nameCell[a + 1] != null; a++) {
                    var breakNum = 0;
                    for (var b = 0; cell != null && cell[b] != null; b++) {
                        if (nameCell[a] == cell[b] && nameCell[a + 1] == cell[b + 1]) {
                            integration++;
                            a++;
                            b++;
                        }
                    }
                }
            }
            // 抖音列每个人的积分
            Sheets.Item(scoreTable).Range("I" + i).Value2 = integration * 1;
        }
    }

    //“积分表”K列计算总积分
    for (var i = 3; i <= nameLen + 2; i++) {
        Sheets.Item(scoreTable).Range("K" + i).Value2 = "=sum(B" + i + ":J" + i + ")";
    }
}
/*
名称:稿费统计
作用:计算稿费和工作量及任务次数
链接:https://www.cnblogs.com/MrFlySand/p/17659466.html
更新时间:2023年10月27日11:30:25(计算稿费和工作量及任务次数)
2023年10月27日12:19:08
*/


/* 
-----------------------------------------------------------------------------
function:计算单个人的稿费合计
name:名字在第几列
value:统计的数值在第几列
*/
function price(sheetName, dict, nameRow, valueRow, work) {
    //sheet1SumLow:“官微作品表”的总行数
    var sheet1SumLow = Worksheets(sheetName).UsedRange.Cells.Rows.Count;
    //alert("官微作品表总行数:" + sheet1SumLow);

    let arr = Sheets.Item(sheetName).Range("A3:Z" + String(sheet1SumLow)).Value2
    let scores = {};
    for (let i = 0; i < arr.length; i++) {
        let name = arr[i][nameRow]; //当前表中有哪些姓名
        let score = arr[i][valueRow]; //姓名后面的单任务稿费

        if (name != null) {
            if (name.includes("")) { // 判断是否有姓名
                let names = name.split(" "); //对当前单元格姓名进行分割                
                let avgScore = Math.round(score / names.length * 100) / 100; //平均分
                //                works[work] = avgScore;
                // console.log(works[work]);
                for (let j = 0; j < names.length; j++) {
                    let n = names[j]; //单个单元格每个人的姓名                    
                    //console.log(n + "," + avgScore)
                    //console.log(n + "," +dict[n])
                    if (dict[n] == 0 || dict[n] == undefined) {
                        let works = { "编辑": 0, "文字": 0, "图片": 0, "视频": 0, "音频": 0, "抖音": 0, "编辑num": 0, "文字num": 0, "图片num": 0, "视频num": 0, "音频num": 0, "抖音num": 0 };
                        dict[n] = works;
                        dict[n][work] = avgScore;
                        dict[n][String(work) + "num"] += 1;
                        //console.log(n + "," +dict[n] + "," +avgScore)
                    } else {
                        dict[n][work] += avgScore;
                        dict[n][String(work) + "num"] += 1;
                    }
                    //                    console.log(i + "、" + n + "、" + work + "、" + dict[n][work]);
                }
            }
        }
    }

    //	输出结果
    //    var i = 3;
    //    for (var key in dict) {
    //        // 行数、姓名、单个任务的稿费
    //        //console.log((i - 2) + "、" + key + ":" + dict[key])
    //        //console.log(key + ":" + dict[key]);
    //        Sheets.Item("稿费代发表").Range("A" + i).Value2 = (i - 2); //序号
    //        Sheets.Item("稿费代发表").Range("B" + i).Value2 = key; //姓名
    //        //Sheets.Item("稿费代发表").Range("C" + i).Value2 = "=SUM(D" + i + ":H" + i + ")"; //
    //        Sheets.Item("稿费代发表").Range("C" + i).Value2 = parseInt(dict[key]); //总计
    //        i++;
    //    }
}

function main() {
	统计学生所有积分();
    // 《官微作品表》中插入“稿费”列
    Sheets.Item("官微作品表").Columns(4).Insert();
    Sheets.Item("官微作品表").Range("D2").Value2 = "稿费";
    Sheets.Item("官微作品表").Columns(8).Insert()
    Sheets.Item("官微作品表").Range("H2").Value2 = "稿费";
    Sheets.Item("官微作品表").Columns(11).Insert()
    Sheets.Item("官微作品表").Range("K2").Value2 = "稿费";
    Sheets.Item("官微作品表").Columns(13).Insert()
    Sheets.Item("官微作品表").Range("M2").Value2 = "稿费";
    Sheets.Item("官微作品表").Columns(15).Insert()
    Sheets.Item("官微作品表").Range("O2").Value2 = "稿费";

    /// 《官微作品表》中插入统计工作量稿费
    var sheet1SumLow = Worksheets("官微作品表").UsedRange.Cells.Rows.Count; //作品表初始化时的总行数
    //alert("官微作品表总行数:" + sheet1SumLow);
    for (let i = 3; i <= sheet1SumLow; i++) {
        Sheets.Item("官微作品表").Range("D" + i).Value2 = "=IF(COUNTA(C" + i + ")<>0,30,0)"; //编辑价格
        Sheets.Item("官微作品表").Range("H" + i).Value2 = "=IF(COUNTA(F" + i + ")<>0,G" + i + "/10,0)"; //文字价格 "=G" + i + "/10"
        Sheets.Item("官微作品表").Range("K" + i).Value2 = "=IF(COUNTA(I" + i + ")<>0,J" + i + "*10,0)"; //图片价格 =J" + i + "*10
        Sheets.Item("官微作品表").Range("M" + i).Value2 = "=IF(COUNTA(L" + i + ")<>0,80,0)"; //视频价格
        Sheets.Item("官微作品表").Range("O" + i).Value2 = "=IF(COUNTA(N" + i + ")<>0,50,0)"; //音频价格
    }
    
    /// 合计行:计算所有稿费合
    Sheets.Item("官微作品表").Range("A" + (sheet1SumLow + 1)).Value2 = "总计";
    Sheets.Item("官微作品表").Range("B" + (sheet1SumLow + 1)).Value2 = "=SUM(D" + (sheet1SumLow + 1) + ":P" + (sheet1SumLow + 1) + ")"; //总计
    //Sheets.Item("官微作品表").Range("C" + (sheet1SumLow  + 1)).Value2 = "=SUM(D" + (sheet1SumLow  + 1) + ":N" +(sheet1SumLow +1)+")"; //总计
    Sheets.Item("官微作品表").Range("D" + (sheet1SumLow + 1)).Value2 = "=SUM(D1:D" + sheet1SumLow + ")"; //编辑稿费
    Sheets.Item("官微作品表").Range("H" + (sheet1SumLow + 1)).Value2 = "=SUM(H1:H" + sheet1SumLow + ")"; //文字稿费
    Sheets.Item("官微作品表").Range("K" + (sheet1SumLow + 1)).Value2 = "=SUM(K1:K" + sheet1SumLow + ")"; //图片稿费
    Sheets.Item("官微作品表").Range("M" + (sheet1SumLow + 1)).Value2 = "=SUM(M1:M" + sheet1SumLow + ")"; //视频稿费
    Sheets.Item("官微作品表").Range("O" + (sheet1SumLow + 1)).Value2 = "=SUM(O1:O" + sheet1SumLow + ")"; //音频稿费

    /// 设置《官微作品表》金额总计行为红色字体
    /*Sheets.Item(1)
    Range("A" + (sheet1SumLow + 1) + ":P" + (sheet1SumLow + 1)).Select();
    (obj => {
        obj.Color = 192;
    })(Selection.Font)*/
	
	/*------------------------------------------------------------*/
	
    // 计算《抖音作品表》中的稿费
    Sheets.Item("抖音作品表").Range("D2").Value2 = "稿费"; 
    var sheet2SumLow = Worksheets("抖音作品表").UsedRange.Cells.Rows.Count; //《抖音作品表》初始化时的总行数
    for (let i = 3; i <= sheet2SumLow; i++) {
        Sheets.Item("抖音作品表").Range("D" + i).Value2 = "=IF(COUNTA(C" + i + ")<>0,80,0)"; //抖音作品表稿费列
    }

    /// 计算《抖音作品表》稿费和
    Sheets.Item("抖音作品表").Range("A" + (sheet2SumLow + 1)).Value2 = "总计";
    Sheets.Item("抖音作品表").Range("B" + (sheet2SumLow + 1)).Value2 = "=SUM(D3:D" + sheet2SumLow + ")"; //音频稿费
    Sheets.Item("抖音作品表").Range("D" + (sheet2SumLow + 1)).Value2 = "=SUM(D3:D" + sheet2SumLow + ")"; //音频稿费
	//// 计算《抖音作品表》总计行为红色字体
	//Sheets.Item("稿费代发表").Range("A" + endNum + ":K" + endNum).Select();
//	Sheets.Item("抖音作品表")
//	Range("A" & (sheet2SumLow + 1) & ":D" & (sheet2SumLow + 1)).Select();
    /*Range("A" + (sheet2SumLow + 1) + ":D" + (sheet2SumLow + 1)).Select();
    (obj => {
        obj.Color = 192;
    })(Selection.Font)*/

	/*------------------------------------------------------------*/
	
    // 创建新的工作表《稿费代发表》
    var shtName = "稿费代发表"
    var sht = Worksheets.Add(null, Sheets(Sheets.Count));
    sht.Name = shtName;

    /// 设置《稿费代发表》标题
    var day = new Date();
    var month = day.getMonth() + 1;
    Sheets.Item("稿费代发表").Range("A1").Value2 = "记者团" + (month - 1) + "月份积分表";
    /// 设置《稿费代发表》标题颜色为红色
    Sheets.Item("稿费代发表").Range("A1:E1").Select();
    (obj => {
        obj.Color = 192;
    })(Selection.Font)

    //《稿费代发表》录入基本信息、职责
    var jobName = ["序号", "姓名", "总计", "学号", "备注", "编辑", "文字", "图片", "视频", "音频", "抖音", "编辑", "文字", "图片", "视频", "音频", "抖音"];
    for (var letter = 65, i = 0; letter <= 89; letter++, i++) { //从A2到E2
        Sheets.Item("稿费代发表").Range(String.fromCharCode(letter) + "2").Value2 = jobName[i];
    }

    // 分别统计编辑、文字等单个任务的稿费,并统计总和
    var dict = {};
    price("官微作品表", dict, 2, 3, "编辑");
    price("官微作品表", dict, 5, 7, "文字");
    price("官微作品表", dict, 8, 10, "图片");
    price("官微作品表", dict, 11, 12, "视频");
    price("官微作品表", dict, 13, 14, "音频");
    price("抖音作品表", dict, 2, 3, "抖音");
    var i = 3;
    for (var key in dict) {
        // 行数、姓名、单个任务的稿费
        //        console.log((i - 2) + "、" + key + ":" + dict[key]+ ":" + dict[key][])
        //console.log(key + ":" + dict[key]);
        Sheets.Item("稿费代发表").Range("A" + i).Value2 = (i - 2); //序号
        Sheets.Item("稿费代发表").Range("B" + i).Value2 = key; //姓名
        Sheets.Item("稿费代发表").Range("C" + i).Value2 = "=SUM(F" + i + ":K" + i + ")"; //总计
        //Sheets.Item("稿费代发表").Range("C" + i).Value2 = "=SUM(D" + i + ":H" + i + ")"; //
        Sheets.Item("稿费代发表").Range("F" + i).Value2 = parseInt(dict[key]["编辑"]);
        Sheets.Item("稿费代发表").Range("G" + i).Value2 = parseInt(dict[key]["文字"]);
        Sheets.Item("稿费代发表").Range("H" + i).Value2 = parseInt(dict[key]["图片"]);
        Sheets.Item("稿费代发表").Range("I" + i).Value2 = parseInt(dict[key]["视频"]);
        Sheets.Item("稿费代发表").Range("J" + i).Value2 = parseInt(dict[key]["音频"]);
        Sheets.Item("稿费代发表").Range("K" + i).Value2 = parseInt(dict[key]["抖音"]);
        Sheets.Item("稿费代发表").Range("L" + i).Value2 = parseInt(dict[key]["编辑num"]);
        Sheets.Item("稿费代发表").Range("M" + i).Value2 = parseInt(dict[key]["文字num"]);
        Sheets.Item("稿费代发表").Range("N" + i).Value2 = parseInt(dict[key]["图片num"]);
        Sheets.Item("稿费代发表").Range("O" + i).Value2 = parseInt(dict[key]["视频num"]);
        Sheets.Item("稿费代发表").Range("P" + i).Value2 = parseInt(dict[key]["音频num"]);
        Sheets.Item("稿费代发表").Range("Q" + i).Value2 = parseInt(dict[key]["抖音num"]);

        i++; //行数
    }

	
    var endNum = Object.keys(dict).length + 3; //获取姓名字典的姓名个数(长度)
    Sheets.Item("稿费代发表").Range("A" + endNum).Value2 = "总计";
    Sheets.Item("稿费代发表").Range("B" + endNum).Value2 = "=SUM(C1:C" + (endNum - 1) + ")";
    Sheets.Item("稿费代发表").Range("C" + endNum).Value2 = "=SUM(C1:C" + (endNum - 1) + ")";
    Sheets.Item("稿费代发表").Range("E3:E" + (endNum - 1)).Value2 = "学生";
    Sheets.Item("稿费代发表").Range("F" + endNum).Value2 = "=SUM(F1:F" + (endNum - 1) + ")"; //编辑总额
    Sheets.Item("稿费代发表").Range("G" + endNum).Value2 = "=SUM(G1:G" + (endNum - 1) + ")"; //文字总额
    Sheets.Item("稿费代发表").Range("H" + endNum).Value2 = "=SUM(H1:H" + (endNum - 1) + ")"; //图片总额
    Sheets.Item("稿费代发表").Range("I" + endNum).Value2 = "=SUM(I1:I" + (endNum - 1) + ")"; //视频总额
    Sheets.Item("稿费代发表").Range("J" + endNum).Value2 = "=SUM(J1:J" + (endNum - 1) + ")"; //音频总额
    Sheets.Item("稿费代发表").Range("K" + endNum).Value2 = "=SUM(K1:K" + (endNum - 1) + ")"; //抖音总额

    Sheets.Item("稿费代发表").Range("L" + endNum).Value2 = "=SUM(L1:L" + (endNum - 1) + ")"; //编辑次数
    Sheets.Item("稿费代发表").Range("M" + endNum).Value2 = "=SUM(M1:M" + (endNum - 1) + ")"; //文字次数
    Sheets.Item("稿费代发表").Range("N" + endNum).Value2 = "=SUM(N1:N" + (endNum - 1) + ")"; //图片次数
    Sheets.Item("稿费代发表").Range("O" + endNum).Value2 = "=SUM(O1:O" + (endNum - 1) + ")"; //视频次数
    Sheets.Item("稿费代发表").Range("P" + endNum).Value2 = "=SUM(P1:P" + (endNum - 1) + ")"; //音频次数
    Sheets.Item("稿费代发表").Range("Q" + endNum).Value2 = "=SUM(Q1:Q" + (endNum - 1) + ")"; //抖音次数
    /// 设置《稿费代发表》总计行颜色为红色
    Sheets.Item("稿费代发表").Range("A" + endNum + ":K" + endNum).Select();
    (obj => {
        obj.Color = 192;
    })(Selection.Font)
}
代码说明

1、如图18行jobName是积分表的标题,在表格中处于第2行A2:L2
2、如图24行studentName是组织成员的姓名,
3、如图31行cardNum是每项工作内容的积分

  1. F5执行代码,就会出现新的表格《积分表》和《稿费代发表》,里面会自动统计每个人的工作量。
    效果图

  2. “稿费代发表”生成好后,检查《官微作品表》中的编辑、文字、图片、视频、音频、抖音稿费列的合计和《稿费代发表》中各职责的合计进行对比,如果数值相关不大表示没有问题。并检查姓名列中的内容是否有空格等不符合要求的内容。

《官微作品表》中的稿费总和会计算所有工作金额,包括小数;《稿费代发表》中的稿费总和只对整数进行计算,不包括小数。因此《官微作品表》总额比《稿费代发表》总额多几十元都是正常的。
image

Other

微信公众号文章生成excel作品表(py代码)

所含有的知识点
  1. requests爬虫请求
  2. 时间戳
  3. 表格操作,合并单元格、表格文字加粗、文字居中
  4. python保存为exe
  5. exe获取当前运行程序的路径
    【文章推荐】python获取程序执行文件路径方法
'''
名称:微信公众号文章生成作品表
作用:微信公众号文章生成excel作品表
链接:https://www.cnblogs.com/MrFlySand/p/17659466.html
更新时间:2023年8月26日20:56:48
'''
from asyncio.windows_events import NULL
from doctest import Example
import importlib
from pathlib import Path
from lxml import etree
import re
from urllib import request, response
import requests 
from urllib import request
import re #进行数据清洗要导入此模块
from lxml import etree
import xlsxwriter
from asyncio import sleep
import xlwt
import xlsxwriter 
from datetime import date,datetime
from openpyxl import load_workbook
import time
import os
import sys
import time, datetime
from datetime import datetime

# 获取所有的推文链接
def GetSiteList(start, end,path):
  siteLists = []
  print("\n程序正在运行...")
  for i in range(start, end):
    parser = etree.HTMLParser(encoding='utf-8')
    try:
      tree = etree.parse(path+str(i)+"公众号.html", parser=parser)
    except Exception as result:
      print("错误:你保存的html文件名称错误,正确文件名称为:1.html、2.html、3.html,请重新运行程序。")
      pass 

    html = etree.tostring(tree,encoding="utf-8").decode()
    result = tree.xpath("//*[@class='weui-desktop-mass-appmsg__title']/@href")
    siteLists.extend(result)
  return siteLists

# 获取所有推文中的责任姓名
def GetName(siteList,path):
  headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36 Edg/105.0.1343.33"}
  
  # 创建表格
  workbook = xlsxwriter.Workbook(path+str(datetime.today().date())+'官微每月作品表.xlsx')
  worksheet = workbook.add_worksheet("官微作品表")
  worksheet.merge_range('A1:I1',"记者团官方微信公众号 每月作品表汇总")
  bold = workbook.add_format({'bold': True,"align":"center"})
  worksheet.write('A1', '记者团官方微信公众号 每月作品表汇总', workbook.add_format({'bold': True,"size":15,"align":"center"}))
  worksheet.write('A2', '日期', bold)
  worksheet.write('B2', '选题名称', bold)
  worksheet.write('C2', '编辑', bold)
  worksheet.write('D2', '校对', bold)
  worksheet.write('E2', '文字', bold)
  worksheet.write('F2', '图片', bold)
  worksheet.write('G2', '视频', bold)
  worksheet.write('H2', '音频', bold)
  worksheet.write('I2', '学生主编', bold)
  worksheet.write('J2', '推文链接', bold)
  time.sleep(0.5)

  parser = etree.HTMLParser(encoding='utf-8')
  line = 2
  alignCenter = workbook.add_format({"align":"center"})
  for i in range(len(siteList)-1,0,-1):
    line = line + 1
    # dict = {"time":NULL, "activity":NULL, "edit":NULL, "text":NULL, "proofreading":NULL, "picture":0, "video":NULL}    
    reponse = request.urlopen(siteList[i]).read().decode()

    try:
      pat1 = r"var ct = \"(\d+)\""        
      date1 = re.search(pat1, reponse).group(1)
      date1 = int(date1)
      #转换为其他日期格式,如:"%Y-%m-%d %H:%M:%S"
      timeArray = time.localtime(date1)
      otherStyleTime = time.strftime("%m月%d日", timeArray)
      worksheet.write('A'+str(line), otherStyleTime,alignCenter)
      print(otherStyleTime,end=" ")
    except Exception as result:
      try:
        pat2 = r"window.ct = \'(\d+)\'"
        date2 = re.search(pat2, reponse).group(1)
        date2 = int(date2)
        timeArray2 = time.localtime(date2)
        otherStyleTime2 = time.strftime("%m月%d日", timeArray2)
        worksheet.write('A'+str(line), otherStyleTime2,alignCenter)
        print(otherStyleTime2,end=" ")
      except Exception as result:
        pass

    try:
      html = etree.HTML(reponse)        
      activity_name = html.xpath("//h1")[0].text.strip() #标题
      worksheet.write('B'+str(line), activity_name,alignCenter)
      print(activity_name)
    except Exception as result:
      pass

    try:
      bianJi = r"编辑:([\u4e00-\u9fa5].*?)<"
      bianJi = re.search(bianJi, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('C'+str(line),bianJi,alignCenter)
        #print(bianJi)
    except Exception as result:
      pass

    try:
      jiaoDui = r"校对:([\u4e00-\u9fa5].*?)<"
      jiaoDui = re.search(jiaoDui, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('D'+str(line),jiaoDui,alignCenter)
    #print(jiaoDui)
    except Exception as result:
      pass

    try:
      text = r"文字:([\u4e00-\u9fa5].*?)<"
      text = re.search(text, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('E'+str(line),text,alignCenter)
      #print(text)
    except Exception as result:
      pass

    try:
      picture = r"图片:([\u4e00-\u9fa5].*?)<"
      picture = re.search(picture, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('F'+str(line),picture,alignCenter)
      #print(picture)
    except Exception as result:
      pass

    try:
      video = r"视频:([\u4e00-\u9fa5].*?)<"
      video = re.search(video, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('G'+str(line),video,alignCenter)
      #print(video)
    except Exception as result:
      pass

    try:
      audio = r"音频:([\u4e00-\u9fa5].*?)<"
      audio = re.search(audio, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('H'+str(line),audio,alignCenter)
      #print(audio)
    except Exception as result:
      pass

    try:
      zhuBian = r"学生主编:([\u4e00-\u9fa5].*?)<"
      zhuBian = re.search(zhuBian, reponse).group(1).replace("&nbsp;"," ")
      worksheet.write('I'+str(line),zhuBian,alignCenter)
      #print(zhuBian)
    except Exception as result:
      pass

    try:
      worksheet.write('J'+str(line), siteList[i])
    except Exception as result:
      #print("pass")
      pass
  # 关闭工作薄
  worksheet2 = workbook.add_worksheet("抖音作品表")
  worksheet2.merge_range('A1:I1',"记者团官方抖音作品表")
  bold = workbook.add_format({'bold': True,"align":"center"})
  worksheet.write('A1', '记者团官方微信公众号 每月作品表汇总', workbook.add_format({'bold': True,"size":15,"align":"center"}))
  worksheet2.write('A2', '日期', bold)
  worksheet2.write('B2', '选题名称', bold)
  worksheet2.write('C2', '拍摄/剪辑', bold)
  workbook.close()


if __name__ == '__main__':
  # 获取文件的路径
  if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
  elif __file__:
    application_path = os.path.dirname(__file__)

  path = application_path.replace("\\","/")+"/"
  print("程序来源于微信公众号【小知识酷】,后台回复“交流群”获取程序使用文档")
  print("更新时间:2023年8月26日20:57:07\nVersion:Beta1.3\n")
  print("注意正确的网页文件名称为:1公众号.html、2公众号.html、3公众号.html\n")

  minNum = input("请输入html文件起始文件标号(如整数1):")    
  maxNum = input("请输入html文件结束文件标号(如整数10):")

  # 获取当前文件夹下的所有html文件中文章的url
  getSiteList = GetSiteList(int(minNum),int(maxNum)+1, path)
  # print(len(getSiteList))
  GetName(getSiteList,path)
  print("\nExcel文件位置:"+path+"官微每月作品表.xlsx")
  input("\n程序运行完毕")

代码升级

  1. 获取文章末尾“出品”至“责编”区间的内容,删除无用的信息,留取职责+姓名
  2. 前期的《作品表》有字数和张数,将积分统计和稿费统计的代码合并到一起
  3. 【相关文章】一键批量下载微信公众号文章内容/图片/封面/视频/音频,支持导出html和pdf格式,包含阅读数/点赞数/在看数 https://mp.weixin.qq.com/s/ogxF4j5PncxIQ91PtIwU-A
作者:@MrFlySand·飞沙
文章标签(ID):官微、作品表、积分表、稿费、WPS JS、记者团
原文链接:https://www.cnblogs.com/MrFlySand/p/17659466.html
发表时间:2023年8月27日16:20:06
更新时间:2024年3月6日12:34:51
posted @ 2023-08-28 10:48  MrFlySand-飞沙  阅读(90)  评论(0编辑  收藏  举报