微信开发交流群: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
来源:https://www.cnblogs.com/zyw-205520/p/5958560.html