微信开发交流群:148540125

系列文章参考地址 极速开发微信公众号欢迎留言、转发、打赏

项目源码参考地址 点我点我--欢迎Start

极速开发微信公众号系列文章之如何一键导出微信所有用户信息到Excel

前方高能警告⚠️:用户信息导出我们需要使用以下权限以及接口

以上链接点击可以查看相关文档

本文中用户导入到excel使用的是jxl,当然大家可以使用poi。如果不会使用jxl可以参考我之前写的 Java实现Excel导入数据库,数据库中的数据导入到Excel

好了,准备工作做好了那就开干吧!!!!

实现的目标:访问一个地址可以下载一个保存最新所有用户详细信息的Excel,最终效果图如下

将详细的用户信息(List)保存到Excel

  1. /**
  2. * 将详细的用户信息保存到Excel
  3. * @param userInfos
  4. * @return
  5. */
  6. private File saveToExcel(List<UserInfo> userInfos){
  7. File file=null;
  8. try {
  9. WritableWorkbook wwb = null;
  10. // 创建可写入的Excel工作簿
  11. String fileName = "用户详细信息.xls";
  12. file=new File(fileName);
  13. //以fileName为文件名来创建一个Workbook
  14. wwb = Workbook.createWorkbook(file);
  15. // 创建工作表
  16. WritableSheet ws = wwb.createSheet("用户详细信息", 0);
  17. ws.setColumnView(0,8);
  18. ws.setColumnView(1,15);
  19. ws.setColumnView(2,50);
  20. ws.setColumnView(3,8);
  21. ws.setColumnView(4,10);
  22. ws.setColumnView(5,10);
  23. ws.setColumnView(6,10);
  24. ws.setColumnView(7,20);
  25. ws.setColumnView(8,50);
  26. ws.setColumnView(9,10);
  27. ws.setColumnView(10,30);
  28. ws.setColumnView(11,20);
  29. ws.setColumnView(12,20);
  30. ws.mergeCells(0,0,12,0);//合并第一列第一行到第七列第一行的所有单元格
  31. WritableFont font1= new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD);
  32. WritableCellFormat format1=new WritableCellFormat(font1);
  33. format1.setAlignment(jxl.format.Alignment.CENTRE);
  34. Label top= new Label(0, 0, "所有用户详细信息",format1);
  35. ws.addCell(top);
  36. //要插入到的Excel表格的行号,默认从0开始
  37. Label labelId= new Label(0, 1, "编号");
  38. Label labelnickname= new Label(1, 1, "用户的昵称");
  39. Label labelopenid= new Label(2, 1, "用户的标识");
  40. Label labelsex= new Label(3, 1, "性别");
  41. Label labelcountry= new Label(4,1, "所在国家");
  42. Label labelprovince= new Label(5,1, "所在省份");
  43. Label labelcity= new Label(6, 1, "所在城市");
  44. Label labellanguage= new Label(7,1, "用户的语言");
  45. Label labelheadimgurl= new Label(8,1, "用户头像");
  46. Label labelsubscribe= new Label(9, 1, "是否订阅");
  47. Label labelsubscribetime= new Label(10, 1, "关注时间");
  48. Label labelgroupid= new Label(11, 1, "所在的分组ID");
  49. Label labelremark= new Label(12, 1, "备注");
  50. ws.addCell(labelId);
  51. ws.addCell(labelnickname);
  52. ws.addCell(labelopenid);
  53. ws.addCell(labelsex);
  54. ws.addCell(labelcountry);
  55. ws.addCell(labelprovince);
  56. ws.addCell(labelcity);
  57. ws.addCell(labellanguage);
  58. ws.addCell(labelheadimgurl);
  59. ws.addCell(labelsubscribe);
  60. ws.addCell(labelsubscribetime);
  61. ws.addCell(labelgroupid);
  62. ws.addCell(labelremark);
  63. for (int i = 0; i < userInfos.size(); i++) {
  64. Label labelId_i= new Label(0, i+2, i+1+"");
  65. Label nickName= new Label(1, i+2, userInfos.get(i).getNickname());
  66. Label openid= new Label(2, i+2, userInfos.get(i).getOpenid());
  67. String sexStr=userInfos.get(i).getSex();
  68. //用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
  69. if (StrKit.notBlank(sexStr)) {
  70. int sexInt=Integer.parseInt(sexStr);
  71. if (sexInt==1) {
  72. sexStr="男";
  73. }else if (sexInt==2) {
  74. sexStr="女";
  75. }
  76. }else {
  77. sexStr="未知";
  78. }
  79. Label sex= new Label(3, i+2, sexStr);
  80. Label country= new Label(4, i+2, userInfos.get(i).getCountry());
  81. Label province= new Label(5, i+2, userInfos.get(i).getProvince());
  82. Label city= new Label(6, i+2, userInfos.get(i).getCity());
  83. Label language= new Label(7, i+2, userInfos.get(i).getLanguage());
  84. Label headimgaeurl= new Label(8, i+2, userInfos.get(i).getHeadimgurl());
  85. Label subscribe= new Label(9, i+2, userInfos.get(i).getSubscribe().equals("1")?"已关注":"未关注");
  86. //获取关注时间
  87. String subscribe_time = userInfos.get(i).getSubscribe_time();
  88. if (StrKit.notBlank(subscribe_time)) {
  89. subscribe_time=sfg.format(new Date(Long.parseLong(subscribe_time) * 1000L));
  90. }
  91. Label subscribetime= new Label(10, i+2, subscribe_time);
  92. Label groupid= new Label(11, i+2, userInfos.get(i).getGroupid());
  93. Label remark= new Label(12, i+2, userInfos.get(i).getRemark());
  94. ws.addCell(labelId_i);
  95. ws.addCell(openid);
  96. ws.addCell(nickName);
  97. ws.addCell(sex);
  98. ws.addCell(country);
  99. ws.addCell(province);
  100. ws.addCell(city);
  101. ws.addCell(language);
  102. ws.addCell(headimgaeurl);
  103. ws.addCell(subscribe);
  104. ws.addCell(subscribetime);
  105. ws.addCell(groupid);
  106. ws.addCell(remark);
  107. }
  108. //写进文档
  109. wwb.write();
  110. // 关闭Excel工作簿对象
  111. wwb.close();
  112. } catch (Exception e) {
  113. // TODO Auto-generated catch block
  114. e.printStackTrace();
  115. }
  116. return file;
  117. }

