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


    工具简介

    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();
                    }
                }
            }
        }
    }
  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/dubhlinn/p/10901442.html
Copyright © 2020-2023  润新知