需求

导出人员的信息并且加上人员的照片至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();
}
}
												

[转] JAVA中读取网络中的图片资源导入到EXCEL中的更多相关文章

  1. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  2. 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

    原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...

  3. 如何使用免费控件将Word表格中的数据导入到Excel中

    我通常使用MS Excel来存储和处理大量数据,但有时候经常会碰到一个问题—我需要的数据存储在word表格中,而不是在Excel中,这样处理起来非常麻烦,尤其是在数据比较庞大的时候, 这时我迫切地需要 ...

  4. phpexcel的写操作将数据库中的数据导入到excel中

    这个版本据说是可以支持excel2007,但是我使用2007编辑的xlsx是无法获得该库的支持.于是乎我就将它转化为2003.感觉支持地很好. 下面介绍一下具体的使用: require_once('. ...

  5. 从输出日志中提取接口的入参和返回做为用例导入到excel中

    1  背景 接口用例已经在项目中的yml文件中编写,但是yml文件不能做为交付文档用,本文对工作中从接口输出日志中提取用例信息,并导入到excel文件中做了总些 2  工具 idea,notepad+ ...

  6. 将网页上指定的表单的数据导入到excel中

    很多时候,我们想要将网页上显示的信息,导入到Excel中,但是很多时候无法下手.可是,这个时候,下面这个例子会帮你大忙了. 将html表单指定内容导出到EXCEL中. <!DOCTYPE HTM ...

  7. 小技巧之“将Text文件中的数据导入到Excel中,这里空格为分割符为例”

    1.使用场景 将数据以文本导出后,想录入到Excel中,的简便方案, 起因:对于Excel的导出,Text导出明显会更方便些 2.将Text文件中的数据导入到Excel中,这里空格为分割符为例的步骤 ...

  8. Java InputStream读取网络响应Response数据的方法

    Java InputStream读取数据问题 原理讲解 1. 关于InputStream.read()     在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方 ...

  9. 将页面中指定表格的数据导入到Excel中

    function AutoExcel(){   var oXL = new ActiveXObject("Excel.Application"); //创建应该对象   var o ...

随机推荐

  1. SQL SERVER – Configuration Manager – Cannot Connect to WMI Provider. You Do Not Have Permission or The Server is Unreachable

    打开SQL SERVER Configuarion Manger 出现以下错误 SQL Server Configuration Manager—————————Cannot connect to W ...

  2. gRPC框架

    https://blog.csdn.net/shuanger_/article/details/47281381 https://grpc.io/ gRPC是利用通讯协议是HTTP2,序列化用prot ...

  3. leetcode 182. Duplicate Emails having的用法 SQL执行顺序

    https://leetcode.com/problems/duplicate-emails/description/ 首先sql的执行顺序是 from-->where-->group b ...

  4. (转)Rsync 排错案例解析

    Rsync 排错案例解析 原文:http://blog.51cto.com/irow10/1827306 错误一. 执行计划任务的备份脚本后没有看到备份的文件 1.首先查看crontab日志是否执行文 ...

  5. docker~service将容器日志输出到fluentd

    我们把微小的服务发布到docker里,然后实现docker service启动它,保证了服务的高可用性,然后把服务产生的日志输出到fluentd,由它进行过滤和转发,存储到elasticsearch里 ...

  6. JEECMS站群管理系统-- 标签使用和模板的制作

    1模板规划 1.1资源文件 资源文件就是网页中用到的图片.CSS.JS等元素,在CMS系统中所有的资源文件在网站的根目录中的 /res_base/所属网站定义资源目录/TEMPLEATE/WEB /r ...

  7. React.js 小书 Lesson7 - 组件的 render 方法

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson7 转载请注明出处,保留原文链接和作者信息. React.js 中一切皆组件,用 React. ...

  8. iis部署网站打不开

    事件查看器 1.crypt32报错 2.ASP.NET 2.0错误 解决办法: 1.crpt32报错,根本原因是计算机无法连接更新根证书所致,可能造成死循环. [1]必须连接到 Internet 或关 ...

  9. springboot2.x如何配置全局自定义异常

    为什么要捕获异常? 我们开发中,经常运行时,代码会报错,这时候我们有可能抛出异常,而不是用try..catch来解决.而且现在前后端分离,如果不捕获异常的话,前端那边的人估计会被报的错搞得焦头烂额的. ...

  10. maven课程 项目管理利器-maven 1-2maven介绍和环境搭建

    maven简介: Maven是基于项目对象模型(POM),通过一小段描述信息来管理项目的构建.报告和文档的软件项目管理工具. 1.1 Maven安装文件夹的结构 bin 目录放置包含mvn的运行脚本 ...