[轉] JAVA中讀取網絡中的圖片資源導入到EXCEL中


需求

導出人員的信息並且加上人員的照片至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(); } }

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM