zoukankan      html  css  js  c++  java
  • 使用JAVA导出EXCEL表格(POI)

    一、POI概述

      Jakarta POI 是一套用于访问微软格式文档的Java API。POI提供API给Java程序对Microsoft Office格式档案读和写的功能。在许多企业办公系统中,经常会有用户要求,需要对数据进行统计并且可以直接下载Excel文件。

      结构:
    • HSSF - 提供读写Microsoft Excel格式档案的功能。
    • XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
    • HWPF - 提供读写Microsoft Word格式档案的功能。
    • HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
    • HDGF - 提供读写Microsoft Visio格式档案的功能    

    二. 官方文档

         官方下载:http://poi.apache.org/download.html 这里可以下载到它的最新版本和文档,这里就不再赘述。

    三. Jakarta POI HSSF API组件:

      HSSF(用于操作Excel的组件,适用于excel2003)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:

      常用组件:

        HSSFWorkbook     excel的文档对象

        HSSFSheet            excel的表单

        HSSFRow               excel的行

        HSSFCell                excel的格子单元

        HSSFFont               excel字体

      样式:

        HSSFCellStyle         cell样式

    四.基本操作步骤:

      首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格

    的正确顺序应该是:

      1、用HSSFWorkbook打开或者创建“Excel文件对象”

      2、用HSSFWorkbook对象返回或者创建Sheet对象

      3、用Sheet对象返回行对象,用行对象得到Cell对象

      4、对Cell对象读写。

      5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面

    5. 导出Excel应用实例:

     pom.xml

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi</artifactId>
       <version>3.6</version>
    </dependency>
    

    utils

    public class ExcelUtils {
        /**
         * 导出Excel
         * @param sheetName sheet名称
         * @param title 标题
         * @param values 内容
         * @param wb HSSFWorkbook对象
         * @return
         */
        public static HSSFWorkbook getHSSFWorkbook(String sheetName, String []title, String [][]values, HSSFWorkbook wb){
    
            // 第一步,创建一个HSSFWorkbook,对应一个Excel文件
            if(wb == null){
                wb = new HSSFWorkbook();
            }
    
            // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
            HSSFSheet sheet = wb.createSheet(sheetName);
    
            // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
            HSSFRow row = sheet.createRow(0);
    
            // 第四步,创建单元格,并设置值表头 设置表头居中
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
    
            //声明列对象
            HSSFCell cell = null;
    
            //创建标题
            for(int i=0;i<title.length;i++){
                cell = row.createCell(i);
                cell.setCellValue(title[i]);
                cell.setCellStyle(style);
            }
    
            //创建内容
            for(int i=0;i<values.length;i++){
                row = sheet.createRow(i + 1);
                for(int j=0;j<values[i].length;j++){
                    //将内容按顺序赋给对应的列对象
                    row.createCell(j).setCellValue(values[i][j]);
                }
            }
            return wb;
        }
    }
    

      

    controller

    /**
         * 导出报表
         *
         * @return
         */
        @RequestMapping(value = "/export")
        @ResponseBody
        public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
            //获取数据
            List<PageData> list = userService.serviceList();
    
            //excel标题
            String[] title = {"用户ID", "用户名称", "用户密码", "用户手机","创建时间"};
    
            //excel文件名
            String fileName = "用户信息表" + System.currentTimeMillis() + ".xls";
    
            //sheet名
            String sheetName = "用户信息表";
    
            String [][] content = new String[list.size()][5];
    
            for (int i = 0; i < list.size(); i++) {
                content[i] = new String[title.length];
                PageData obj = list.get(i);
                content[i][0] = obj.getId().toString();
                content[i][1] = obj.getUsername();
                content[i][2] = obj.getPassword();
                content[i][3] = obj.getPhone();
                content[i][4] = obj.getCreateTime().toString();
            }
    
            //创建HSSFWorkbook
            HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
    
            //响应到客户端
            try {
                this.setResponseHeader(response, fileName);
                OutputStream os = response.getOutputStream();
                wb.write(os);
                os.flush();
                os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 发送响应流方法
         */
        public void setResponseHeader(HttpServletResponse response, String fileName) {
            try {
                try {
                    fileName = new String(fileName.getBytes(), "ISO8859-1");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                response.setContentType("application/octet-stream;charset=ISO8859-1");
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
                response.addHeader("Pargam", "no-cache");
                response.addHeader("Cache-Control", "no-cache");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    

     

    service

        /**
         * 测试POI导出用户列表来
         * @return
         */
        public List<PageData> serviceList() {
            return userMapper.selectAll();
        }
    

    entity

    @Data
    public class PageData {
        private Long id;
        private String username;
        private String password;
        private String phone;
        private Date createTime;
    }
    

      

    使用网页直接访问controller层的 /export接口

    --------------------------------------------------------------------简易的excel打印结果如下----------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    Conda 中安装 Keras
    Clean Docker :
    Conservation Vs Non-conservation Forms of conservation Equations
    C语言之预处理命令
    const指针用法总结
    C语言中的小启发(陆续更新。。。)
    左值与右值
    计算的次序
    C语言中的符号重载
    C语言之switch语句详解
  • 原文地址:https://www.cnblogs.com/jike1219/p/11182303.html
Copyright © 2011-2022 走看看