將圖片導出到excel表格中

需求描述

前幾天需要將公衆號中的用戶發送的圖片導出到excel表格中,特此記錄。
用戶給公衆號發送圖片後,微信會推給開發者相關數據,比如openid,類型,圖片地址等。
我需要做的是:獲取圖片地址,訪問微信,獲取圖片, 寫入文件。

工具類

/**
String[] rowsName :excel中的行標題
String fileName = "XXX" + ".xls";
pageList 保存數據的list集合
*/
public static HSSFWorkbook QdActivePictureExport(String[] rowsname, List<ActiveUserBean> pageList, String fileName) {
        logger.info("START:---導出開始");
        // 創建excel文件
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 創建當前工作表
        HSSFSheet sheet = workbook.createSheet("XXXX報表");
        //畫圖的頂級管理器,一個sheet只能獲取一個
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
        /**
         *
         * 1.讀取原文件中的內容 2.創建標題行 3.循環創建每一行,然後將數據輸入
         */
        String columContent[] = null;
        int rows = 0;// 用於記錄創建的行數
        // 設置標題
        // 創建第一行
        HSSFRow row = sheet.createRow(rows);
        HSSFCell cell = null;
        for (int i = 0; i < rowsname.length; i++) {
            cell = row.createCell(i);
            cell.setCellType(HSSFCell.CELL_TYPE_STRING);
            cell.setCellValue(rowsname[i]);
        }
        int pageSize = pageList.size();
        if (pageList != null && pageSize > 0) {
            // 循環數據列表
            for (ActiveUserBean dff : pageList) {
                // 第一行已經創建
                rows++;
                // 開始創建行
                row = sheet.createRow(rows);
                // 單元格賦值
                //todo 需要加參數
                cell = row.createCell(0);
                cell.setCellValue(dff.getFrom_user_name());
                cell = row.createCell(1);
                cell.setCellValue(dff.getCity_code());
                cell = row.createCell(2);
                cell.setCellValue(dff.getCreate_time());
                cell = row.createCell(3);
                cell.setCellValue(dff.getMsg_type());
                cell = row.createCell(4);
                //cell.setCellValue(dff.getContent1());
                intoPic(dff.getContent1(), fileName, workbook, sheet, patriarch, row, rows, pageSize);
               
            }
        }
        return workbook;
    }

  • intoPic()方法 ,用io流導出

public static void intoPic(String pictureUrl, String filename, HSSFWorkbook workbook, HSSFSheet sheet,
                               HSSFPatriarch patriarch, HSSFRow row, int rows, int pageSize) {
        FileOutputStream fileOut = null;
        logger.info("圖片導入開始:" + pictureUrl + "__filename:" + filename + "__rows:" + rows);
        try {
       
            //todo 列 動態變化
            sheet.setColumnWidth(4, 256 * 50 + 184);
            row.setHeight((short) 1000);

            //使用了代理
            String replaceUrl = pictureUrl.replace("http://", "http://www.XXXX.com/XXXX/");
            URL url = new URL(replaceUrl);

            //打開鏈接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //設置請求方式爲"GET"
            conn.setRequestMethod("GET");
            //超時響應時間爲5秒
            conn.setConnectTimeout(5 * 1000);
            //通過輸入流獲取圖片數據
            InputStream inStream = conn.getInputStream();
           
            //得到圖片的二進制數據,以二進制封裝得到數據,具有通用性
            byte[] data = readInputStream(inStream);

            //anchor主要用於設置圖片的屬性  todo row1 row2 動態變化 行 列
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 4, rows, (short) 4, rows);
            //(圖片在單元格的位置)
            //0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
            anchor.setAnchorType(3);
            patriarch.createPicture(anchor, workbook.addPicture(data, HSSFWorkbook.PICTURE_TYPE_JPEG));
          
            fileOut = new FileOutputStream(filename);
          
            // 寫入excel文件
            workbook.write(fileOut);
            logger.info("圖片文件已經生成");

        } catch (Exception e) {
            e.printStackTrace();
            logger.info("錯誤:"+e);
        } finally {
                if (fileOut != null) {
                    try {
                        fileOut.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                        logger.info("finally出錯!");
                    }
            }
        }

    }

	//todo 必須有
    private static byte[] readInputStream(InputStream inStream) throws IOException {
        ByteArrayOutputStream outStream = new ByteArrayOutputStream();
        //創建一個Buffer字符串
        byte[] buffer = new byte[1024 * 8];
        //每次讀取的字符串長度,如果爲-1,代表全部讀取完畢
        int len = 0;
        //使用一個輸入流從buffer裏把數據讀取出來
        while ((len = inStream.read(buffer)) != -1) {
            //用輸出流往buffer裏寫入數據,中間參數代表從哪個位置開始讀,len代表讀取的長度
            outStream.write(buffer, 0, len);
        }
        //關閉輸入流
        inStream.close();
        //把outStream裏的數據寫入內存
        return outStream.toByteArray();
    }
  • 導出到本地
//上面 工具類返回了 HSSFWorkbook workbook
 QdActiveOutExcelUtil.write(response,fileName,workbook);
 
 /**
     * 輸出到客戶端
     *
     * @param response
     * @param fileName
     * @param workbook
     * @throws IOException
     */
    public static void write(HttpServletResponse response, String fileName, HSSFWorkbook workbook) throws IOException {
        response.reset();
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode(fileName));
        workbook.write(response.getOutputStream());
    }

本地測試類

	@Test
    public void test3() throws IOException {
        FileOutputStream fileOut = null;
        try {
            //String befor = "E:\\zsl\\picture\\28314.jpg";

            //創建一個表格
            HSSFWorkbook wb = new HSSFWorkbook();
            HSSFSheet sheet = wb.createSheet("導出圖片報表");
            HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
            //todo 需要改變
            HSSFRow row = sheet.createRow(3);

            //sheet.setColumnWidth( 100,  100);
            //todo  可變
            sheet.setColumnWidth(5, 256 * 50 + 184);
            row.setHeight((short) 1000);

            //todo 圖片地址
            String pictureUrl = weixin圖片地址";

            URL url = new URL(pictureUrl);
            //打開鏈接
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            //設置請求方式爲"GET"
            conn.setRequestMethod("GET");
            //超時響應時間爲5秒
            conn.setConnectTimeout(5 * 1000);
            //通過輸入流獲取圖片數據
            InputStream inStream = conn.getInputStream();

            //本地測試
            //BufferedInputStream inStream = new BufferedInputStream(new FileInputStream(befor));
            //得到圖片的二進制數據,以二進制封裝得到數據,具有通用性
            byte[] data = readInputStream(inStream);

            //anchor主要用於設置圖片的屬性 todo 參數需要改變  row1,row2 決定圖片在哪一行哪一列
            HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 5, 3, (short) 5, 3);
            //(圖片在單元格的位置)
            //0 = Move and size with Cells, 2 = Move but don't size with cells, 3 = Don't move or size with cells.
            anchor.setAnchorType(0);
            patriarch.createPicture(anchor, wb.addPicture(data, HSSFWorkbook.PICTURE_TYPE_JPEG));
            //String name = "試Excel.xls";
            fileOut = new FileOutputStream("E:/試4Excel.xls");
            //fileOut = new FileOutputStream(name);
            // 寫入excel文件
            wb.write(fileOut);
            System.out.println("----Excle3文件已生成------");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fileOut != null) {
                try {
                    fileOut.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

導出圖片的時候設置了單元格的大小,需要注意圖片在哪個單元格內。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章