当前位置: 首页 > 编程笔记 >

Java使用Jakarta POI操作Excel

陈康胜
2023-05-05

使用Java操作excel可以使用两种方式:

关于表格导入导出,市面上比较知名的开源就是 Apache 的POI 和 阿里巴巴的 EasyExcel了。EasyExcel 也是对 POI 的改进和封装, 更加好用。

1:POI是Apache 的开源项目,由Java编写的跨平台 Java API,可操作Microsoft Office。

借助POI,可以方便的生成数据报表,数据批量上传,数据备份等工作。但是将文件数据一

次性全部加载到内存可能导致OOM。

2:EasyExcel 能大大减少内存占用的主要原因是在解析 Excel 时没有将文件数据一次性全部

加载到内存中,而是从磁盘上一行行读取数据,逐个解析。

今天我们介绍用Jakarta POI操作Excel:

在实际开发中我们经常需要导入数据,统计数据,并且将统计好的数据导出excel,今天分享一个导出学生信息的方法。 目前,比较常用的实现Java导入、导出Excel的技术有两种Jakarta POI和Java Excel。 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,目前用于操作Excel的HSSF比较成熟。

官方主页,API文档 使用步骤:

一:下载jar包,并放在工程的WEB-INF——>lib目录下

下载地址:http://poi.apache.org/download.html 目前最新版本是4.0,我使用的是3.9

二:理解HSSFWorkbook的几种对象:

HSSFWorkbook:excel的工作簿HSSFSheet:excel的工作表HSSFRow:excel的行HSSFCell:excel的单元格HSSFFont:excel字体HSSFDataFormat:日期格式HSSFHeader:sheet头 样式:HSSFCellStyle:单元格样式 一个Excel的文件对应一个工作簿(HSSFWorkbook),一个工作簿可以有多个工作表(我们通常看到的Sheet0、Sheet1)(HSSFSheet)组成,一个工作表是由多行(HSSFRow)组成,一行又是由多个单元格(HSSFCell)组成。

三:定义导出数据的请求接口,一般的业务逻辑在这里处理

    /**
     * 导出学生信息
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("/studentInfoExcelOut")
    public void studentInfoExcelOut(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        /**获取导出数据,实际开发中这里一般是从数据库查询的数据,
        这里演示是定义了一个实体对象,然后初始化多个对象,并放进我们需要导出的集合里*/
        List<Student> list = new ArrayList<>();
        int sex = 1;
        for(int i = 0 ;i < 10 ;i++){
            if(i%2 == 0){
                sex = 2;
            }
            Student stu = new Student(i+1,"学生"+(i+1)+"号",sex,18+i,20190001+i,"1998年-"+(i+1)+"月",new Date());
            list.add(stu);
        }
        exportExcelBook(request,response,list);
        return;
    }


由于我们是导出学生的基础信息,所以需要定义一个学生实体类对象Student.java:

public class Student {
    /**学生id*/
    private int id;
    /**学生姓名*/
    private String name;
    /**学生性别 1:男 2:女*/
    private int sex;
    /**学生年龄*/
    private int age;
    /**学生学号*/
    private int student_no;
    /**学生出生年月*/
    private String birthday;
    /**学生创建时间*/
    private Date create_time;
    public Student(int id,String name,int sex,int age,int student_no,String birthday,Date create_time) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.student_no = student_no;
        this.birthday = birthday;
        this.create_time = create_time;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSex() {
        return sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public int getStudent_no() {
        return student_no;
    }
    public void setStudent_no(int student_no) {
        this.student_no = student_no;
    }
    public String getBirthday() {
        return birthday;
    }
    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public Date getCreate_time() {
        return create_time;
    }
    public void setCreate_time(Date create_time) {
        this.create_time = create_time;
    }
}


四:调用HSSFWorkbook提供的方法将所需要导出的数据导出并生成文件

