使用Apache的POI实现职位的导入导出功能
Apache POI 是 Apache 软件基金会提供的 100% 开源库,支持 Excel 库的所有基本功能。在 POI 中,Workbook代表着一个 Excel 文件(工作簿),Sheet代表着 Workbook 中的一个表格,Row 代表 Sheet 中的一行,而 Cell 代表着一个单元格。
HSSFWorkbook对应的就是一个 .xls 文件,兼容 Office97-2003 版本。
XSSFWorkbook对应的是一个 .xlsx 文件,兼容 Office2007 及以上版本。
在HSSFWorkbook 中,Sheet接口 的实现类为 HSSFSheet,Row接口 的实现类为HSSFRow,Cell 接口的实现类为 HSSFCell。
XSSFWorkbook 中实现类的命名方式类似,在 Sheet、Row、Cell 前加 XSSF 前缀即可。
一.导入的代码实现:
后端代码部分:
1.添加依赖
org.apache.poi
poi
4.1.1
org.apache.poi
poi-ooxml
4.1.1
org.apache.poi
poi-ooxml-schemas
4.1.1
2.写excel导入的方法
public static List importData(MultipartFile file) {
List positions = new ArrayList<>();
Position position = null;
try {
XSSFWorkbook workbook = new XSSFWorkbook(file.getInputStream());
// 2. 获取 workbook的 sheet数量
int numberOfSheets = workbook.getNumberOfSheets();
for (int i = 0; i < numberOfSheets; i++) {
// 3. 获取 sheet
XSSFSheet sheet = workbook.getSheetAt(i);
int rows = sheet.getPhysicalNumberOfRows();
for (int j = 1; j < rows; j++) {
XSSFRow row = sheet.getRow(j);
if (row != null) {
position = new Position();
int cellNum = row.getPhysicalNumberOfCells();
for (int k = 0; k < cellNum; k++) {
XSSFCell cell = row.getCell(k);
switch (cell.getCellType()) {
case STRING:
if (k == 1) {
position.setName(cell.getStringCellValue());
}
break;
case BOOLEAN:
if(k == 3) {
position.setEnabled(cell.getBooleanCellValue());
}
break;
default:
if(k == 2) {
position.setCreateDate(cell.getDateCellValue());
}
break;
}
}
positions.add(position);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return positions;
}
3.写批量添加的sql
- 在mapper中写批量添加的方法
Integer batchInsert(List positions);
- 在xml写批量添加的sql语句
insert into position (name, createDate, enabled) values
(#{position.name,jdbcType=VARCHAR}, #{position.createDate, jdbcType=TIMESTAMP},
#{position.enabled, jdbcType=BIT})
- 在service中写批量添加的方法
public int addPositions(List positions){
return positionMapper.batchInsert(positions);
}
4.写导入的接口
@PostMapping("/import")
@ApiOperation(value = "导入数据", notes = "导入excel数据")
public RespBean importData(MultipartFile file) throws IOException {
List positions = PoiUtils.importData(file);
if(positionService.addPositions(positions) == positions.size()) {
return RespBean.ok("导入成功");
}
return RespBean.ok("导入失败");
}
前端代码部分:
1.在职位中添加导入按钮
{{importBtnText}}
2.在职位中实现导入
- 在data中添加
importBtnDisabled: false,
importBtnText: '导入数据',
mportBtnIcon: 'el-icon-upload2',
- 在methods中添加
onSuccess(response, file, fileList) {
this.importBtnText = '导入数据'
this.importBtnIcon = 'el-icon-upload2'
this.importBtnDisabled = false
this.initPositions()
},
onError(err, file, fileList) {
this.importBtnText = '导入数据'
this.importBtnIcon = 'el-icon-upload2'
this.importBtnDisabled = false
},
beforeUpload () {
this.importBtnText = '正在导入'
this.importBtnIcon = 'el-icon-loading'
this.importBtnDisabled = true
},
二.导出的代码实现:
后端代码部分:
1.添加依赖
org.apache.poi
poi
4.1.1
org.apache.poi
poi-ooxml
4.1.1
org.apache.poi
poi-ooxml-schemas
4.1.1
2.写excel导出的方法
public static ResponseEntity exportData(List positions) {
// 1. 创建 excel文件
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 创建样式
// 标题行样式
XSSFCellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillForegroundColor(IndexedColors.YELLOW.index);
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 日期样式
XSSFCellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));
// 3. 写入标题栏数据
XSSFSheet sheet = workbook.createSheet("职位信息表");
sheet.setColumnWidth(0, 5 * 256);
sheet.setColumnWidth(1, 15 * 256);
sheet.setColumnWidth(2, 20 * 256);
sheet.setColumnWidth(3, 10 * 256);
Row titleRow = sheet.createRow(0);
Cell c0 = titleRow.createCell(0);
Cell c1 = titleRow.createCell(1);
Cell c2 = titleRow.createCell(2);
Cell c3 = titleRow.createCell(3);
c0.setCellStyle(headerStyle);
c1.setCellStyle(headerStyle);
c2.setCellStyle(headerStyle);
c3.setCellStyle(headerStyle);
c0.setCellValue("编号");
c1.setCellValue("职位名称");
c2.setCellValue("创建时间");
c3.setCellValue("是否启用");
// 4. 写入 postions数据
for (int i = 0; i < positions.size(); i++) {
Position position = positions.get(i);
Row row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(position.getId());
row.createCell(1).setCellValue(position.getName());
Cell cell = row.createCell(2);
cell.setCellStyle(dateCellStyle);
cell.setCellValue(position.getCreateDate());
row.createCell(3).setCellValue(position.getEnabled());
}
// 5. 保存文件
ByteArrayOutputStream out = new ByteArrayOutputStream();
HttpHeaders headers = new HttpHeaders();
try {
headers.setContentDispositionFormData("attachment",
new String("aaa.xlsx".getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
}
return new ResponseEntity<>(out.toByteArray(), headers, HttpStatus.CREATED);
}
3.写导出的接口
@GetMapping("/export")
@ApiOperation(value = "导出数据", notes = "将所有职位导出到excel")
public ResponseEntity exportData() {
List positions = positionService.getAllPosition();
return PoiUtils.exportData(positions);
}
前端代码部分:
1.在职位中添加导出按钮
导出数据
2.在职位中实现导出
- 在methods中添加
pullData() {
window.open('/system/basic/pos/export', '_parent')
},
三.运行结果:
1.导入
2.导出