POI 生成、导出Excel(包含多个sheet)带 图片
1、导入依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
2、封装实体类
excelEntity——对应一个excel文件
package com.example.mytest.demo.entity; import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.List; /**
* @author jieke
* @date 2018/8/9 10:58
* @Description:
*/
@Getter
@Setter
@ToString
public class ExcelEntity {
private List<SheetEntity> sheetEntityList;
private String excelName;
}
SheetEntity——对应excel中的一个sheet
package com.example.mytest.demo.entity; import lombok.Getter;
import lombok.Setter;
import lombok.ToString; import java.io.ByteArrayOutputStream;
import java.util.List; /**
* @author jieke
* @date 2018/8/9 10:46
* @Description:
*/
@Getter
@Setter
@ToString
public class SheetEntity {
private String sheetName;
private List list;//每一行数据实体类list
private ByteArrayOutputStream byteArrayOut;//图片
}
Student——对应表格的一行数据
package com.example.mytest.demo.repository.entity; import com.example.mytest.demo.annotation.Column;
import lombok.Data; import javax.persistence.*; /**
* @author jieke
* @date 2018/8/2 11:09
* @Description:
*/
@Data
@Entity
public class Student { @Column("学生id")
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id; @Column("学校id")
private Integer schoolId; @Column("学生姓名")
private String name; @Column("学生年龄")
private Integer age; @Column("学生性别")
private Integer sex; @Column("班级")
private Integer studentClass; }
自定义注解:@Column
package com.example.mytest.demo.annotation; import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /**
* @author jieke
* @date 2018/8/9 9:55
* @Description:
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value() default "";
}
3、POIServiceImpl
package com.example.mytest.demo.service.impl; import com.example.mytest.demo.entity.ExcelEntity;
import com.example.mytest.demo.entity.SheetEntity;
import com.example.mytest.demo.repository.entity.Student;
import com.example.mytest.demo.service.POIService;
import com.example.mytest.demo.util.PoiUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.stereotype.Service; import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* @author jieke
* @date 2018/8/8 17:50
* @Description:
*/
@Service
public class POIServiceImpl implements POIService{
@Override
public void downLoad(HttpServletResponse response) { //////////////////////////////////////////////////////////////////////////////
////////创建测试数据///////// // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
try {
BufferedImage bufferImg = ImageIO.read(new File("C:/Users/jieke/Desktop/1.jpg"));
ImageIO.write(bufferImg, "jpg", byteArrayOut);
} catch (IOException e) {
e.printStackTrace();
} Student student = new Student();
student.setId(1L);
student.setSchoolId(1);
student.setName("name");
student.setAge(1);
student.setSex(1);
student.setStudentClass(1); List<Student> list = new ArrayList<>();
list.add(student);
list.add(student); SheetEntity sheet1 = new SheetEntity();
sheet1.setList(list);
sheet1.setSheetName("sheet1");
sheet1.setByteArrayOut(byteArrayOut); SheetEntity sheet2 = new SheetEntity();
sheet2.setList(list);
sheet2.setSheetName("sheet2"); List<SheetEntity> sheetEntityList = new ArrayList<>(); sheetEntityList.add(sheet1);
sheetEntityList.add(sheet2); ExcelEntity excelEntity = new ExcelEntity();
excelEntity.setExcelName("测试");
excelEntity.setSheetEntityList(sheetEntityList);
///////////////////////////////////////////////////////////////////////////
// 第一步,创建一个workbook,对应一个Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
for (SheetEntity sheetEntity:excelEntity.getSheetEntityList()) {
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = workbook.createSheet(sheetEntity.getSheetName());
//第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow row = sheet.createRow(0);
//第四步,创建单元格,并设置值表头 设置表头居中
PoiUtil.createCell(workbook, row, sheetEntity.getList().get(0).getClass());
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
PoiUtil.setCellValue(sheetEntity.getList(),row,sheet);
//第六步,插入图片
PoiUtil.insertPicture(sheet,workbook,sheetEntity);
}
// 第七步,下载excel
PoiUtil.downLoadExcel(response,excelEntity.getExcelName(),workbook);
}
}
4、util类
PoiUtil
package com.example.mytest.demo.util; import com.example.mytest.demo.annotation.Column;
import com.example.mytest.demo.entity.SheetEntity;
import com.example.mytest.demo.repository.entity.Student;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.HorizontalAlignment; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map; /**
* @author jieke
* @date 2018/8/9 10:11
* @Description:PoiUtil
*/
public class PoiUtil { //创建单元格,并设置值表头 设置表头居中
public static void createCell(HSSFWorkbook workbook,HSSFRow row, Class<?> c) { HSSFCellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
HSSFCell cell;
Field[] fields = c.getDeclaredFields();
for (int i=0 ; i < fields.length ; i++) {
cell = row.createCell((short) i);
cell.setCellValue(fields[i].getAnnotation(Column.class).value());
cell.setCellStyle(style);
}
} // 通过反射写入实体数据
public static void setCellValue(List list, HSSFRow row, HSSFSheet sheet) {
for (int i = 0; i < list.size(); i++)
{
row = sheet.createRow(i + 1);
Object o = list.get(i);
Field[] declaredFields = Student.class.getDeclaredFields();
Map<String, Object> map = BeanUtil.ObjectToMap(o);
for(int j = 0; j < declaredFields.length ; j++){
if (declaredFields[j].getType() == String.class){
row.createCell(j).setCellValue((map.get(declaredFields[j].getName())).toString());
}else if(declaredFields[j].getType() == Integer.class){
row.createCell(j).setCellValue(Integer.parseInt(map.get(declaredFields[j].getName()).toString()));
}else if(declaredFields[j].getType() == Long.class){
row.createCell(j).setCellValue(Long.parseLong(map.get(declaredFields[j].getName()).toString()));
}else if(declaredFields[j].getType() == Date.class){
try {
row.createCell(j).setCellValue(new SimpleDateFormat("yyyy-MM-dd").parse(map.get(declaredFields[j].getName()).toString()));
} catch (ParseException e) {
e.printStackTrace();
}
}else{
row.createCell(j).setCellValue(map.get(declaredFields[j].getName()).toString());
}
}
}
} //下载生成的excel到本地
public static void downLoadExcel(HttpServletResponse response, String excelName, HSSFWorkbook workbook) {
try (OutputStream out = response.getOutputStream()) {
response.setContentType("application/ms-excel;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="
.concat(String.valueOf(URLEncoder.encode(excelName + ".xls", "UTF-8"))));
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
} //excel中插入图片
public static void insertPicture(HSSFSheet sheet, HSSFWorkbook workbook, SheetEntity sheetEntity) {
if(sheetEntity.getByteArrayOut()!=null){
// 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// anchor主要用于设置图片的属性
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 1, sheetEntity.getList().size()+1, (short) 5, 7+10);
// 插入图片
patriarch.createPicture(anchor, workbook.addPicture(sheetEntity.getByteArrayOut().toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
}
}
}
BeanUtil
package com.example.mytest.demo.util; import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map; /**
* @author jieke
* @date 2018/8/8 18:47
* @Description:ObjectToMap
*/
public class BeanUtil { public static Map<String,Object> ObjectToMap(Object object){
if(object==null){
return null;
}
Map<String,Object> map = new HashMap<>();
Field[] fields = object.getClass().getDeclaredFields();
for (Field field:fields) {
field.setAccessible(true);
try {
map.put(field.getName(), field.get(object));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
}
}

POI 生成、导出Excel(包含多个sheet)带 图片的更多相关文章
- java使用poi生成导出Excel(新)
导出样式: java代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStre ...
- 如何用poi生成导出excel
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Sheet; import java. ...
- Java利用POI导入导出Excel中的数据
首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...
- Java之POI导出Excel(一):单sheet
相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码 <!-- ...
- JAVA导出Excel(支持多sheet)
一.批量导出: /** * * @Title: expExcel * @Description: 批量导出客户信息 * @param @param params * @param @param req ...
- POI通用导出Excel数据(包括样式设计)
前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...
- POI导入导出Excel(HSSF格式,User Model方式)
1.POI说明 Apache POI是Apache软件基金会的开源代码库, POI提供对Microsoft Office格式档案读和写的功能. POI支持的格式: HSSF - 提供读写Microso ...
- Java POI导入导出Excel
1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...
- java中使用poi导入导出excel文件_并自定义日期格式
Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...
- SpringMvc 使用poi导入导出Excel
Util类 package com.common.util; public class ExportUtil { private XSSFWorkbook wb = null; private XSS ...
随机推荐
- 将一个float型转化为内存存储格式的步骤
将一个float型转化为内存存储格式的步骤为: (1)先将这个实数的绝对值化为二进制格式. (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边. (3)从小数点右边 ...
- L3-015 球队“食物链” (30 分)
L3-015 球队“食物链” (30 分) 某国的足球联赛中有N支参赛球队,编号从1至N.联赛采用主客场双循环赛制,参赛球队两两之间在双方主场各赛一场. 联赛战罢,结果已经尘埃落定.此时,联赛主席 ...
- ASP.NET项目答辩系统课件使用中的问题记录
使用软件:VS2008 模块一:登录模块 1-08 问题:显示属性“background”不是元素"td"的有效属性 解决:style="background-image ...
- python 解方程
[怪毛匠子=整理] SymPy 库 安装 sudo pip install sympy x = Symbol('x') 解方程 solve([2 * x - y - 3, 3 * x + y - 7] ...
- Golang中的函数
函数 在go语言中,函数的基本组成为:关键字func.函数名.参数列表.返回值.函数体和返回语句 函数的定义 定义一个最简单的加法函数 func Add(a int,b int)(ret int,er ...
- LeetCode第一次刷题
感觉自身编程水平还是差很多,所以刷刷题 LeetCode貌似是一个用的人比较多的题库,下面是第一题 给数组和目标和求需要元素的下标 public class Solution { public int ...
- c#枚举描述
1.枚举遍历 public enum e_Sex{ male=, female= } foreach (var value in Enum.GetValues(typeof(e_Sex)){ /* 获 ...
- 关于matlab中画图放大局部细节的问题
1)需要用得到一个matnify.m文件,下载地址magnify 2)接下来就是如何使用magnify的问题,参见使用 只是在“使用”中的第二步之前首先要用cd进入magnify所在位置.
- 零基础python入门(1)
1.前景及准备 (1).python是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并且能用简单而又高效的方式进行面向对象的编程.python优雅的语法和动态的类型,再结合它的解释性,使 ...
- Linux 6.8 源码安装MySQL8.0
搭建环境说明: 系统版本:Red Hat Enterprise Linux Server release 6.8 (Santiago) 内核版本:Linux 2.6.32-642.el6.x86_64 ...