    /**
     * 导出数据生成EXCEL方法
     * @param request
     * @param response
     * @param list
     * @throws IOException
     */
    public void exportExcelBook(HttpServletRequest request, HttpServletResponse response,List<Student> list)
            throws IOException {
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        //文件名称,客户端传来的参数,防止中文文件名乱码参数编码因此这里需要解码
        String fileName = URLDecoder.decode(request.getParameter("fileName"),"UTF-8");
        //创建Excel工作薄对象
        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建Excel工作表对象
        HSSFSheet sheet = workbook.createSheet();
        sheet.setColumnWidth(0, 3000);
        sheet.setColumnWidth(1, 5000);
        sheet.setColumnWidth(2, 4000);
        sheet.setColumnWidth(3, 2500);
        sheet.setColumnWidth(4, 3000);
        sheet.setColumnWidth(5, 6000);
        sheet.setColumnWidth(6, 6000);
        // 设置表头字体样式
        HSSFFont columnHeadFont = workbook.createFont();
        columnHeadFont.setFontName("宋体");
        columnHeadFont.setFontHeightInPoints((short) 10);
        columnHeadFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 列头的样式
        HSSFCellStyle columnHeadStyle = workbook.createCellStyle();
        columnHeadStyle.setFont(columnHeadFont);
        // 左右居中
        columnHeadStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        // 上下居中
        columnHeadStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        columnHeadStyle.setLocked(true);
        columnHeadStyle.setWrapText(true);
        // 左边框的颜色
        columnHeadStyle.setLeftBorderColor(HSSFColor.BLACK.index);
        // 边框的大小
        columnHeadStyle.setBorderLeft((short) 1);
        // 右边框的颜色
        columnHeadStyle.setRightBorderColor(HSSFColor.BLACK.index);
        // 边框的大小
        columnHeadStyle.setBorderRight((short) 1);
        // 设置单元格的边框为粗体
        columnHeadStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // 设置单元格的边框颜色
        columnHeadStyle.setBottomBorderColor(HSSFColor.BLACK.index);
        // 设置单元格的背景颜色(单元格的样式会覆盖列或行的样式)
        columnHeadStyle.setFillForegroundColor(HSSFColor.WHITE.index);
        // 设置普通单元格字体样式
        HSSFFont font = workbook.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short) 10);
        //创建Excel工作表第一行
        HSSFRow row0 = sheet.createRow(0);
        // 设置行高
        row0.setHeight((short) 750);
        HSSFCell cell = row0.createCell(0);
        //设置单元格内容
        cell.setCellValue(new HSSFRichTextString("学生id"));
        //设置单元格字体样式
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(1);
        cell.setCellValue(new HSSFRichTextString("姓名"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(2);
        cell.setCellValue(new HSSFRichTextString("性别"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(3);
        cell.setCellValue(new HSSFRichTextString("年龄"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(4);
        cell.setCellValue(new HSSFRichTextString("学号"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(5);
        cell.setCellValue(new HSSFRichTextString("出生年月"));
        cell.setCellStyle(columnHeadStyle);
        cell = row0.createCell(6);
        cell.setCellValue(new HSSFRichTextString("创建时间"));
        cell.setCellStyle(columnHeadStyle);
        // 循环写入数据
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            HSSFRow row = sheet.createRow(i + 1);
            cell = row.createCell(0);
            cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getId())));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(1);
            cell.setCellValue(new HSSFRichTextString(stu.getName()));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(2);
            if(stu.getSex() == 1){
                cell.setCellValue(new HSSFRichTextString("男"));
            }else{
                cell.setCellValue(new HSSFRichTextString("女"));
            }
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(3);
            cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getAge())));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(4);
            cell.setCellValue(new HSSFRichTextString(String.valueOf(stu.getStudent_no())));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(5);
            cell.setCellValue(new HSSFRichTextString(stu.getBirthday()));
            cell.setCellStyle(columnHeadStyle);
            cell = row.createCell(6);
            cell.setCellValue(new HSSFRichTextString());
            cell.setCellStyle(columnHeadStyle);
            cell.setCellValue(new HSSFRichTextString(DateUtils.DateToString(stu.getCreate_time(), "yyyy-MM-dd HH:mm:ss")));
        }
        // 获取输出流
        OutputStream os = response.getOutputStream();
        // 重置输出流
        response.reset();
        // 设定输出文件头
        response.setHeader("Content-disposition",
                "attachment; filename=" + new String(fileName.getBytes("GB2312"), "8859_1") + ".xls");
        // 定义输出类型
        response.setContentType("application/msexcel");
        workbook.write(os);
        os.close();
        return;
    }


