关于Excel文件导入详解
b端产品的价值是提高企业的效率,目的是利用系统功能去解放人。虽然批量导入在b端产品功能中是一个很小的功能点,但是提高效率在这个功能上却始终是基本准绳。从模板下载、上传操作、查看与修改等功能的设计,都需要思考如何提高使用人员的工作效率,这篇文章就以最简洁的方式,只需复制粘贴,即可完成Excle文件的导入。
前台导入按钮
<button type="button" class="layui-btn" id="upload">
<i class="layui-icon"></i>员工导入</button>
前台JS
<script>
layui.use('upload', function(){
var $ = layui.jquery
,upload = layui.upload;
//指定允许上传的文件类型
upload.render({
elem: '#upload'
,url: '/upload/uploadExcel' //改成您自己的上传接口
,accept: 'file' //普通文件
,done: function(res){
layer.msg('上传成功');
console.log(res);
}
});
});
</script>
后台类中需要导的包(直接复制进去,让他自动导不一定能导对)
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.text.ParseException;
后台方法(最后的返回结果根据你具体使用的方法返回,不修改的话即使出错也会显示上传成功)
/**
* 解析上传人员名单excel
*
* @param file
* @return
* @throws IOException
*/
@RequestMapping("/uploadExcel")
@ResponseBody
public Object uploadExcel(MultipartFile file) throws IOException, ParseException {
//获得文件名
String fileName = file.getOriginalFilename();
//判断文件是否是excel文件
if (!fileName.endsWith("xls") && !fileName.endsWith("xlsx")) {
logger.error(fileName + "不是excel文件");
return false;
}
//获得Workbook工作薄对象
String fileName1 = file.getOriginalFilename();
//创建Workbook工作薄对象,表示整个excel
Workbook workbook = null;
try {
//获取excel文件的io流
InputStream is = file.getInputStream();
//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
if (fileName1.endsWith("xls")) {
//2003
workbook = new HSSFWorkbook(is);
} else if (fileName1.endsWith("xlsx")) {
//2007 及2007以上
workbook = new XSSFWorkbook(is);
}
} catch (IOException e) {
logger.error(e.getMessage());
}
StringBuffer stringBuffer = new StringBuffer();
if (workbook != null) {
for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
//获得当前sheet工作表
Sheet sheet = workbook.getSheetAt(sheetNum);
if (sheet == null) {
continue;
}
//获得当前sheet的开始行
int firstRowNum = sheet.getFirstRowNum();
//获得当前sheet的结束行
int lastRowNum = sheet.getLastRowNum();
//循环除了第一行的所有行
for (int rowNum = firstRowNum + 1; rowNum <= lastRowNum; rowNum++) {
//获得当前行
Row row = sheet.getRow(rowNum);
if (row == null) {
continue;
}
//获得当前行的开始列
int firstCellNum = row.getFirstCellNum();
//获得当前行的列数
int lastCellNum = row.getLastCellNum();
//循环当前行
for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
Cell cell = row.getCell(cellNum);
if (cell != null) {
stringBuffer.append(cell.toString().toString());
switch (cellNum) {
//第rowNum行的第一列
case 0:
cell.toString();
break;
//第rowNum行的第一列
case 1:
cell.toString();
break;
//第rowNum行的第一列
case 2:
cell.toString();
break;
}
}
}
}
}
}
//需要根据实际的返回结果return
return true;
}
这个后台可以精确的获取到第X行第X列的数据,当我们可以获取到每个格子的数据时,我们也就可以对这些数据进行所需要的操作。