(一)POI介绍

Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 Microsoft Office文档的功能。

本文介绍的是用POI做一个导出excel报表的工具类,相当实用也相当简单。

(二)POI导出报表要用到的包

  • 1、org.apache.poi:poi:4.0.4 (必须要)
  • 2、org.apache.poi:poi-ooxml:4.0.1(据情况看是否要加)

如果要做一些更复杂的功能的话,还需要加jar包

(三)POI常用类说明

class declare
HSSFWorkbook Excel的文档对象(考虑到对以前老版本格式为.xls的excel的兼容性,以下的实例用HSSF,而不采用XSSF)
HSSFSheet Excel中的表单
HSSFRow Excel中的行
HSSFCell Excel中的元素单元
HSSFFont Excel元素的字体
HSSFDataFormat 格子单元的日期格式
HSSFHeader Excel文档工作表的页眉
HSSFFooter Excel文档表的页脚
HSSFCellStyle 格子单元样式
HSSFDateUtil 日期
HSSFPrintSetup 打印

(四)创建Excel导出工具类

先在项目中导入POI的jar包,我建立的是maven项目,所以我在pom.xml文件中加入了如下依赖:

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

然后就可以愉快的写工具类啦~~~
创建一个ExportExcelUtil类,这个类的代码如下:

package com.example.demo.tools;import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;/*** 导出报表工具类*/
public class ExportExcelUtil {/**** @param title 标题* @param headers  表头* @param values  表中元素* @return*/public static HSSFWorkbook getHSSFWorkbook(String title, String headers[], String [][] values){//创建一个HSSFWorkbook,对应一个Excel文件HSSFWorkbook hssfWorkbook = new HSSFWorkbook();//在workbook中添加一个sheet,对应Excel文件中的sheetHSSFSheet hssfSheet = hssfWorkbook.createSheet(title);//创建标题合并行hssfSheet.addMergedRegion(new CellRangeAddress(0,(short)0,0,(short)headers.length - 1));//设置标题样式HSSFCellStyle style = hssfWorkbook.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);   //设置居中样式style.setVerticalAlignment(VerticalAlignment.CENTER);//设置标题字体Font titleFont = hssfWorkbook.createFont();titleFont.setFontHeightInPoints((short) 14);style.setFont(titleFont);//设置值表头样式 设置表头居中HSSFCellStyle hssfCellStyle = hssfWorkbook.createCellStyle();hssfCellStyle.setAlignment(HorizontalAlignment.CENTER);   //设置居中样式hssfCellStyle.setBorderBottom(BorderStyle.THIN);hssfCellStyle.setBorderLeft(BorderStyle.THIN);hssfCellStyle.setBorderRight(BorderStyle.THIN);hssfCellStyle.setBorderTop(BorderStyle.THIN);//设置表内容样式//创建单元格,并设置值表头 设置表头居中HSSFCellStyle style1 = hssfWorkbook.createCellStyle();style1.setBorderBottom(BorderStyle.THIN);style1.setBorderLeft(BorderStyle.THIN);style1.setBorderRight(BorderStyle.THIN);style1.setBorderTop(BorderStyle.THIN);//产生标题行HSSFRow hssfRow = hssfSheet.createRow(0);HSSFCell cell = hssfRow.createCell(0);cell.setCellValue(title);cell.setCellStyle(style);//产生表头HSSFRow row1 = hssfSheet.createRow(1);for (int i = 0; i < headers.length; i++) {HSSFCell hssfCell = row1.createCell(i);hssfCell.setCellValue(headers[i]);hssfCell.setCellStyle(hssfCellStyle);}//创建内容for (int i = 0; i <values.length; i++){row1 = hssfSheet.createRow(i +2);for (int j = 0; j < values[i].length; j++){//将内容按顺序赋给对应列对象HSSFCell hssfCell = row1.createCell(j);hssfCell.setCellValue(values[i][j]);hssfCell.setCellStyle(style1);}}return hssfWorkbook;}
}

里面用到了几个设置属性,在这里同一解释一下:
1、


addMergedRegion(x,y,z)是设置单元格合并
第一行是标题,所以得合并第一行的单元格
x代表是要合并第几行,y,z表示,从第x行的第y个格子到第z个格子合并成一个格子
2、

这个是设置居中属性
3、

设置字体的属性,这里还可以设置更多,我这里只设置字体大小
4、

这个属性是设置单元格上下左右的线,THIN代表的是实线,你可以选择你需要的如虚线

(五)通过接口来验证


我想将如上查询到的生成一个excel表格(学生成绩表),利用如上工具类生成的表格效果如下:

现在我们来写接口吧,你们也可以根据自己查到的写一个相应的导出报表接口,反正工具类是通用的。
我的接口类代码如下:

package com.example.demo.controller;import com.example.demo.tools.ExportExcelUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;@RestController
public class ExportExcelTest {@Autowiredprivate JdbcTemplate jdbcTemplate;@RequestMapping("/export")public void export(HttpServletRequest request, HttpServletResponse response){//excel标题String title = "学生成绩表";//excel表名String [] headers = {"姓名", "科目", "成绩"};//excel文件名String fileName = title + System.currentTimeMillis()+".xls";String sql = "SELECT a.name , b.s_sub, b.score FROM student a LEFT JOIN s_score b on a.id = b.s_id";List<Map<String, Object>> list =  jdbcTemplate.queryForList(sql);for (Map<String, Object> map : list) {Set<Map.Entry<String, Object>> entries = map.entrySet( );if(entries != null) {Iterator<Map.Entry<String, Object>> iterator = entries.iterator( );while(iterator.hasNext( )) {Map.Entry<String, Object> entry =(Map.Entry<String, Object>) iterator.next( );Object key = entry.getKey( );Object value = entry.getValue();System.out.println(key+":"+value);}}}//excel元素String content[][] = new String[list.size()][3];for (int i = 0; i < list.size(); i++) {content[i] = new String[headers.length];content[i][0] = list.get(i).get("name").toString();content[i][1] = list.get(i).get("s_sub").toString();content[i][2] = list.get(i).get("score").toString();}//创建HSSFWorkbookHSSFWorkbook wb = ExportExcelUtil.getHSSFWorkbook(title, headers, content);//响应到客户端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 blocke.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();}}
}


我这一块是与数据库交互的代码,你们可以写你们的查询语句进去。
不过要搭建与数据库连接的框架,你们的项目自己搭建自己的也行,只要把表格中的元素取到。如果完全不会的,可以看我之前的教程,从无到有,很详细:
使用IDEA创建SpringBoot+MyBatis+MySql项目连接数据库实例
https://blog.csdn.net/zeng_ll/article/details/87715305
接着我们去浏览器访问下这个接口,看看是否会导出报表:
http://localhost:端口号/接口
http://localhost:8888/export

可以看到,我们的接口确实生成了一个表格,
打开如下:

到这里,我们的excel已经完美的导出完毕了。
是不是很简单,你也来试一试吧。
哪里不懂可以在下方留言,有错误或者可以改进的地方也欢迎指出!

想要源码的同学们可以在评论区留言,小姐姐我双手奉上~

POI导出Excel工具类(简单看完就会)相关推荐

