Excel导入导出工具——POI XSSF的使用

时间:2021-03-13 20:23:52

工具简介

POI是Apache提供的一款用于处理Microsoft Office的插件,它可以读写Excel、Word、PowerPoint、Visio等格式的文件。

其中XSSF是poi对Excel2007(.xlsx)文件操作的Java实现,例如,我们可以使用它来实现产品中常见的导入导出功能。

XSSF的常用类:

  |-XSSFWorkbook:Excel文档对象

  |-XSSFSheet:Excel的表单

  |-XSSFRow:Excel的行

  |-XSSFCell:Excel的单元格

  |-XSSFCellStyle:Excel单元格的实现

  |-XSSFCellHeader:Excel的表单头部

  |-XSSFCellFooter:Excel的表单尾部

 

使用工具导出的步骤

0. 导入jar包或添加依赖,主要是apache的poi和poi-ooxml;

1. 新建Excel文档实例,并且在文档实例中新建表单;

2. 添加标题,即在Excel表单中新建标题行,然后遍历标题数据,对每一个数据都新建单元格,然后设置单元格的值,必要时设置样式;

3. 添加内容,即遍历内容数据,对每一条数据都新建行(主要不要覆盖标题行),然后遍行数据,对每一个数据都新建单元格,设置单元格的值和样式;

4. 返回Excel文档实例,其他组件(例如controller)使用这个文档进行输出流操作,实现文件导出。

 

导出示例Demo

pom文件

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.0</version>
</dependency>

 

自定义工具类

package cn.monolog.diana.excel.util;

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.xssf.usermodel.*;

/**
 * 自定义工具类,用于读写Excel2007文件
 * created on 2019-05-21
 */
public class ExcelUtil {

    /**
     * 获取文档
     * @param sheetname 表单名
     * @param title 标题栏
     * @param content 内容
     * @return
     */
    public static XSSFWorkbook getWorkbook (String sheetname, String[] title, String[][] content) {
        //新建文档实例
        XSSFWorkbook workbook = new XSSFWorkbook();

        //在文档中添加表单
        XSSFSheet sheet = workbook.createSheet(sheetname);

        //创建单元格格式,并设置居中
        XSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);

        //创建第一行,用于填充标题
        XSSFRow titleRow = sheet.createRow(0);
        //填充标题
        for (int i=0 ; i<title.length ; i++) {
            //创建单元格
            XSSFCell cell = titleRow.createCell(i);
            //设置单元格内容
            cell.setCellValue(title[i]);
            //设置单元格样式
            cell.setCellStyle(style);
        }
        
        //填充内容
        for (int i=0 ; i<content.length ; i++) {
            //创建行
            XSSFRow row = sheet.createRow(i+1);
            //遍历某一行
            for (int j=0 ; j<content[i].length ; j++) {
                //创建单元格
                XSSFCell cell = row.createCell(j);
                //设置单元格内容
                cell.setCellValue(content[i][j]);
                //设置单元格样式
                cell.setCellStyle(style);
            }
        }

        //返回文档实例
        return workbook;
    }
}

 

controller组件

package cn.monolog.diana.excel.controller;

import cn.monolog.diana.excel.util.ExcelUtil;
import cn.monolog.diana.excel.model.Person;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用于模拟导入导出组件
 * created on 2019-05-21
 */
@Controller
@RequestMapping("/excel")
public class ExcelController {

    /**
     * 导出
     * @param response
     */
    @RequestMapping(value = "/export")
    @ResponseBody
    public void export(HttpServletResponse response) throws ParseException {
        //获取要导出的数据列表,在生产环境中要从数据库中查询,这里为了简化,自己创建
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Person p1 = new Person(182, "张叁", "建筑", 25, simpleDateFormat.parse("2014-10-01"));
        Person p2 = new Person(205, "李肆", "结构", 30, simpleDateFormat.parse("2015-10-01"));
        Person p3 = new Person(311, "王伍", "给排水", 28, simpleDateFormat.parse("2016-10-01"));
        Person p4 = new Person(377, "赵陆", "电气", 31, simpleDateFormat.parse("2017-10-01"));
        Person p5 = new Person(505, "蒋柒", "暖通", 26, simpleDateFormat.parse("2018-10-01"));
        List<Person> personList = new ArrayList<>();
        personList.add(p1);
        personList.add(p2);
        personList.add(p3);
        personList.add(p4);
        personList.add(p5);

        //设置文件名、表单名、标题栏
        String fileName = "员工信息表" + simpleDateFormat.format(new Date()) + ".xlsx";
        String sheetname = "员工信息表";
        String[] title = {"编号", "姓名", "专业", "年龄", "入职日期"};

        //声明表单内容
        String[][] content = new String[personList.size()][title.length];
        //遍历要导出的数据列表,构造表单内容
        for (int i=0 ; i<personList.size() ; i++) {
            //获取表单第i行
            String[] row = content[i];
            //获取对应的数据实例
            Person person = personList.get(i);
            //填充内容
            row[0] = String.valueOf(person.getId());
            row[1] = person.getName();
            row[2] = person.getMajor();
            row[3] = String.valueOf(person.getAge());
            row[4] = simpleDateFormat.format(person.getEnrollmentTime());
        }

        //获取文档
        XSSFWorkbook workbook = ExcelUtil.getWorkbook(sheetname, title, content);

        //声明输出流
        OutputStream outputStream = null;
        //响应到客户端
        try {
            //设置响应头
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8") );
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");

            //获取输出流
            outputStream = response.getOutputStream();

            //用文档写输出流
            workbook.write(outputStream);

            //刷新输出流
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭输出流
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}