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 ...
随机推荐
- python安装后环境变量的设置
win7系统中单击右击计算机->属性->高级系统设置->环境变量 在path目录下用分号分开做分割添加环境变量. 如果同时添加python2.x.x版本和python3.x.x版本两 ...
- linux系统中文件的权限
查看文件权限的语句: 在终端输入:ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些:-rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是 ...
- CSS:与input相关的一些样式设置问题
input是HTML中非常重要,非常常用而又不可替代的元素,在于其相关的样式设置中有时会遇到其他元素不会发生的问题,今天把我印象中的一些小问题和解决方案记录一下. 1.与同行元素上下居中对齐 关于上下 ...
- 如何开发微信小程序学习
文件中 project.config.json是开发者工具为我们自动生成的一个开发者工具的配置文件,主要是保存了一些我们对开发者工具的个性化配置. 一个微信小程序应用至少要有两个文件 一个是app.j ...
- Csrf_token ||| CSRF跨站请求伪造
# 注: 部分内容参考网上,侵删 CSRF(Cross-site request forgery) 跨站请求伪造,是一种对网站的恶意利用 它会通过伪装成受信任用户的请求来利用受信任的网站来获取一 ...
- react初学之render返回加括号的问题
刚在学习react的初始阶段,跑了一段代码 var Mydom = React.createClass({ render:function(){ return <div> <inp ...
- React native中DrawerNavigator,StackNavigator,TabNavigator导航栏使用
import React from 'react'; import { View, Text,Button } from 'react-native'; import { DrawerNavigato ...
- 使用Python画一个带坐标轴的圆
Download Microsoft Visual Studio Microsoft Visual Studio enables you develop your python Application ...
- 【证明】【一题多解】布尔不等式(union bound)的证明
布尔不等式(Boole's inequality)也叫(union bound),即并集的上界,描述的是至少一个事件发生的概率(P(⋃iAi)" role="presentatio ...
- Windows Essentials Movie Maker 安装失败报错 ——问题解决
Windows Essentials Movie Maker 安装失败报错: (软件包名: wlsetup-all.exe) 查到官方论坛给出了一些回复: https://social.technet ...