微信公众号开发之如何一键导出微信所有用户信息到Excel
微信开发交流群:148540125
系列文章参考地址 极速开发微信公众号欢迎留言、转发、打赏
项目源码参考地址 点我点我--欢迎Start
极速开发微信公众号系列文章之如何一键导出微信所有用户信息到Excel
前方高能警告⚠️:用户信息导出我们需要使用以下权限以及接口
以上链接点击可以查看相关文档
本文中用户导入到excel使用的是jxl,当然大家可以使用poi。如果不会使用jxl可以参考我之前写的 Java实现Excel导入数据库,数据库中的数据导入到Excel
好了,准备工作做好了那就开干吧!!!!
实现的目标:访问一个地址可以下载一个保存最新所有用户详细信息的Excel,最终效果图如下

将详细的用户信息(List)保存到Excel
/**
* 将详细的用户信息保存到Excel
* @param userInfos
* @return
*/
private File saveToExcel(List<UserInfo> userInfos){
File file=null;
try {
WritableWorkbook wwb = null;
// 创建可写入的Excel工作簿
String fileName = "用户详细信息.xls";
file=new File(fileName);
//以fileName为文件名来创建一个Workbook
wwb = Workbook.createWorkbook(file);
// 创建工作表
WritableSheet ws = wwb.createSheet("用户详细信息", 0);
ws.setColumnView(0,8);
ws.setColumnView(1,15);
ws.setColumnView(2,50);
ws.setColumnView(3,8);
ws.setColumnView(4,10);
ws.setColumnView(5,10);
ws.setColumnView(6,10);
ws.setColumnView(7,20);
ws.setColumnView(8,50);
ws.setColumnView(9,10);
ws.setColumnView(10,30);
ws.setColumnView(11,20);
ws.setColumnView(12,20);
ws.mergeCells(0,0,12,0);//合并第一列第一行到第七列第一行的所有单元格
WritableFont font1= new WritableFont(WritableFont.TIMES,16,WritableFont.BOLD);
WritableCellFormat format1=new WritableCellFormat(font1);
format1.setAlignment(jxl.format.Alignment.CENTRE);
Label top= new Label(0, 0, "所有用户详细信息",format1);
ws.addCell(top);
//要插入到的Excel表格的行号,默认从0开始
Label labelId= new Label(0, 1, "编号");
Label labelnickname= new Label(1, 1, "用户的昵称");
Label labelopenid= new Label(2, 1, "用户的标识");
Label labelsex= new Label(3, 1, "性别");
Label labelcountry= new Label(4,1, "所在国家");
Label labelprovince= new Label(5,1, "所在省份");
Label labelcity= new Label(6, 1, "所在城市");
Label labellanguage= new Label(7,1, "用户的语言");
Label labelheadimgurl= new Label(8,1, "用户头像");
Label labelsubscribe= new Label(9, 1, "是否订阅");
Label labelsubscribetime= new Label(10, 1, "关注时间");
Label labelgroupid= new Label(11, 1, "所在的分组ID");
Label labelremark= new Label(12, 1, "备注");
ws.addCell(labelId);
ws.addCell(labelnickname);
ws.addCell(labelopenid);
ws.addCell(labelsex);
ws.addCell(labelcountry);
ws.addCell(labelprovince);
ws.addCell(labelcity);
ws.addCell(labellanguage);
ws.addCell(labelheadimgurl);
ws.addCell(labelsubscribe);
ws.addCell(labelsubscribetime);
ws.addCell(labelgroupid);
ws.addCell(labelremark);
for (int i = 0; i < userInfos.size(); i++) {
Label labelId_i= new Label(0, i+2, i+1+"");
Label nickName= new Label(1, i+2, userInfos.get(i).getNickname());
Label openid= new Label(2, i+2, userInfos.get(i).getOpenid());
String sexStr=userInfos.get(i).getSex();
//用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
if (StrKit.notBlank(sexStr)) {
int sexInt=Integer.parseInt(sexStr);
if (sexInt==1) {
sexStr="男";
}else if (sexInt==2) {
sexStr="女";
}
}else {
sexStr="未知";
}
Label sex= new Label(3, i+2, sexStr);
Label country= new Label(4, i+2, userInfos.get(i).getCountry());
Label province= new Label(5, i+2, userInfos.get(i).getProvince());
Label city= new Label(6, i+2, userInfos.get(i).getCity());
Label language= new Label(7, i+2, userInfos.get(i).getLanguage());
Label headimgaeurl= new Label(8, i+2, userInfos.get(i).getHeadimgurl());
Label subscribe= new Label(9, i+2, userInfos.get(i).getSubscribe().equals("1")?"已关注":"未关注");
//获取关注时间
String subscribe_time = userInfos.get(i).getSubscribe_time();
if (StrKit.notBlank(subscribe_time)) {
subscribe_time=sfg.format(new Date(Long.parseLong(subscribe_time) * 1000L));
}
Label subscribetime= new Label(10, i+2, subscribe_time);
Label groupid= new Label(11, i+2, userInfos.get(i).getGroupid());
Label remark= new Label(12, i+2, userInfos.get(i).getRemark());
ws.addCell(labelId_i);
ws.addCell(openid);
ws.addCell(nickName);
ws.addCell(sex);
ws.addCell(country);
ws.addCell(province);
ws.addCell(city);
ws.addCell(language);
ws.addCell(headimgaeurl);
ws.addCell(subscribe);
ws.addCell(subscribetime);
ws.addCell(groupid);
ws.addCell(remark);
}
//写进文档
wwb.write();
// 关闭Excel工作簿对象
wwb.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return file;
}
获取所有用户列表
/**
* 获取所有的openid
* @return
*/
public List<String> getAllOpenId(){
List<String> openIds = getOpenIds(null);
return openIds;
}
在getOpenIds(Stirng next_openid) 方法中迭代(一次拉取调用最多拉取10000个关注者的OpenID)获取所有的openId并返回一个List集合
private List<String> getOpenIds(String next_openid){
List<String> openIdList=new ArrayList<String>();
ApiResult apiResult=UserApi.getFollowers(next_openid);
String json=apiResult.getJson();
log.error("json:"+json);
if (apiResult.isSucceed()) {
JSONObject result = JSON.parseObject(json);
next_openid = apiResult.getStr("next_openid");
int count = apiResult.getInt("count");
JSONObject openIdObject = result.getJSONObject("data");
if (count>0) {
JSONArray openids=openIdObject.getJSONArray("openid");
for (int i = 0; i < openids.size(); i++) {
openIdList.add(openids.getString(i));
}
}
//下一页
if (next_openid!=null&& !next_openid.equals("")) {
List<String> list = getOpenIds(next_openid);
openIdList.addAll(list);
}
}
return openIdList;
}
批量获取用户基本信息
注意批量接口最多支持一次拉取100条
/**
* 根据openId列表获取用户信息
* @param allOpenId
* @return
*/
private List<UserInfo> getAllUserInfo(List<String> allOpenId){
List<UserInfo> userInfos = new ArrayList<UserInfo>();
int total=allOpenId.size();
UserConfig[] user_list=null;
//开发者可通过该接口来批量获取用户基本信息。最多支持一次拉取100条。
int temp=100;//一次获取100
if (total>temp) {
int page=0;//当前页面
int count=total/100+(total%100>0?1:0);//总共获取多少次
int index=0;
while (page<count) {
index=(temp*(page+1))>total?total:(temp*(page+1));
System.out.println("/////////"+page*temp+" "+index);
user_list=new UserConfig[index-(page*temp)];
for (int i = page*temp; i <index; i++) {
UserConfig config=new UserConfig();
config.setLang(LangType.zh_CN);
config.setOpenid(allOpenId.get(i));
user_list[i-(page*temp)]=config;
}
GetUserInfo getUserInfo = new GetUserInfo();
getUserInfo.setUser_list(user_list);
String jsonGetUserInfo = JsonKit.toJson(getUserInfo);
System.out.println("jsonGetUserInfo:"+jsonGetUserInfo);
ApiResult apiResult = UserApi.batchGetUserInfo(jsonGetUserInfo);
String jsonResult = apiResult.getJson();
//将json转化为对象
List<UserInfo> userInfo = parseJsonToUserInfo(jsonResult);
userInfos.addAll(userInfo);
page++;
}
}else {
user_list=new UserConfig[total];
for (int i = 0; i < user_list.length; i++) {
System.out.println(allOpenId.get(i));
UserConfig config=new UserConfig();
config.setLang(LangType.zh_CN);
config.setOpenid(allOpenId.get(i));
user_list[i]=config;
}
GetUserInfo getUserInfo = new GetUserInfo();
getUserInfo.setUser_list(user_list);
String jsonGetUserInfo = JsonKit.toJson(getUserInfo);
ApiResult batchGetUserInfo = UserApi.batchGetUserInfo(jsonGetUserInfo);
List<UserInfo> userInfo = parseJsonToUserInfo(batchGetUserInfo.getJson());
userInfos.addAll(userInfo);
}
return userInfos;
}
大功告成---测试
在开源项目weixin_guide 中添加路由 com.javen.common.APPConfig 类的 configRoute(Routes me) 的方法中添加 me.add("/wxuser", UserController.class,"/front");
在浏览器中输入http://localhost:8080/wxuser 即可下载Excel
public void index(){
List<UserInfo> allUserInfo = getAllUserInfo(getAllOpenId());
if (!allUserInfo.isEmpty()) {
///下载userInfos
File file = saveToExcel(allUserInfo);
renderFile(file);
}else {
render("目前暂无用户...");
}
}
以上如何一键导出微信所有用户信息到Excel的全过程。
欢迎留言、转发、打赏项目源码参考地址 点我点我--欢迎Start
微信公众号开发之如何一键导出微信所有用户信息到Excel的更多相关文章
- 微信公众号开发之网页中及时获取当前用户Openid及注意事项
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...
- 微信公众号开发C#系列-12、微信前端开发利器:WeUI
1.前言 通过前面系列文章的学习与讲解,相信大家已经对微信的开发有了一个全新的认识.后端基本能够基于盛派的第三方sdk搞定大部分事宜,剩下的就是前端了.关于手机端的浏览器的兼容性问题相信一直是开发者们 ...
- 微信公众号开发C#系列-1、微信公众平台注册
微信公众号简介 微信公众号分为服务号.订阅号.企业号,订阅号可以个人申请,服务号和企业号要有企业资质才可以. 我们所说的微信公众号开发主要指的是公众号的账号类型,公众号的账号类型分为订阅号.服务号.企 ...
- 微信公众号开发C#系列-2、微信公众平台接入指南
概述 微信公众平台消息接口的工作原理大概可以这样理解:从用户端到公众号端一个流程是这样的,用户发送消息到微信服务器,微信服务器将接收到的消息post到用户接入时填写的url中,在url处理程序中,首先 ...
- C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一)
咨询 请加 QQ::QQ群: 在微信里面,非认证的公众号账号,只能通过在微信回复菜单单击等事件获取openid,但是认证的公众账号(之前认证的订阅号是不可以的,现在新开放了政府媒体机构的认证订阅号)可 ...
- nodejs vue 微信公众号开发(二)申请微信测试号
1.打开微信测试公众号开发平台http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 扫码登陆
- 微信公众号开发--用.Net Core实现微信消息加解密
1.进入微信公众号后台设置微信服务器配置参数(注意:Token和EncodingAESKey必须和微信服务器验证参数保持一致,不然验证不会通过). 2.设置为安全模式 3.代码实现(主要分为验证接口和 ...
- 【微信公众号开发】【13】批量导出公众号所有用户信息到Excel
前言: 1,一次拉取调用最多拉取10000个关注者的OpenID,当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求 2,获取OpenID列表后 ...
- 微信公众号开发系列-13、基于RDIFramework.NET框架整合微信开发应用效果展示
1.前言 通过前面一系列文章的学习,我们对微信公众号开发已经有了一个比较深入和全面的了解. 微信公众号开发为企业解决那些问题呢? 我们经常看到微信公众号定制开发.微信公众平台定制开发,都不知道这些能给 ...
随机推荐
- linux基础命令---rm
rm 删除文件和目录,默认情况下不会删除目录. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.SUSE.openSUSE.Fedora. 1.语法 rm [选项] ...
- 设置(更改)Mysql 自增ID的起始值
SELECT * FROM segwords WHERE id>790511 DELETE FROM segwords WHERE id>790511 #下面这句是设置的 ALTER TA ...
- JUC原子类 1
根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ; 2. 数组类型: AtomicI ...
- xml之一
xml基础知识 标记语言<> XML与HTML区别 1.HTML主要用来显示 XML是用来进行数据传输 2.HTML是一种预定义的(<a>表示超链接),xml不是预定义的(& ...
- Tomcat上发布webservices的war工程,访问异常404
Tomcat上发布webservices的war工程,访问异常404 Tomcat部署正常.war导出工程正常.Tomcat自带的工程可以正常访问: 问题: webservices工程访问异常404 ...
- 20145313张雪纯MSF基础应用实验
实验博客 ms08_067攻击实验 http://www.cnblogs.com/entropy/p/6690301.html ms11_050漏洞攻击 http://www.cnblogs.com/ ...
- Oracleグラントについて
権限 権限とはデータベースにログインしたユーザに許可する操作の事です. 例えば.更新や削除は行って欲しくないというユーザには.検索の権限のみ与えるというような使い方をします. Oracleの権限には「 ...
- IntelliJ IDEA 连接数据库 详细过程
IntelliJ IDEA集成了众多插件,方便开发者使用,使用其自带的Database模块就可以很方便的配置.连接到数据库,本次操作以MySQL为例,其中testjdbc数据库已经提前建好,里面有两张 ...
- MSM8937系统启动流程【转】
本文转载自:https://blog.csdn.net/chenzhen1080/article/details/54945992?utm_source=blogxgwz8 1 Boot Addres ...
- 封装TeeChart控件
public class MyChart { //字段 private TChart tChart; /// <summary> /// 构造函数,默认不是3D效果 /// </su ...