java将Excel中数据导入数据库

项目中有要将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插入即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值