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 ...
随机推荐
- mysql_pconnect 问题
不同于mysql_connect的短连接,mysql_pconnect持久连接的时候,将先尝试寻找一个在同一个主机上用同样的用户名和密码已经打开的(持久)连接,如果找到,则返回此连接标识而不打开新连接 ...
- ip代理简单方法
requests.post(url-url,headers=headers,data=data,proxies={'https':'192.165.1.56:8000'}
- docker查看挂载目录Volume
使用docker inspect命令查看container的volume信息,按照书本上面敲,发现一直报错: 使用命令如下: sudo docker inspect --format "{{ ...
- socket网络编程-----I/O复用之poll函数
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/soc ...
- python中用psutil模块,yagmail模块监控CPU、硬盘、内存使用,阈值后发送邮件
import yagmailimport psutildef sendmail(subject,contents): #连接邮箱服务器 yag = yagmail.SMTP(user='邮箱名称@16 ...
- phpstorm快捷键总结
如果映射的是eclipse的快捷键,又同时安装了英特尔的GPU软件,那么会有这个快捷键冲突 就是快速复制快捷键:ctrl+alt+方向键 会调用英特尔旋转屏幕,禁用掉即可 PhPStorm 是 Je ...
- 掷骰子DApp的实现
前言: DApp前些日子比较火, 这段时间有些低迷. 我也是后知后觉, 现在才接触一些, 这篇博文就当做DApp的初次印象吧. 本文要写的是基于智能合约的博彩游戏DApp—骰子游戏, 来看看它是怎 ...
- Ubuntu下部分Java软件字体渲染问题解决方法
On ubuntu or in general Linux OS, fonts in some Java software(like Geogebra, Arduino) looks terriabl ...
- asp.net开启多线程异步处理
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { try { Thread categoryThrea ...
- angular6 导出json数据到excal表
1 首先使用npm下载插件依赖的安装包 npm install file-saver --save npm install xlsx --save 2 引入项目中的ts文件中 impo ...