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. python安装后环境变量的设置

    win7系统中单击右击计算机->属性->高级系统设置->环境变量 在path目录下用分号分开做分割添加环境变量. 如果同时添加python2.x.x版本和python3.x.x版本两 ...

  2. linux系统中文件的权限

    查看文件权限的语句: 在终端输入:ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些:-rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是 ...

  3. CSS:与input相关的一些样式设置问题

    input是HTML中非常重要,非常常用而又不可替代的元素,在于其相关的样式设置中有时会遇到其他元素不会发生的问题,今天把我印象中的一些小问题和解决方案记录一下. 1.与同行元素上下居中对齐 关于上下 ...

  4. 如何开发微信小程序学习

    文件中 project.config.json是开发者工具为我们自动生成的一个开发者工具的配置文件,主要是保存了一些我们对开发者工具的个性化配置. 一个微信小程序应用至少要有两个文件 一个是app.j ...

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

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

  6. react初学之render返回加括号的问题

    刚在学习react的初始阶段,跑了一段代码 var  Mydom = React.createClass({ render:function(){ return <div> <inp ...

  7. React native中DrawerNavigator,StackNavigator,TabNavigator导航栏使用

    import React from 'react'; import { View, Text,Button } from 'react-native'; import { DrawerNavigato ...

  8. 使用Python画一个带坐标轴的圆

    Download Microsoft Visual Studio Microsoft Visual Studio enables you develop your python Application ...

  9. 【证明】【一题多解】布尔不等式(union bound)的证明

    布尔不等式(Boole's inequality)也叫(union bound),即并集的上界,描述的是至少一个事件发生的概率(P(⋃iAi)" role="presentatio ...

  10. Windows Essentials Movie Maker 安装失败报错 ——问题解决

    Windows Essentials Movie Maker 安装失败报错: (软件包名: wlsetup-all.exe) 查到官方论坛给出了一些回复: https://social.technet ...