java利用poi导出excel功能-附带图片导出

写在前面

最近刚离职,闲来无事,于是把上两家公司都有碰到过的需求但都没有去研究实现:即导出带图片的excel报表。于是就折腾了一下这个功能,研究出来后本来想写个通用的工具类,但无奈于个人技术太有限(一个初出茅庐的小白),没有太好的想法;写个博客记录此功能,如果有代码不合逻辑的地方也请各位大神指出,也希望有大神看到此博客后可以给个优化思路,让我可以把这功能做成个通用工具类。

导入maven依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version>
</dependency>

1、excel导出操作工具类

/*** @Author gjx* @email 13450753745@163.com* @description excel导出工具类* @Date 2019/7/10*/
public class ExcelUtils {/***功能描述 excel工具类,可导出带图片或不带图片的数据* @author gjx* @date 2019/7/10* @param [titles, rows, maps, uploadPath]*         titles[]:第一行的标题列;*         rows:数据行量*         maps:装载导出数据的封装了map的list数据集合,注意:此中的map尽量用本类中的方法*                 javaBean2Map直接生成,或自己拼接;但需与参数titles[]的标题相关数据对应上*         uploadPath: 导出到本地的文件路径和文件名。* @return java.lang.String  导出结果。*/public static java.lang.String excelOut(java.lang.String[] titles, int rows,List<Map<java.lang.String,Object>> maps,java.lang.String uploadPath){FileOutputStream fileOut = null;BufferedImage bufferImg = null;HSSFWorkbook wb = null;try{ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();//创建工作sheetwb = new HSSFWorkbook();HSSFSheet sheet = wb.createSheet("sheet1");//设置单元格内容水平垂直居中HSSFCellStyle style = wb.createCellStyle();style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)HSSFPatriarch patriarch = sheet.createDrawingPatriarch();HSSFRow row0 = sheet.createRow(0);row0.setHeightInPoints(25);if (titles.length == 0){return "error";}HSSFCell cell = null;//第一行、标题行列for (int i=0;i<titles.length;i++){cell = row0.createCell(i);     //第一个单元格cell.setCellValue(titles[i]);         //设定值cell.setCellStyle(style);sheet.setColumnWidth(i,6000);}HSSFRow row = null;HSSFCell cellRow = null;HSSFClientAnchor anchor = null;for (int i=1;i<=rows;i++){int cellColumn = 0;//创建行row = sheet.createRow(i);//设置默认行高row.setHeightInPoints(25);//行数据处理Map<java.lang.String, Object> stringObjectMap = maps.get(i - 1);for(Object value : stringObjectMap.keySet()){//行单元格cellRow = row.createCell(cellColumn);cellRow.setCellStyle(style);//如果行数据中有图片时候的处理if (value.equals("file")){File[] file = (File[]) stringObjectMap.get(value);if (file == null || file.length == 0){cellRow.setCellValue("");continue;}else{row.setHeightInPoints(150);for (int x=0;x<file.length;x++){if (x>0){cellRow = row.createCell(cellColumn);cellRow.setCellStyle(style);}sheet.setColumnWidth(cellColumn,9100);bufferImg = ImageIO.read(file[x]);ImageIO.write(bufferImg, "jpg", byteArrayOut);anchor = new HSSFClientAnchor(0, 0, 1023, 255,(short) cellColumn, i, (short) cellColumn, i);anchor.setAnchorType(3);patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));cellColumn++;}continue;}}cellRow.setCellValue(stringObjectMap.get(value).toString());cellColumn ++;}}fileOut = new FileOutputStream(uploadPath);// 写入excel文件wb.write(fileOut);}catch (Exception e){System.out.println(e.fillInStackTrace());}finally {if(fileOut != null){try {fileOut.close();} catch (IOException e) {e.printStackTrace();}}}return "success";}/***功能描述 将java类对象属性-值转换成map的键值对*           去除getClass方法属性,以及自定义的file属性放置最后。* @author gjx* @date 2019/7/10* @param [javaBean]* @return java.util.Map<java.lang.String,java.lang.Object>*/public static Map<java.lang.String, Object> javaBean2Map(Object javaBean) throws Exception {Map<java.lang.String, Object> map = new LinkedHashMap<>();//反射的实现方式:第一种/*Class<Student> studentClass = Student.class;studentClass.getClass();*///第二种实现方式Method[] methods = javaBean.getClass().getMethods(); // 获取所有方法//第三种实现方式/*Class.forName("类路径");*/java.lang.String fileName = null;File[] files = null;for (Method method : methods) {if (method.getName().startsWith("get")) {java.lang.String field = method.getName(); // 拼接属性名if (field.contains("getClass")){continue;}field = field.substring(field.indexOf("get") + 3);field = field.toLowerCase().charAt(0) + field.substring(1);Object value = method.invoke(javaBean, (Object[]) null); // 执行方法if (field.equals("file")){fileName = field;files = (File[]) value;continue;}map.put(field, value);}}if (fileName != null){map.put(fileName,files);}return map;}/***功能描述 递归调用让字符串对中调换* @author gjx* @date 2019/7/14* @param [originStr]* @return java.lang.String*/public static java.lang.String reverse(java.lang.String originStr) {if(originStr == null || originStr.length() <= 1)return originStr;java.lang.String substring = originStr.substring(1);java.lang.String s = reverse(substring) + originStr.charAt(0);return s;}}

2、定义导出的excel实体类User,注意:当需要导出图片时需要定义File[] file属性

public class User extends Model<User> {private Long id;private String name;private Integer age;private String email;//注意,若要导出图片,则对应的实体类属性中必须含有此属性private File[] file;public File[] getFile() {return file;}public void setFile(File[] file) {this.file = file;}public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overrideprotected Serializable pkVal() {return id;}
}

3、维护导出的实体类User类属性名称

/***功能描述 维护此map,此map是生成excel导出List<T> 时各数据的标题* @author gjx* @date 2019/7/12* @param []* @return java.util.Map<java.lang.String,java.lang.String>*/public Map<java.lang.String, java.lang.String> getMap(){Map<java.lang.String, java.lang.String> map = new HashMap<>();map.put("name","姓名");map.put("age","年龄");map.put("email","邮箱");map.put("id","唯一标识");map.put("file","图片");return map;}

4、测试用例

@Test
public void testModuleExcel() throws Exception {List<Map<java.lang.String,Object>> list = new ArrayList<>();File[] files = new File[2];File[] files1 = new File[0];files[0] = new File("C:\\Users\\gjxgyy\\Desktop\\testOne.jpg");files[1] = new File("C:\\Users\\gjxgyy\\Desktop\\testOne.jpg");User user1 = new User();user1.setId(1L);user1.setName("gjx");user1.setEmail("1345@163.com");user1.setAge(23);user1.setFile(files);User user2 = new User();user2.setId(2L);user2.setName("gjy");user2.setEmail("3745@163.com");user2.setAge(25);user2.setFile(files1);Map<java.lang.String, Object> stringObjectMap = ExcelUtils.javaBean2Map(user1);Map<java.lang.String, Object> stringObjectMap1 = ExcelUtils.javaBean2Map(user2);list.add(stringObjectMap);list.add(stringObjectMap1);Object[] objects = stringObjectMap.keySet().toArray();java.lang.String[] titles = new java.lang.String[objects.length];Map<java.lang.String, java.lang.String> map = getMap();for(int i=0;i<titles.length;i++){java.lang.String s1 = objects[i].toString();java.lang.String s = map.get(s1);titles[i] = s;}ExcelUtils.excelOut(titles,list.size(),list,"");
}

写在最后

导出的功能目前已完成了,但这种自己定义的规则的可扩展性着实比较低,待之后有更好的想法时再来优化,如果有小伙伴看到此博客,也烦请如果有更好的想法的话评论告诉我哦,待我也学习学习

java利用poi导出excel功能-附带图片导出相关推荐