获取所有用户列表

  1. /**
  2. * 获取所有的openid
  3. * @return
  4. */
  5. public List<String> getAllOpenId(){
  6. List<String> openIds = getOpenIds(null);
  7. return openIds;
  8. }

getOpenIds(Stirng next_openid) 方法中迭代(一次拉取调用最多拉取10000个关注者的OpenID)获取所有的openId并返回一个List集合

  1. private List<String> getOpenIds(String next_openid){
  2. List<String> openIdList=new ArrayList<String>();
  3. ApiResult apiResult=UserApi.getFollowers(next_openid);
  4. String json=apiResult.getJson();
  5. log.error("json:"+json);
  6. if (apiResult.isSucceed()) {
  7. JSONObject result = JSON.parseObject(json);
  8. next_openid = apiResult.getStr("next_openid");
  9. int count = apiResult.getInt("count");
  10. JSONObject openIdObject = result.getJSONObject("data");
  11. if (count>0) {
  12. JSONArray openids=openIdObject.getJSONArray("openid");
  13. for (int i = 0; i < openids.size(); i++) {
  14. openIdList.add(openids.getString(i));
  15. }
  16. }
  17. //下一页
  18. if (next_openid!=null&& !next_openid.equals("")) {
  19. List<String> list = getOpenIds(next_openid);
  20. openIdList.addAll(list);
  21. }
  22. }
  23. return openIdList;
  24. }

批量获取用户基本信息

注意批量接口最多支持一次拉取100条

  1. /**
  2. * 根据openId列表获取用户信息
  3. * @param allOpenId
  4. * @return
  5. */
  6. private List<UserInfo> getAllUserInfo(List<String> allOpenId){
  7. List<UserInfo> userInfos = new ArrayList<UserInfo>();
  8. int total=allOpenId.size();
  9. UserConfig[] user_list=null;
  10. //开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
  11. int temp=100;//一次获取100
  12. if (total>temp) {
  13. int page=0;//当前页面
  14. int count=total/100+(total%100>0?1:0);//总共获取多少次
  15. int index=0;
  16. while (page<count) {
  17. index=(temp*(page+1))>total?total:(temp*(page+1));
  18. System.out.println("/////////"+page*temp+" "+index);
  19. user_list=new UserConfig[index-(page*temp)];
  20. for (int i = page*temp; i <index; i++) {
  21. UserConfig config=new UserConfig();
  22. config.setLang(LangType.zh_CN);
  23. config.setOpenid(allOpenId.get(i));
  24. user_list[i-(page*temp)]=config;
  25. }
  26. GetUserInfo getUserInfo = new GetUserInfo();
  27. getUserInfo.setUser_list(user_list);
  28. String jsonGetUserInfo = JsonKit.toJson(getUserInfo);
  29. System.out.println("jsonGetUserInfo:"+jsonGetUserInfo);
  30. ApiResult apiResult = UserApi.batchGetUserInfo(jsonGetUserInfo);
  31. String jsonResult = apiResult.getJson();
  32. //将json转化为对象
  33. List<UserInfo> userInfo = parseJsonToUserInfo(jsonResult);
  34. userInfos.addAll(userInfo);
  35. page++;
  36. }
  37. }else {
  38. user_list=new UserConfig[total];
  39. for (int i = 0; i < user_list.length; i++) {
  40. System.out.println(allOpenId.get(i));
  41. UserConfig config=new UserConfig();
  42. config.setLang(LangType.zh_CN);
  43. config.setOpenid(allOpenId.get(i));
  44. user_list[i]=config;
  45. }
  46. GetUserInfo getUserInfo = new GetUserInfo();
  47. getUserInfo.setUser_list(user_list);
  48. String jsonGetUserInfo = JsonKit.toJson(getUserInfo);
  49. ApiResult batchGetUserInfo = UserApi.batchGetUserInfo(jsonGetUserInfo);
  50. List<UserInfo> userInfo = parseJsonToUserInfo(batchGetUserInfo.getJson());
  51. userInfos.addAll(userInfo);
  52. }
  53. return userInfos;
  54. }

