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)带 图片的更多相关文章

  1. java使用poi生成导出Excel(新)

    导出样式: java代码: import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStre ...

  2. 如何用poi生成导出excel

    import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Sheet; import java. ...

  3. Java利用POI导入导出Excel中的数据

         首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地 ...

  4. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  5. JAVA导出Excel(支持多sheet)

    一.批量导出: /** * * @Title: expExcel * @Description: 批量导出客户信息 * @param @param params * @param @param req ...

  6. POI通用导出Excel数据(包括样式设计)

    前言 前一段时间我写过通用的导入Excel,前几天也写了导出pdf格式的,还有我之前搞得导出Word,我在之前的博客也都介绍了导出和导入是一个道理,无非是一个获取一个是赋值.昨天有一位同仁看了我的Ex ...

  7. POI导入导出Excel(HSSF格式,User Model方式)

    1.POI说明 Apache POI是Apache软件基金会的开源代码库, POI提供对Microsoft Office格式档案读和写的功能. POI支持的格式: HSSF - 提供读写Microso ...

  8. Java POI导入导出Excel

    1.异常java.lang.NoClassDefFoundError: org/apache/poi/UnsupportedFileFormatException 解决方法: 使用的poi的相关jar ...

  9. java中使用poi导入导出excel文件_并自定义日期格式

    Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...

  10. SpringMvc 使用poi导入导出Excel

    Util类 package com.common.util; public class ExportUtil { private XSSFWorkbook wb = null; private XSS ...

随机推荐

  1. 集合List的排序

    自从出现了泛型和LINQ,对于集合的排序变得更简单了. //倒序 list.OrderByDescending(p=> p.a).ThenByDescending(p => p.b); / ...

  2. esLint 配置

    默认eslint规则: 代码末尾不能加分号 ;(强迫症的我受不了)代码中不能存在多行空行:(这个我更也忍不了)tab键不能使用,必须换成两个空格:(超级不习惯)代码中不能存在声明了但未使用的变量:(这 ...

  3. Csrf_token ||| CSRF跨站请求伪造

    # 注: 部分内容参考网上,侵删   CSRF(Cross-site request forgery) 跨站请求伪造,是一种对网站的恶意利用  它会通过伪装成受信任用户的请求来利用受信任的网站来获取一 ...

  4. Spring源码学习笔记1

    1.Spring中最核心的两个类 1)DefaultListableBeanFactory XmlBeanFactory继承自DefaultListableBeanFactory,DefaultLis ...

  5. Mysql数据库账户权限设置

    1.修改mysql数据库的root密码: 修改 数据库.表名 SET password=加密(‘密码’) where user=’root’; UPDATE mysql.user SET passwo ...

  6. 基本的java加密算法MD5等等

    简单的java加密算法有: BASE64       严格地说,属于编码格式,而非加密算法 MD5             (Message Digest algorithm 5,信息摘要算法) SH ...

  7. s21day15 python笔记

    s21day15 python笔记 一.内容回顾及补充 回顾 补充 range / xrange(python2与python3的区别六) python2: xrange:不会在内存中立即创建,而是在 ...

  8. Python多线程的运行及time.sleep()的应用

    已知小明和其弟弟小白每月都需要生活费,二人同时从同一个账户中取钱,两人每人每月需要1000元,账户中现有余额3200元,如果卡内余额大于2000元,则父母不会存入,如果卡内余额小于2000元,则父母当 ...

  9. linux压缩、解压缩和归档工具

    linux基础之压缩.解压缩和归档工具 1.压缩工具 基本介绍 为了减少文件的原来的文件大小而过多的浪费磁盘的存储空间,我们使用压缩后多文件进行存储 压缩工具的介绍 compress:把文件压缩成以. ...

  10. 百战程序员——Spring框架

    什么是容器,我们学过了哪些容器,Spring与我们之前学习的容器有哪些异同点? 容器可以管理对象的生命周期.对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称.如 ...