需求
導出人員的信息並且加上人員的照片至EXCEL中
完整的代碼
//創建一個表格 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); //需要導出的人員信息 List<StaffBO> boList =staffService.findStaffList(searchBO); if(boList != null && boList.size() >0) { //一定要放在循環外,只能聲明一次 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); for(int i=0; i<boList.size(); i++) { HSSFRow dataRow = sheet.createRow(i+1);//數據行 HSSFCell dataCell0 = dataRow.createCell(0);//每行的第一列存放照片 drawPictureInfoExcel(wb,patriarch,i+1,obj.getLaborStore().getPhoto());//i+1代表當前的行 } } // 關於HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的參數,有必要在這里說明一下: // dx1:起始單元格的x偏移量, // dy1:起始單元格的y偏移量, // dx2:終止單元格的x偏移量, // dy2:終止單元格的y偏移量, // col1:起始單元格列序號,從0開始計算; // row1:起始單元格行序號,從0開始計算, // col2:終止單元格列序號,從0開始計算; // row2:終止單元格行序號,從0開始計算, private void drawPictureInfoExcel(HSSFWorkbook wb,HSSFPatriarch patriarch,int rowIndex,String pictureId) { //rowIndex代表當前行 try { String pictureUrl = null; if(StringUtils.isNotBlank(pictureId)) { UploadFile pictureFile = uploadFileService.get(pictureId); if(pictureFile != null) { pictureUrl = pictureFile.getPath();//獲取人員照片的地址 } logger.info("人員照片地址為:"+pictureUrl); } if(StringUtils.isNotBlank(pictureUrl)) { URL url = new URL(pictureUrl); //打開鏈接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設置請求方式為"GET" conn.setRequestMethod("GET"); //超時響應時間為5秒 conn.setConnectTimeout(5 * 1000); //通過輸入流獲取圖片數據 InputStream inStream = conn.getInputStream(); //得到圖片的二進制數據,以二進制封裝得到數據,具有通用性 byte[] data = readInputStream(inStream); //anchor主要用於設置圖片的屬性 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 250,(short) 0, rowIndex, (short) 0, rowIndex); //Sets the anchor type (圖片在單元格的位置) //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)); } } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }
導出的結果如下:
解決說明
1. 獲取網絡中的圖片資源
百度了一下,一共找到兩種
第一種:
//pictureUrl是人員照片的地址 URL url = new URL(pictureUrl); BufferedImage bufferImg = ImageIO.read(url); ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); ImageIO.write(bufferImg, "jpg", byteArrayOut); byte[] data = byteArrayOut.toByteArray(); //最終導入時所需要的圖片要轉換為byte[]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
但是發現一個問題,在本地測試是可以正常導出的,到了服務器中就不能導出,記錄了一下導出時的日志,發現圖片的地址是這樣的
http://www.xxx.cn:80/appfile//modules/apphr/staff/1481865941995.png
- 1
- 1
多了一個端口號,去掉端口號時可以正常導出的,把地址直接黏貼到瀏覽器中也是可以訪問的,不得其解,問了一下別人也沒得出原因
第二種(本地和服務器都可以):
//java.net.URL //java.net.HttpURLConnection; URL url = new URL(pictureUrl); //打開鏈接 HttpURLConnection conn = (HttpURLConnection)url.openConnection(); //設置請求方式為"GET" conn.setRequestMethod("GET"); //超時響應時間為5秒 conn.setConnectTimeout(5 * 1000); //通過輸入流獲取圖片數據 InputStream inStream = conn.getInputStream(); //得到圖片的二進制數據,以二進制封裝得到數據,具有通用性 byte[] data = readInputStream(inStream);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
private static byte[] readInputStream(InputStream inStream) throws Exception{ ByteArrayOutputStream outStream = new ByteArrayOutputStream(); //創建一個Buffer字符串 byte[] buffer = new byte[1024]; //每次讀取的字符串長度,如果為-1,代表全部讀取完畢 int len = 0; //使用一個輸入流從buffer里把數據讀取出來 while( (len=inStream.read(buffer)) != -1 ){ //用輸出流往buffer里寫入數據,中間參數代表從哪個位置開始讀,len代表讀取的長度 outStream.write(buffer, 0, len); } //關閉輸入流 inStream.close(); //把outStream里的數據寫入內存 return outStream.toByteArray(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2. 導入到EXCEL中
導出使用的時POI,主要用到兩個類:
HSSFPatriarch(負責再excel中創建圖片)、HSSFClientAnchor(負責圖片再excel中的位置)
- 1
- 1
代碼如下:
//創建一個工作簿
HSSFWorkbook wb = new HSSFWorkbook();
//創建一個表格
HSSFSheet sheet = wb.createSheet();
//一定要放在循環外,只能聲明一次
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
for(int i=0; ...; i++) { //調用插入圖片到excel的方法 drawPictureInfoExcel(wb,patriarch,i,"圖片地址"); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
//rowIndex代表的是當前的行標 private void drawPictureInfoExcel(HSSFWorkbook wb,HSSFPatriarch patriarch,int rowIndex,String pictureId) { try { //anchor主要用於設置圖片的屬性 HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 250,(short) 0, rowIndex, (short) 0, rowIndex); //Sets the anchor type (圖片在單元格的位置) //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)); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } }