需求描述
前幾天需要將公衆號中的用戶發送的圖片導出到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();
}
}
}
}
導出圖片的時候設置了單元格的大小,需要注意圖片在哪個單元格內。