美文网首页
java 导出Excel 实现公共方法

java 导出Excel 实现公共方法

作者: zbsong | 来源:发表于2020-04-23 22:17 被阅读0次

使用apache poi和反射实现公共方法来导出Excel,仅使用几十行简单的代码就能替代掉很多繁琐和重复的工作,这里只实现了一个简单的方法,实现了主要的逻辑,剩余的可以根据自己的需求进行扩展,有不对的地方或者有更好的方法可以一起交流。

  1. 添加依赖
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>4.0.1</version>
</dependency>
  1. 创建ExportUtils类,实现公共导出方法,复制后可以直接使用
/**
 * Description: pms
 *
 * @author songyu
 * @date 2020/4/23 15:00
 */
public class ExportUtils {

    public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    /**
     *
     * @param list 需要导出的数据
     * @param fileName 文件名称
     * @param columnHeadArr 列头
     * @param columnNameArr 列名 顺序与列头保持一致
     */
    public static void export(List<Object> list, String fileName, String[] columnHeadArr, String[] columnNameArr, HttpServletResponse response) {
        try {
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet("Sheet1");
            //需要设置表格样式的可以自己添加,比如宽度自适应、字体颜色等等
            //处理表头
            HSSFRow row = sheet.createRow(0);
            IntStream.range(0,columnHeadArr.length).forEach(i -> {
                row.createCell(i).setCellValue(columnHeadArr[i]);
            });
            //处理需要导出的数据
            IntStream.range(0,list.size()).forEach(i -> {
                HSSFRow r = sheet.createRow(i + 1);
                Class c = list.get(i).getClass();
                IntStream.range(0,columnNameArr.length).forEach(j -> {
                    try {
                        //获取属性的get方法名称,比如getName,下一步使用反射获取属性的值。
                        String getMethodName = "get" + columnNameArr[j].substring(0, 1).toUpperCase() + columnNameArr[j].substring(1);
                        Method getMethod = c.getMethod(getMethodName, new Class[] {});
                        Object value = getMethod.invoke(list.get(i), new Object[] {});
                        //一些特殊类型的值可以在这里处理,这里只简单的写了一个日期类型的格式化,可以自己根据实际需求添加
                        if (value instanceof Date) {
                            r.createCell(j).setCellValue(value==null?"":format.format(value));
                        } else {
                            r.createCell(j).setCellValue(value==null?"":value.toString());
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
            });
            //弹出一个"文件下载"的对话框
            response.setContentType("application/octet-stream");
            //文件名为中文时会乱码,需要转一下
            response.setHeader("Content-disposition", "attachment;filename=" + java.net.URLEncoder.encode(fileName,"UTF-8") + ".xls");
            response.flushBuffer();
            workbook.write(response.getOutputStream());
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 使用Student表来演示效果,数据库中两条数据。 image.png

创建pojo

public class Student implements Serializable {

    private Integer id;

    private String name;

    private String address;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name == null ? null : name.trim();
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address == null ? null : address.trim();
    }
}
  1. 编写StudentMapper,实现查询需要导出的学生信息
@Mapper
public interface StudentMapper {

    List<Object> getAllStudent();

}

5.编辑StudentMapper.xml,实现查询学生信息

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sy.mybatis.mapper.StudentMapper" >
  <cache></cache>
  <resultMap id="BaseResultMap" type="com.sy.mybatis.pojo.Student" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="name" property="name" jdbcType="VARCHAR" />
    <result column="address" property="address" jdbcType="VARCHAR" />
  </resultMap>
  <sql id="Base_Column_List" >
    id, name, address
  </sql>
  
  <select id="getAllStudent" resultMap="BaseResultMap">
    select *
    from students
  </select>

</mapper>
  1. 添加StudentService类,实现导出功能
@Service
public class StudentService {

    @Autowired
    StudentMapper studentMapper;

    public void exportStudent(HttpServletResponse response) {
        List<Object> stus = studentMapper.getAllStudent();
        //开始执行导出逻辑,后续其它的导出都可以直接使用下面的几行代码实现,比如学生成绩等等等
        //定义导出文件的名称
        String fileName = "学生信息";
        //列头
        String[] columnHeadArr = {"姓名","地址"};
        //列属性(pojo的属性名称),要与列头一一对应
        String[] columnNameArr = {"name","address"};
        //调用公共导出方法
        ExportUtils.export(stus, fileName, columnHeadArr, columnNameArr,response);
    }
}
  1. 编辑StudenController,添加导出方法
@RestController
@RequestMapping(value = "/student")
public class StudenController {

    @Autowired
    private StudentService studentService;

    @GetMapping(path = "/export_student")
    public void exportStudent(HttpServletResponse response) {
        studentService.exportStudent(response);
    }
}
测试

调用导出方法:http://localhost:9091/student/export_student

image.png
image.png

数据已经正常导出到了EXCEL。

上面罗里吧嗦的说了那么多,导出相关的实际不多,获取到想要导出的数据后,只需要使用下面几行代码调用公共导出方法即可。
//文件名称
String fileName = "文件名称";
//列头
String[] columnHeadArr = {"姓名","地址"};
//列属性(pojo的属性名称),要与列头一一对应
String[] columnNameArr = {"name","address"};
//调用公共导出方法
ExportUtils.export(qxds, fileName, columnHeadArr, columnNameArr,response);

相关文章

网友评论

      本文标题:java 导出Excel 实现公共方法

      本文链接:https://www.haomeiwen.com/subject/fgfzihtx.html