Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
POI从版本4.0.1开始,需要Java 8或更高版本。按照需要导入jar包及相关依赖jar包。官方对架包和API有详细的介绍
poi-xx.jar (excel文件生成需要)
poi-examples-xx.jar(官方示例,开发不需要)
poi-excelant-xx.jar(不需要)
poi-ooxml-xx.jar(excel,word,ppt均需要)
poi-ooxml-schemas-xx.jar(excel需要)
poi-scratchpad-xx.jar(ppt,vsd,word,viso,outlook等需要)
官方地址:https://poi.apache.org/overview.html
API:https://poi.apache.org/apidocs/4.1/
这里POI使用 4.1.2版本,简单实现POI通用导入导出Excel(工具类使用接口对象),针对一个sheet的处理,多个sheet同理
创建Springboot项目,引入POI依赖:
org.apache.poi
poi
4.1.2
org.apache.poi
poi-ooxml
4.1.2
org.apache.poi
poi-ooxml-schemas
4.1.2
建表,这里主键自增
CREATE TABLE `t_poi_entity` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`sex` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`height` double DEFAULT NULL,
`birthday` date DEFAULT NULL,
`intro` text,
`createtime` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一、下面实例用到的EXCEL知识点
1、POI结构说明
HSSFWorkbook类提供读写 Microsoft Excel XLS 格式的excel功能。
XSSFWorkbook类提供读写 Microsoft Excel OOXML XLSX 格式的excel功能。
2、POI常用类说明
Sheet 工作表是电子表格的中心结构,用户在其中完成大部分电子表格工作。对row,合并拆分单元格,设置列宽,获取画笔,页眉页脚等操作
Row 电子表格中的行。对cell,行高,行索引,行样式等操作
Cell 单元格。单元格可以包含文本、数字、日期、链接和公式等。对单元格内容的类型,内容,cell索引,cell样式等操作
Font 字体。对单元格中内容的字体,大小,颜色,加粗,下划线等操作
CellStyle 单元格样式。对边框,字体,对齐方式,背景色等操作
二、导入excel俩分excel数据差不多
1、controller
@GetMapping("/importExcel")
@ResponseBody
public String importExcel(String filePath) {
File file = new File(filePath);
if (ImportExcelUtil.isExcel(file.getName())) {
String reslut = poiSerivce.importExcel(file);
return "importExcel--" + reslut;
} else {
return "importExcel-- 文件类型与模板不符!";
}
}
2、service
public String importExcel(File file) {
// poi_xlsx.xlsx
String fileName = file.getName();
List dataList = null;
String headData = null;
Workbook workbook = null;
String dateFormat = "yyyy-MM-dd";
try {
if (ImportExcelUtil.isExcel2007(fileName)) {
workbook = new XSSFWorkbook(new FileInputStream(file));
} else if (ImportExcelUtil.isExcel2003(fileName)) {
workbook = new HSSFWorkbook(new FileInputStream(file));
}
if (workbook != null) {
headData = ImportExcelUtil.getExcelHeadData(workbook);
dataList = ImportExcelUtil.getExcelData(workbook, 1, 2, dateFormat);
}
//拿到数据进行数据库操作
System.out.println(headData);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
Optional.ofNullable(dataList).orElse(new ArrayList()).forEach(strArr -> {
PoiEntityDO entity = new PoiEntityDO();
for (int i = 0; i < strArr.length; i++) {
String cellValue = strArr[i];
switch (i) {
case 0:
entity.setName(cellValue);
break;
case 1:
entity.setSex(cellValue);
break;
case 2:
entity.setAge(Integer.valueOf(cellValue));
break;
case 3:
entity.setHeight(Double.valueOf(cellValue));
break;
case 4:
try {
entity.setBirthday(sdf.parse(cellValue));
} catch (ParseException e) {
e.printStackTrace();
}
break;
case 5:
entity.setIntro(cellValue);
break;
default:
break;
}
}
entity.setCreatetime(new Date());
poiEntityDOMapper.insert(entity);
});
return "success";
} catch (Exception e) {
e.printStackTrace();
} finally {
if (workbook != null) {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return "false";
}
3、工具类
import org.apache.poi.ss.usermodel.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class ImportExcelUtil {
private ImportExcelUtil() {};
/**
* 读取Excel表头首行信息
*
* @param workbook
* @return 首行表头信息
*/
public static String getExcelHeadData(Workbook workbook) {
String headValue;
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(sheet.getFirstRowNum());
headValue = getCellValue(row.getCell(0), null);
return headValue;
}
/**
* 读取Excel数据
*
* @param workbook
* @param fieldRow - 字段所在行,
* @param dataStartRow - 数据开始行
* @param dateFormat - 日期类型处理的格式
* @return 数据集合
*/
public static List getExcelData(Workbook workbook, int fieldRow, int dataStartRow, String dateFormat) {
List dataList = new ArrayList();
Sheet sheet = workbook.getSheetAt(0);
// 获取总行数(不包含合计行)
int rowNum = sheet.getLastRowNum();
// 根据字段的行获取总列数
int colNum = sheet.getRow(fieldRow).getPhysicalNumberOfCells();
// 从数据开始行读取excel数据
for (int i = dataStartRow; i 0 && fieldNameENArr.length > 0) {
for (Map map : dataList) {
int index = rowIndex++;
Row row = sheet.createRow(index);
for (int i = 0; i < fieldNameENArr.length; i++) {
Cell cell = row.createCell(i);
cell.setCellValue(map.get(fieldNameENArr[i]) != null ? map.get(fieldNameENArr[i]).toString() : "");
cell.setCellStyle(style);
}
}
}
}
}
这里简单做了工具类处理,可以根据业务来改变(查看官网API),主要还是理解POI的结构和常用类。
参考文章:
JAVA POI的使用
Java 中使用POI设置EXCEL单元格格式为文本、小数、百分比、货币、日期、科学计数法和中文大写、单元格边框等
java用POI设置Excel的列宽
JAVA POI自动导出数据和图片到excel
ends~