java利用poi导出excel功能-附带图片导出
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功能-附带图片导出相关推荐
- java利用poi实现Excel考勤报表的输出
java利用poi实现Excel考勤报表的输出 实现效果 SXSSFWorkbook超大数据导出 标题.表头.内容有样式 可以多个sheet(满65535行数据换新的sheet) 一度为快 maven ...
- Java 利用EasyPoi做Excel模板的导入导出操作
Java 利用EasyPoi做Excel模板的导入导出操作 项目背景 加入pom依赖 项目Excel模板图 代码实现 首先是实体类定义 Excel 实现导入 Excel的导出 结束语 项目背景 作为一 ...
- Java利用poi生成word(包含插入图片,动态表格,行合并)
Java利用poi生成word(包含插入图片,动态表格,行合并) 测试模板样式: 图表 1 Word生成结果: 图表 2 需要的jar包:(具体jar可自行去maven下载) Test测试类: imp ...
- Java 利用POI处理Excel的时间格式
问题: 用Java的POI处理Excel中的时间单元格,往往得到的格式不是我们想要的.比如: 按上图中方式设置好后,通过以下代码 XSSFRow row = sheet.getRow(0);Cell ...
- 使用exceljs读取和导出Excel并支持图片导出
等待提示使用Vue插件Loading; 导出图片需要将图片转换成base64格式,我在后台直接写了个url转base64接口并开启缓存 导出exce支持多层对象读取数据,例如:{a:{b:[{c:1} ...
- Java利用POI生成Excel强制换行
前一段时间在做一个学校排课系统时,有一个地方需要利用把课程表生成excel汇出给客户,由于之前用excel都只是简单的应用,在单元格里都是用自动换行,而这次可能需要用到手动强制换行. 于是我在网上找 ...
- Java利用EasyPoi实现excel文件导入和导出
1.导入依赖 <!--导数导入数据 依赖--> <!--easy poi--> <dependency><groupId>cn.afterturn< ...
- java 利用POI 读取Excel数据的真实有效行数
前言 最近发现java导入excel数据时,我的excel数据明明只有4条数据,可是java程序却读取到了第6行.检查代码发现5.6行不小心设置了行高,导致poi的getLastRowNum()方法读 ...
- java利用poi生成excel如何自动换行
1.首先设置单元格内容自动换行 // 生成一个样式,用于设置内容样式 HSSFWorkbook workbook = new HSSFWorkbook(); HSSFCellStyle cellSty ...
最新文章
- Python杂谈——Python都能干什么呢?
- 客户端使用win共享文件出错解决方法
- hdu1728 广搜
- 《伟大的小细节:互联网产品设计中的微创新思维》——
- UITextField中复制和粘贴为中文
- CSS强制按比例缩小图片
- 百度贴吧10亿量级LAMP架构分享
- 全开源纵横支付多平台多功能支付系统源码
- 时间管理 SMART 与 四象限
- 关联分析(一)--Apriori算法
- 9.郝斌C语言笔记——变量的作用域和存储方式
- 奇点云数据中台技术汇(五)| CDP,线下零售顾客运营中台
- 对微信公众号JS安全域名的理解
- org.apache.hadoop.hdfs.qjournal.client.QuorumException: Unable to check if JNs are ready for formatt
- 网络嗅探与欺骗----函数sniff()、ARP的原理、ARP欺骗、AARP欺骗的中间人攻击
- 微信公众号平台-自定义菜单
- UVM-config机制
- html错误代码204,win10系统使用远程桌面出现0x204错误代码如何解决
- HDFS分布式文件系统的常用命令行操作
- python画三瓣树叶_用Python能画哪些树?
热门文章
- idr寄存器、_STM32 GPIO寄存器 IDR ODR BSRR BRR
- 2021 MoDnet-V 抠图网络论文学习笔记
- 数据集成技术概述-常见的CDC方案比对
- 【Android高级】Android系统以及Activity启动讲解
- 怎么用软碟通制作U启动和再生龙恢复LINUX系统及备份
- 荧光平均值计算matlab,科学网—使用Image J进行自动荧光定量分析 - 陆绮的博文...
- 想知道自己的邮箱都注册过哪些服务?看这里
- 图文讲解uni-app支持PC宽屏
- 白领学python_白的解释|白的意思|汉典“白”字的基本解释
- 平行四边形的效果实现