Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。官方主页和API文档
本案例是在SpringBoot环境下完成的,maven配置如下。
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.0.RELEASEversion>
<relativePath/>
parent>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poiartifactId>
<version>3.9version>
dependency>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>3.9version>
dependency>
dependencies>
常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾(只有打印的时候才能看到效果)
样式:
HSSFCellStyle cell样式
辅助操作包括:
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
一个Excel的文件的组成,一个Excel文件对应一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(HSSFSheet)组成,一个sheet是由多个row(HSSFRow)组成,一个row是由多个cell(HSSFCell)组成。
基本操作步骤:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
这里举出一个下载Excel文件的简单例子(这里直接写到Controller层)
@RequestMapping("/exportExcel")
public void exportExcel(HttpServletResponse response) {
//创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建HSSFSheet对象
HSSFSheet sheet = wb.createSheet("sheet0");
//创建HSSFRow对象
HSSFRow row = sheet.createRow(0);
//创建HSSFCell对象
HSSFCell cell = row.createCell(0);
//设置单元格的值
cell.setCellValue("单元格");
//发送到客户端的响应的内容类型
response.setContentType("application/vnd.ms-excel;charset=utf-8");
try {
OutputStream os = response.getOutputStream();
//下载中文文件名的做法
// String fileName = URLEncoder.encode("下载Excel", "UTF-8");
// response.setHeader("Content-disposition","attachment;filename="+fileName+".xls");
response.setHeader("Content-disposition", "attachment;filename=test.xls");
wb.write(os);
os.flush();
os.close();
}catch (Exception e){
e.printStackTrace();
}
}
HSSF读取文件还是使用这几个对象,只是将相应的creatXXX方法变成了getXXX方法即可。
response.setContentType()解析
application/vnd.ms-excel ---------------- 响应的类型为excel文件
charset=utf-8 ---------------- 设置字符编码
详情了解请看这篇文章 response.setContentType()的作用及参数
response.setHeader()解析
Content-disposition 告诉浏览器这个文件的名字和类型
详情了解请看这篇文章 response.setHeader()的用法
在实际应用中导出的Excel文件往往需要阅读和打印的,这就需要对输出的Excel文档进行排版和样式的设置,主要操作有合并单元格、设置单元格样式、设置字体样式等。
HSSFSheet sheet = wb.createSheet("sheet0");
//设置默认行高 代表两个字符的高度
sheet.setDefaultRowHeight((short)(2*256));
//设置默认列宽
sheet.setDefaultColumnWidth(22);
//设置指定列宽,256 * 50这种写法是因为width参数单位是单个字符的256分之一
sheet.setColumnWidth(cell.getColumnIndex(), 256 * 50);
//创建HSSFCellStyle
HSSFCellStyle cellStyle = wb.createCellStyle();
//设置单元格纵向居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//设置单元格横向居中
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
/* 设置单元格的填充方式,以及前景颜色和背景颜色
三点注意:
1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;
2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;
3.前景颜色不是字体颜色。
4.颜色参考
https://blog.csdn.net/qq_38025219/article/details/82760471
*/
//设置填充方式(填充图案)
cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);
//设置前景色 一般情况设置前景
cellStyle.setFillForegroundColor(HSSFColor.RED.index);
//可以搭配 cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
//设置背景颜色
cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);
// 设置单元格底部的边框及其样式和颜色
// 这里仅设置了底边边框,左边框、右边框和顶边框同理可设
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);
cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);
//设置日期型数据的显示样式
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
颜色参考链接
实现将已存在的Excel文件中的数据导入到系统中的基本步骤同导出十分的类似,关键在于要了解要导入Excel文件的结构,比如数据有哪些列、读取数据起始位置(有效数据从第几行几列开始)等。在实际项目中由于这些数据(Excel文件)往往来自于日常办公人员或其他系统平台产生的业务数据,因此这些Excel文件的数据格式要有统一的要求,并提供访问接口(指访问途径),这样在所需数据的系统中就可通过提供这个访问接口调用方法,从而获得数据。
注意enctype属性
@RequestMapping("/submitExcel")
@ResponseBody
public String submitExcel(@RequestParam(value = "file",required = false) MultipartFile file){
Workbook workbook = null;
try {
//根据指定的文件输入流导入Excel
workbook = WorkbookFactory.create(file.getInputStream());
}catch (Exception e){
e.printStackTrace();
}
//获取Excel的第一个表单
Sheet sheet = workbook.getSheetAt(0);
int startNum = 1;
//获取最后一行
int endNum = sheet.getLastRowNum();
for (int i = startNum; i <= endNum ; i++) {
Row r = sheet.getRow(i);
System.out.println(r.getCell(0).getStringCellValue()+
"=="+r.getCell(1).getNumericCellValue()+
"=="+r.getCell(2).getNumericCellValue());
}
return "success";
}
此博文借鉴于 HSSFWorkbook 模版使用
本文仅供个人学习交流使用,记录做过的案例。