需求:
1.公司需要实现导出Excel模板功能,以及传入该模板中的内容进行后台接收转换(业务代码均已删除,可能会出现业务代码报错情况删除既可,logger.info效果等同于systemm.out.println(“”))
注:1.该功能实现为ssm模式,出参直接为response。
2.该功能导入excel数据解析仅支持xlsx格式,老版本格式不支持(能用但是有坑)
maven依赖为
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.12</version>
</dependency>
1.生成excel模板前端下载
1.1前端代码为
function toDown() {
window.location.href = "${ctx}/excelReportManager/excelReport/download"
}
1.2后端引入为(仅展示excel引包,没有输入输出流,仅供参考)
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
1.3后端代码为
/**
* 导出模板
*
* @param response
* @param request
* @throws IOException
*/
@RequestMapping(value = "/download", produces = "text/html;charset=UTF-8")
public void download(HttpServletResponse response, HttpServletRequest request) {
//创建HSSFWorkbook对象
try (HSSFWorkbook wb = new HSSFWorkbook()) {
LOGGER.info("进入导出模板方法");
//创建HSSFSheet对象
HSSFSheet sheet = wb.createSheet("导出模板");
//在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
HSSFRow row1 = sheet.createRow(0);
//创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
HSSFCell cell = row1.createCell(0);
//合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));
//向合并单元格中输入字段
cell.setCellValue("客户支付流程跟踪导入和统计");
//在sheet里创建第二行(下标为1)
HSSFRow row2 = sheet.createRow(1);
//创建单元格并设置单元格内容
row2.createCell(0).setCellValue("渠道类型");
row2.createCell(1).setCellValue("操作步骤");
row2.createCell(2).setCellValue("操作总次数");
row2.createCell(3).setCellValue("备用字段1");
row2.createCell(4).setCellValue("备用字段2");
row2.createCell(5).setCellValue("备用字段3");
//输出Excel文件
OutputStream output = response.getOutputStream();
response.reset();
//filename=后面跟文件名
response.setHeader("Content-disposition", "attachment; filename=template.xlsx");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
LOGGER.info("即将输出文件流");
wb.write(output);
output.flush();
output.close();
} catch (Exception e) {
LOGGER.error("导出统计模板生成excel异常", e);
} finally {
RequestContextLocal.bindUserOperation("下载模板", "客户支付流程跟踪导入和统计菜单");
}
LOGGER.info("方法运行结束");
}
实现结果![](https://img-blog.csdnimg.cn/2fc6598b0c774c51a160ed6466f7ecc3.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5ryg54S2Lg==,size_20,color_FFFFFF,t_70,g_se,x_16)
2.导入数据
1.1前端代码为
1.1.1html部分
<a href="javascript:;" class="file" style="font-size: 18px;float: left;margin-left: 20px">导入数据
<input type="file" id="file1" onclick="return yz()" onchange="sc()">
</a>
1.1.2js部分
function sc() {
var file = document.getElementById("file1").value
if (file == '') {
alert("请选择excel,再导入");
} else if (file.lastIndexOf(".xlsx") < 0 ||file.lastIndexOf(".xls") < 0) {
alert("只能导入Excel文件");
} else {
var formData = new FormData();
formData.append("file",$("#file1")[0].files[0]);
$.ajax({
url:'${ctx}/excelReportManager/excelReport/upload',
type:'POST',
async:false,
dataType:'json',
data:formData ,
// 告诉jQuery不要去处理发送的数据
processData : false,
// 告诉jQuery不要去设置Content-Type请求头
contentType : false,
beforeSend:function(){
console.log("正在进行,请稍候");
},
success : function(responseStr) {
}
})
}
}
1.2后端代码为(引包为导入的引包)
/**
* 客户支付流程跟踪导入和统计
*
* @param file
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("upload")
@ResponseBody
public void upload(@RequestParam("file") MultipartFile file, HttpServletRequest request, HttpServletResponse response) throws IOException {
JSONObject json = new JSONObject();
//获取输入流
InputStream is = file.getInputStream();
LOGGER.info("获取输入流成功即将转换为excel");
Workbook workbook = new HSSFWorkbook(is);
//获取第一张工作表
Sheet sheet = workbook.getSheetAt(0);
//从第二行开始获取 getLastRowNum
LOGGER.info("获取到的页面总行数为{}", sheet.getLastRowNum());
//循环每一行(因前两行为固定代码,所以从第三行开始(从下标0开始第三个为2))
for (int i = 2; i < sheet.getLastRowNum(); i++) {
Row sheetRow = sheet.getRow(i);
SpPayProcessTrackingBankRecord spPayProcessTrackingBankRecord = new SpPayProcessTrackingBankRecord();
//循环获取每一列
try {
//获取i行第一列 Cell.CELL_TYPE_STRING为poi提供的枚举,该字段的类型 以下两行代码需组合调用
sheetRow.getCell(0).setCellType(Cell.CELL_TYPE_STRING);
String appTp = sheetRow.getCell(0).getStringCellValue();
//获取i行第二列
sheetRow.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
String name = (sheetRow.getCell(1).getStringCellValue());
//获取i行第三列
sheetRow.getCell(2).setCellType(Cell.CELL_TYPE_STRING);
String id = (sheetRow.getCell(2).getStringCellValue());
} catch (NullPointerException e) {
LOGGER.error((i - 1) + "行数据不合法,请重新导入,异常信息为", e);
//如果单元格为空会爆出空指针
json.put("hint", (i - 1) + "行数据不合法,请重新导入");
response.getWriter().print(json.toString());
}
}
workbook.close();
//导出成功转为list后的增加操作
LOGGER.info("执行添加操作成功,条数为{}", count);
//进行下一步操作
json.put("hint", "共有" + count + "条数据导入成功");
response.getWriter().print(json.toString());
}