项目中有要将Excel表格中数据导入数据库的要求,然后在网上找了找,找到一篇文章就试了试,因为我不止需要将Excel数据直接导入就行,还需要根据表格里的数据在进行一次查询,将更多数据重新存到数据库(晕,其实不复杂,就是多几行代码)。然后稍微改了一下,还是可以的(前台使用了layui)。转载文章java进行excel数据导入数据库。感觉以后可能还会用到,所以就保存一下。
直接上代码,主要列举关键代码
前端代码如下
html
<button type="button" class="layui-btn" id="test3"><i class="layui-icon"></i>导入Excel</button>
js
layui.use(['upload'], function() {
var layer = layui.layer
, $ = layui.jquery
, upload = layui.upload;
upload.render({
elem: '#test3'
, url: Hussar.ctxPath + '/source/upload'
, accept: 'file' //普通文件
, exts: 'xls|xlsx' //允许上传的文件后缀
, done: function (res) {//返回值接收
if (res == true) {
layer.msg('导入成功,请稍后!', {}, function () {
location.reload();
});
} else {
layer.msg('导入失败,请重试!', {}, function () {
location.reload();
});
}
}
});
})
后台代码:
controller层
/**
* 导入Excel数据
*/
@RequestMapping(value="upload",method= RequestMethod.POST)
@ResponseBody
public boolean upload(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws Exception {
//如果文件不为空,写入上传路径
if (!file.isEmpty()) {
return sourceService.ImportEexlService(file);
} else {
return false;
}
}
sourceService这个不用多说了,就是service层定义的方法。
Service层
private SourceMapper sourceMapper;
public boolean ImportEexlService(MultipartFile file) {
try {
//解析xlsx后缀的excel文件 xls后缀的暂时没写
readXlsx(file.getInputStream());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
public void readXlsx(InputStream inputStream) throws IOException {
ShiroUser shiroUser = ShiroKit.getUser();
String enterId = shiroUser.getId();
String enterUser = shiroUser.getName();
String unitId = shiroUser.getDeptId();
String unit = shiroUser.getDeptName();
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String editdate = sdf.format(date);
Calendar now = Calendar.getInstance();
String year = now.get(Calendar.YEAR) + "";
//XSSFWorkbook 需要一个inputStream流 在上面我们已经把file转成了流所以现在直接用就可以了
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
String idcard = null;
String testsource = null;
String userid = null;
String username = null;
String workunit = null;
String enterunit = null;
//获取第一个Sheet 遍历获取每一行数据
for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
//从第一行开始遍历
//取每一行每一列的值
XSSFRow xssfRow = xssfSheet.getRow(rowNum);
//取第一行第一个格的值
idcard = getValue(xssfRow.getCell(0));
testsource = getValue(xssfRow.getCell(1));
List<Map<String, String>> list = sourceMapper.selectList(idcard);
userid = list.get(0).get("USERID");
username = list.get(0).get("USERNAME");
workunit = list.get(0).get("WORKUNIT");
// ck_rank = getValue(xssfRow.getCell(2));
//把获取到的数据直接插入到数据库
sourceMapper.importEexlDao(Common.UUID(), userid, year, idcard, username, workunit, testsource, enterId, enterUser, unitId, unit);
}
}
private static String getValue (XSSFCell xssfCell){
if(xssfCell == null){
return String.valueOf("0");
}
if (xssfCell.getCellType() == xssfCell.CELL_TYPE_BOOLEAN) {
return String.valueOf(xssfCell.getBooleanCellValue());
} else if (xssfCell.getCellType() == xssfCell.CELL_TYPE_NUMERIC) {
return String.valueOf(xssfCell.getNumericCellValue());
} else {
return String.valueOf(xssfCell.getStringCellValue());
}
}
所有业务逻辑基本都在readXlsx()这个方法内实现了,所以大家改的地方也就只是这一部分。
getValue()方法是判断表格内的值,如果表格内没有值的话 传过来的xssfCell是null。可根据实际情况判断为null时返回。正常情况下只需要修改判断是否为空 返回什么消息即可。
最后Dao层sql插入即可。