  1. Java导入导出Excel工具类ExcelUtil

    前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hiberna ...

  2. 自定义POI的excel工具类-xls-xlsx

    自定义POI的excel工具类-xls-xlsx 使用jdk8(java8)实现Excel导出,随意切换 xls和xlsx.自己只是封装了比较常用方法,07版生成还有bug.ε=(´ο`*)))唉 j ...

  3. 导出excel工具类

    1.excel工具类代码如下 package com.spring.excel.utils; import org.apache.poi.hssf.usermodel.*; import org.ap ...

  4. JAVA工具类(17)--Java导入导出Excel工具类ExcelUtil

    实战 导出就是将List转化为Excel(listToExcel) 导入就是将Excel转化为List(excelToList) 导入导出中会出现各种各样的问题,比如:数据源为空.有重复行等,我自定义 ...

  5. JAVA使用POI写入excel 工具类【通用】

    使用写入excel工具类的例子 说明:改工具类是网上公开的,来源现在找不着了,我只是在原基础上修改了下,抽离了泛型.如有侵权,请通知博主 工具类代码: package com.system.util; ...

  6. Java基于POI读取Excel工具类

    为什么为封装此工具类? 由于公司供应链部门业务需要,对Excel处理这块有较为严苛的要求.为了提高开发效率,从实际项目出发封装了通用自定义读取Excel工具类. 功能概述 支持读取全部excel数据 ...

  7. poi/jxls导入/导出Excel工具类(支持2003和2007)

    1.ExportUtil导出工具类(根据模板导出),支持2003/2007不同excel格式文件 package org.nercita.bcp.util;import java.io.FileInp ...

  8. springboot使用 poi 导入导出Excel工具类

    转载的一个比较好用的工具类 import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOE ...

  9. 【工具篇】java导出excel工具类,多种模式自动配置,绝对值得你收藏

    文章目录 项目环境: 实现功能: 工具类实现 定义参数bean:ExportExcelBean.java 定义导出excel的表格主题:ExportExcelTheme.java [重点]导出exce ...

最新文章

  1. java程序员修炼之道
  2. js怎么设置z index.html,HTML5 Canvas set z-index
  3. 钉钉电脑版如何申请调休 钉钉电脑版申请调休方法
  4. 卡尔曼滤波器实例:进一步讨论自由落体运动
  5. YAML书写规则与数据结构
  6. 微软发布Visual Studio 2010 SP1公测版
  7. Message Code 【27796】 Failed to connect to server 'hostname';port_ld': 'reason'.
  8. 《21天学通Java(第7版)》——VC程序员的学习笔记1
  9. 前端leader找我谈心:我是如何从刚毕业的前端菜鸟一步步成长为前端工程师的?
  10. 域、域树、域林、根域
  11. 成人大专计算机试题,2021成人大专数学模拟试题及参考答案
  12. 静态页面和动态页面中的静态和动态到底指的是什么
  13. 读《深度思考 让所有事情都能正确入手》
  14. ipad服务器的显示器,Air Display怎么用 iPad怎么分屏显示 值得收藏
  15. dsa签名 linux_linux SElinux防护 加密解密 gpg签名与认证
  16. 关于Eclipes上Servlet程序404的问题
  17. 强大、优秀的文件管理软件评测:图片管理、书籍管理、文献管理
  18. React-document-title实现动态更新页面Title
  19. Pyinstaller打包完整python项目 使用虚拟环境的python项目的打包
  20. arthas监控服务和入门

热门文章

  1. 0083-Zipkin耗时分析
  2. Autohotkey实现粘贴板图片用百度OCR识别
  3. python的单行注释以什么开头_python中单行注释以什么开头,
  4. 仿掘金社区全栈项目开发(二)-前端工程化
  5. 无忧计算机二级试题题库,计算机等级考试题库,二级Web试题
  6. [ROS学习笔记1]在RViz中查看激光雷达数据
  7. 怎么将一个音频无损剪切
  8. spring容器destory时没有调用destory-method解决方法
  9. 景安虚拟主机Typecho伪静态设置方法和规则
  10. java jsp聊天系统_java web实现简单聊天室