zoukankan      html  css  js  c++  java
  • 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();
                    }
                }
            }
        }
    }
  • 相关阅读:
    个人阅读作业+个人总结
    个人作业Week3-案例分析
    个人作业Week2-代码复审
    个人作业-Week1
    个人项目-数独
    第0次个人作业
    团队项目-游戏引擎的考察
    Week3结对项目-数独游戏
    个人作业Week3-案例分析
    代码复审
  • 原文地址:https://www.cnblogs.com/dubhlinn/p/10901442.html
Copyright © 2011-2022 走看看