大功告成---测试

开源项目weixin_guide 中添加路由 com.javen.common.APPConfig 类的 configRoute(Routes me) 的方法中添加 me.add("/wxuser", UserController.class,"/front");

在浏览器中输入http://localhost:8080/wxuser 即可下载Excel

  1. public void index(){
  2. List<UserInfo> allUserInfo = getAllUserInfo(getAllOpenId());
  3. if (!allUserInfo.isEmpty()) {
  4. ///下载userInfos
  5. File file = saveToExcel(allUserInfo);
  6. renderFile(file);
  7. }else {
  8. render("目前暂无用户...");
  9. }
  10. }

以上如何一键导出微信所有用户信息到Excel的全过程。

欢迎留言、转发、打赏项目源码参考地址 点我点我--欢迎Start

微信公众号开发之如何一键导出微信所有用户信息到Excel的更多相关文章

  1. 微信公众号开发之网页中及时获取当前用户Openid及注意事项

    目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...

  2. 微信公众号开发C#系列-12、微信前端开发利器:WeUI

    1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...

  3. 微信公众号开发C#系列-1、微信公众平台注册

    微信公众号简介 微信公众号分为服务号.订阅号.企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以. 我们所说的微信公众号开发主要指的是公众号的账号类型,公众号的账号类型分为订阅号.服务号.企 ...

  4. 微信公众号开发C#系列-2、微信公众平台接入指南

    概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...

  5. C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)

    咨询 请加 QQ::QQ群: 在微信里面,非认证的公众号账号,只能通过在微信回复菜单单击等事件获取openid,但是认证的公众账号(之前认证的订阅号是不可以的,现在新开放了政府媒体机构的认证订阅号)可 ...

  6. nodejs vue 微信公众号开发(二)申请微信测试号

    1.打开微信测试公众号开发平台http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 扫码登陆

  7. 微信公众号开发--用.Net Core实现微信消息加解密

    1.进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2.设置为安全模式 3.代码实现(主要分为验证接口和 ...

  8. 【微信公众号开发】【13】批量导出公众号所有用户信息到Excel

    前言: 1,一次拉取调用最多拉取10000个关注者的OpenID,当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求 2,获取OpenID列表后 ...

  9. 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示

    1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...

随机推荐

  1. C/C++之单例模式实现

    /*** * 保证一个类仅有一个实例,并提供一个访问它的全局访问点 */ #include <iostream> #include <string> using namespa ...

  2. 响应式瀑布流插件Grid-A-Licious

    Grid-A-Licious是一款遵守MIT协议的响应式瀑布流插件.该插件总代码行不超过400行,实现很巧妙,使用时也很流畅.实现原理也很简单,根据屏幕宽度和参数中设置的列宽度以及每项之间的间隔宽度, ...

  3. iOS xcode创建静态库封装自己的SDK及使用

    https://www.cnblogs.com/JustForHappy/p/5773039.html 一,静态库和动态库的区别在这里就不说了,个人感觉如果是自己封装提供别人下载的话应该是静态库比较方 ...

  4. MQ内存消耗与积压分析

    [root@iZ23nn1p4mjZ logs]# rabbitmqctl status Status of node rabbit@iZ23nn1p4mjZ ... [{pid,15425}, {r ...

  5. 03: Memcached

    目录: 1.1 Memcached简介与安装 1.2 python-memcached模块天生支持集群 1.3 Memcached基本操作 1.1 Memcached简介与安装返回顶部 1.Memca ...

  6. 20145302张薇 《网络对抗技术》 web基础

    20145302张薇 <网络对抗> web基础 实验问题回答 1.什么是表单 表单在网页中主要负责数据采集功能:一般网页上需要用户输入.选择的地方都会用到表单 表单标签:即,用于确定表单所 ...

  7. Java位运算实现加减乘除

    一.加法 a+b 举例实现:13+9=22 13+9不考虑进位结果为12 只考虑进位结果为10 和刚好是22. 13二进制为1101,9二进制为1001. 不考虑进位结果为0100.算式为a^b 只考 ...

  8. Python3基础 str title 单词首字母大写,其余均为小写

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  9. 【错误解决】SVN常见错误及解决方式

    1.Error while creating module:org.apache.subversion.javahl.ClientException:Authorization failed svn: ...

  10. BZOJ2662: [BeiJing wc2012]冻结 spfa+分层图

    Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”        在这个愿望被实现以后的世界里,人们享 ...