  1. java利用poi实现Excel考勤报表的输出

    java利用poi实现Excel考勤报表的输出 实现效果 SXSSFWorkbook超大数据导出 标题.表头.内容有样式 可以多个sheet(满65535行数据换新的sheet) 一度为快 maven ...

  2. Java 利用EasyPoi做Excel模板的导入导出操作

    Java 利用EasyPoi做Excel模板的导入导出操作 项目背景 加入pom依赖 项目Excel模板图 代码实现 首先是实体类定义 Excel 实现导入 Excel的导出 结束语 项目背景 作为一 ...

  3. Java利用poi生成word(包含插入图片,动态表格,行合并)

    Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...

  4. Java 利用POI处理Excel的时间格式

    问题: 用Java的POI处理Excel中的时间单元格,往往得到的格式不是我们想要的.比如: 按上图中方式设置好后,通过以下代码 XSSFRow row = sheet.getRow(0);Cell ...

  5. 使用exceljs读取和导出Excel并支持图片导出

    等待提示使用Vue插件Loading; 导出图片需要将图片转换成base64格式,我在后台直接写了个url转base64接口并开启缓存 导出exce支持多层对象读取数据,例如:{a:{b:[{c:1} ...

  6. Java利用POI生成Excel强制换行

    前一段时间在做一个学校排课系统时,有一个地方需要利用把课程表生成excel汇出给客户,由于之前用excel都只是简单的应用,在单元格里都是用自动换行,而这次可能需要用到手动强制换行.  于是我在网上找 ...

  7. Java利用EasyPoi实现excel文件导入和导出

    1.导入依赖 <!--导数导入数据 依赖--> <!--easy poi--> <dependency><groupId>cn.afterturn< ...

  8. java 利用POI 读取Excel数据的真实有效行数

    前言 最近发现java导入excel数据时,我的excel数据明明只有4条数据,可是java程序却读取到了第6行.检查代码发现5.6行不小心设置了行高,导致poi的getLastRowNum()方法读 ...

  9. java利用poi生成excel如何自动换行

    1.首先设置单元格内容自动换行 // 生成一个样式,用于设置内容样式 HSSFWorkbook workbook = new HSSFWorkbook(); HSSFCellStyle cellSty ...

最新文章

  1. Python杂谈——Python都能干什么呢?
  2. 客户端使用win共享文件出错解决方法
  3. hdu1728 广搜
  4. 《伟大的小细节:互联网产品设计中的微创新思维》——
  5. UITextField中复制和粘贴为中文
  6. CSS强制按比例缩小图片
  7. 百度贴吧10亿量级LAMP架构分享
  8. 全开源纵横支付多平台多功能支付系统源码
  9. 时间管理 SMART 与 四象限
  10. 关联分析(一)--Apriori算法
  11. 9.郝斌C语言笔记——变量的作用域和存储方式
  12. 奇点云数据中台技术汇(五)| CDP,线下零售顾客运营中台
  13. 对微信公众号JS安全域名的理解
  14. org.apache.hadoop.hdfs.qjournal.client.QuorumException: Unable to check if JNs are ready for formatt
  15. 网络嗅探与欺骗----函数sniff()、ARP的原理、ARP欺骗、AARP欺骗的中间人攻击
  16. 微信公众号平台-自定义菜单
  17. UVM-config机制
  18. html错误代码204,win10系统使用远程桌面出现0x204错误代码如何解决
  19. HDFS分布式文件系统的常用命令行操作
  20. python画三瓣树叶_用Python能画哪些树?

热门文章

  1. idr寄存器、_STM32 GPIO寄存器 IDR ODR BSRR BRR
  2. 2021 MoDnet-V 抠图网络论文学习笔记
  3. 数据集成技术概述-常见的CDC方案比对
  4. 【Android高级】Android系统以及Activity启动讲解
  5. 怎么用软碟通制作U启动和再生龙恢复LINUX系统及备份
  6. 荧光平均值计算matlab,科学网—使用Image J进行自动荧光定量分析 - 陆绮的博文...
  7. 想知道自己的邮箱都注册过哪些服务?看这里
  8. 图文讲解uni-app支持PC宽屏
  9. 白领学python_白的解释|白的意思|汉典“白”字的基本解释
  10. 平行四边形的效果实现