微信公眾號開發之如何一鍵導出微信所有用戶信息到Excel

微信開發交流群:148540125
系列文章參考地址 極速開發微信公眾號歡迎留言、轉發、打賞
項目源碼參考地址 點我點我--歡迎Start

極速開發微信公眾號系列文章之如何一鍵導出微信所有用戶信息到Excel

前方高能警告??:用戶信息導出我們需要使用以下權限以及接口

以上鏈接點擊可以查看相關文檔

本文中用戶導入到excel使用的是jxl,當然大家可以使用poi。如果不會使用jxl可以參考我之前寫的 Java實現Excel導入數據庫,數據庫中的數據導入到Excel

好了,準備工作做好了那就開干吧!!!!

實現的目標:訪問一個地址可以下載一個保存最新所有用戶詳細信息的Excel,最終效果圖如下

最終效果圖.png

將詳細的用戶信息(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("http://///////"+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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容