五:网页调用导出excel接口

      <a href="javascript:void(0)" onclick="outExcel()">导出学生信息</a>
      <script>
        function outExcel(){
            var fileName ="学生信息表";
            //编码防止中文字符乱码
            window.location.href=encodeURI("studentInfoExcelOut?fileName="+encodeURIComponent(fileName));
        }
      </script>


六:导出excel截图:

 

 

13079544-562563f6c4aff75f.png  

  

 类似资料:
  • 本文向大家介绍JAVA使用DBUtils操作数据库,包括了JAVA使用DBUtils操作数据库的使用技巧和注意事项,需要的朋友参考一下 摘要:本文主要学习了如何使用DBUtils在Java代码中更方便的操作数据库。 概述 DBUtils是Java编程中的数据库操作实用工具,小巧简单实用。 DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。 使用 准备 如果需要使用DBUtil

  • 任何人都可以指向一个官方Java文档,该文档描述了流将调用每个元素的每个“无干扰和无状态”中间操作的次数。 例如: 以上代码当前将调用< code>check方法4次。 在JDK的当前或未来版本中,方法的执行次数是否可能多于或少于从List或任何其他标准JavaAPI创建的流中的元素数量?

  • 问题内容: 据我了解,java将数据存储在二进制补码中,表示-1 = 11111111(根据Wikipedia)。 同样,从java docs中:“位模式由左侧操作数给出,要移位的位置数由右侧操作数给出。无符号的右移运算符“ >>>”将零移位到最左边位置,而“ ”之后的最左侧位置取决于符号扩展名。” 这意味着>>>每次都会将0移到最左侧。所以我希望这段代码是 迭代:x的位表示 0:11111111

  • 主要内容:环境配置,连接数据库,创建集合,获取/选择集合,插入文档,查询文档,更新文档,删除文档,删除集合,列出所有集合MongoDB 不仅可以在命令行窗口(CMD)中运行,它还可以与编程语言配合使用,本节我们就来介绍一下在 Java 中如何使用 MongoDB。 环境配置 想要在 Java 程序中使用 MongoDB,需要确保您的电脑上已经安装了 MongoDB,并搭建好了 Java 的环境。您可以查看《 Java 教程》来了解不同系统下 Java 的安装教程。 另外您还需要确认安装了 Mon

  • 我有一个对象,“item”,字段为:int:id string:prices 字符串prices包含一个或多个由逗号分隔的价格值。 getStoresaIntList()从对象中的字符串价格返回价格值列表。 以上当然不是我想要的。

  • 本文向大家介绍Java使用JSONObject操作json实例解析,包括了Java使用JSONObject操作json实例解析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java使用JSONObject操作json。分享给大家供大家参考,具体如下: 简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON。JSON(JavaScript Object Notatio

  • 本文向大家介绍Java使用反射操作数组示例,包括了Java使用反射操作数组示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java使用反射操作数组。分享给大家供大家参考,具体如下: 一 实战 1 代码 2 运行 E:\Java\疯狂java讲义\codes\18\18.4>java ArrayTest1 疯狂Java讲义 轻量级Java EE企业应用实战 二 实战 1 代码 2 运行

  • 本文向大家介绍使用java连接Redis,Maven管理操作,包括了使用java连接Redis,Maven管理操作的使用技巧和注意事项,需要的朋友参考一下 pom配置 创建db.properties文件 书写工具类 书写测试类 补充知识:JAVA使用Redis所需的MAVEN的POM文件 redis不仅可以通过命令行进行操作,同时redis也可以通过javaAPI进行操作,这是操作redis所需的