java读取图片资源_[转] JAVA中读取网络中的图片资源导入到EXCEL中

需求

导出人员的信息并且加上人员的照片至EXCEL中

完整的代码

//创建一个表格

HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet = wb.createSheet();

//需要导出的人员信息

List boList =staffService.findStaffList(searchBO);

if(boList != null && boList.size() >0)

{

//一定要放在循环外,只能声明一次

HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

for(int i=0; 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();

}

}

导出的结果如下:

fdf13f0ab824d339c66906aebcdb538c.png

解决说明

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();

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值