文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java如何将Excel数据导入数据库

2023-06-29 13:39

关注

这篇文章给大家分享的是有关Java如何将Excel数据导入数据库的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、根据业务需求设计数据库表

Java如何将Excel数据导入数据库

2、根据数据库表设计一个Excel模板

模板的每列属性必须与表字段一一对应

Java如何将Excel数据导入数据库

3、环境准备

我这里项目环境是基于SpringBoot单体式架构,持久层用的公司框架,内置了基于MyBatis-Plus的各种单表操作的方法。

导入依赖

        <!--使用POI读取文件-->        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi</artifactId>            <version>3.17</version>        </dependency>        <dependency>            <groupId>org.apache.poi</groupId>            <artifactId>poi-ooxml</artifactId>            <version>3.17</version>        </dependency>

4、通过插件生成表对应的实体类

@Data@ApiModel(value="值班值守表,对应表tb_zbzs",description="适用于新增和修改页面传参")public class TbZbzs extends ProBaseEntity<TbZbzs> {    private static final long serialVersionUID = 1L;    @ApiModelProperty(value="id")    private String id;// id    @ApiModelProperty(value="部门")    private String bm;// 部门    @ApiModelProperty(value="值班上报")    private String zbsb;// 值班上报    @ApiModelProperty(value="值班人员")    private String zbry;// 值班人员    @ApiModelProperty(value="上报时间")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private java.util.Date sbsj;// 上报时间    @ApiModelProperty(value="结束时间")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private java.util.Date jssj;// 结束时间    @ApiModelProperty(value="联系方式")    private String lxfs;// 联系方式    @ApiModelProperty(value="状态")    private String zt;// 状态        @ApiModelProperty(value="逻辑删除")    private String delFlag;        @ApiModelProperty(value="创建时间")    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")    private Date createDate;}

5、自定义编写工具类

这里提供的是一个基础模板,根据业务的需求可以增加转换条件

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 java.io.IOException;import java.io.InputStream;import java.text.DecimalFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;public class ImportExcelUtil {    private final static String excel2003L =".xls";    //2003- 版本的excel    private final static String excel2007U =".xlsx";   //2007+ 版本的excel        public static List<List<Object>> getListByExcel(InputStream in, String fileName) throws Exception {        List<List<Object>> list = null;        //创建Excel工作薄        Workbook work = ImportExcelUtil.getWorkbook(in,fileName);        if(null == work){            throw new Exception("创建Excel工作薄为空!");        }        Sheet sheet = null;        Row row = null;        Cell cell = null;        list = new ArrayList<List<Object>>();        //遍历Excel中所有的sheet        for (int i = 0; i < work.getNumberOfSheets(); i++) {            sheet = work.getSheetAt(i);            if(sheet==null){continue;}            //遍历当前sheet中的所有行            for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum()+1; j++) {                row = sheet.getRow(j);                if(row==null||row.getFirstCellNum()==j){continue;}                //遍历所有的列                List<Object> li = new ArrayList<Object>();                for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {                    cell = row.getCell(y);                    li.add(ImportExcelUtil.getCellValue(cell));                }                list.add(li);            }        }//        work.close();        return list;    }        public static Workbook getWorkbook(InputStream inStr, String fileName) throws Exception{        Workbook wb = null;        String fileType = fileName.substring(fileName.lastIndexOf("."));        if(excel2003L.equals(fileType)){            wb = new HSSFWorkbook(inStr);  //2003-        }else if(excel2007U.equals(fileType)){            wb = new XSSFWorkbook(inStr);  //2007+        }else{            throw new Exception("解析的文件格式有误!");        }        return wb;    }        public  static Object getCellValue(Cell cell){        Object value = null;        DecimalFormat df = new DecimalFormat("0");  //格式化number String字符        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//        SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");  //日期格式化//        DecimalFormat df2 = new DecimalFormat("0.00");  //格式化数字        if (cell!=null){            switch (cell.getCellType()) {                case Cell.CELL_TYPE_STRING:                    value = cell.getRichStringCellValue().getString();                    break;                case Cell.CELL_TYPE_NUMERIC:                    if("General".equals(cell.getCellStyle().getDataFormatString())){                        value = df.format(cell.getNumericCellValue());                    }                    else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){                        value = sdf.format(cell.getDateCellValue());                    }                    else{                        value = sdf.format(cell.getDateCellValue());                    }                    break;                case Cell.CELL_TYPE_BOOLEAN:                    value = cell.getBooleanCellValue();                    break;                case Cell.CELL_TYPE_BLANK:                    value = "";                    break;                default:                    break;            }        }        return value;    }}

6、编写具体业务逻辑Service

主要思想:通过工具类将Excel文件解析成Object泛型的集合,再将集合循环遍历,在遍历中,将每行数据一次填入对象中,再每次循环中,将赋值后的对象存入一个list集合,最后统一将集合执行批量上传的方法,存入数据库。

public Map<String,Object> importTprkxx(MultipartFile file){        Map<String,Object> resultMap = new HashMap<>();        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");        List<TbZbzs> tbZbzsList = new ArrayList<>();        try {            //获取数据            List<List<Object>> olist = ImportExcelUtil.getListByExcel(file.getInputStream(), file.getOriginalFilename());            resultMap.put("导入成功",200);            //封装数据            for (int i = 0; i < olist.size(); i++) {                List<Object> list = olist.get(i);                if (list.get(0) == "" || ("序号").equals(list.get(0))) {                    continue;                }                TbZbzs tbZbzs = new TbZbzs();                tbZbzs.setId(UUID.randomUUID().toString().replace("-", "").substring(0, 20));                //根据下标获取每一行的每一条数据                if (String.valueOf(list.get(0))==null) {                    resultMap.put("state", "部门不能为空");                    continue;                }                tbZbzs.setBm(String.valueOf(list.get(0)));                if (String.valueOf(list.get(1))==null) {                    resultMap.put("state", "值班上报不能为空");                    continue;                }                tbZbzs.setZbsb(String.valueOf(list.get(1)));                if (String.valueOf(list.get(2))==null) {                    resultMap.put("state", "值班人员不能为空");                    continue;                }                tbZbzs.setZbry(String.valueOf(list.get(2)));                if (String.valueOf(list.get(3))==null) {                    resultMap.put("state", "导入失败,上报时间不能为空");                    continue;                }                String dateStr3 = String.valueOf(list.get(3));                Date date3 = simpleDateFormat.parse(dateStr3);                tbZbzs.setSbsj(date3);                if (String.valueOf(list.get(4))==null) {                    resultMap.put("state", "导入失败,结束时间不能为空");                    continue;                }                String dateStr4 = String.valueOf(list.get(4));                Date date4 = simpleDateFormat.parse(dateStr4);                tbZbzs.setJssj(date4);                if (String.valueOf(list.get(5))==null) {                    resultMap.put("state", "联系方式不能为空");                    continue;                }                tbZbzs.setLxfs(String.valueOf(list.get(5)));                if (String.valueOf(list.get(6))==null) {                    resultMap.put("state", "状态不能为空");                    continue;                }                tbZbzs.setZt(String.valueOf(list.get(6)));                if (String.valueOf(list.get(7))==null) {                    resultMap.put("state", "逻辑删除不能为空");                    continue;                }                tbZbzs.setDelFlag(String.valueOf(list.get(7)));                if (String.valueOf(list.get(8))==null) {                    resultMap.put("state", "导入失败,创建时间不能为空");                    continue;                }                String dateStr8 = String.valueOf(list.get(8));                Date date8 = simpleDateFormat.parse(dateStr8);                tbZbzs.setCreateDate(date8);                tbZbzsList.add(tbZbzs);            }            int i = tbZbzsDao.insertTbZbzsList(tbZbzsList);            if (i != 0) {                resultMap.put("state", "导入成功");            }else {                resultMap.put("state", "导入失败");            }        } catch (Exception e) {            e.printStackTrace();            resultMap.put("state", "导入失败");        }        return resultMap;    }

7、在dao层对应的xml文件中,编写批量上传的方法

<insert id="insertTbZbzsList"  parameterType="java.util.List">        insert into tb_zbzs (        id,        bm,        zbsb,        zbry,        sbsj,        jssj,        lxfs,        zt,        del_flag,        create_date        ) VALUES        <foreach collection="list" item="item" separator=",">            (            #{item.id},            #{item.bm},            #{item.zbsb},            #{item.zbry},            #{item.sbsj},            #{item.jssj},            #{item.lxfs},            #{item.zt},            #{item.delFlag},            #{item.createDate}            )        </foreach>        </insert>

8、Controller实现业务的控制

        @ApiOperation(value="导入值班值守表Excel",notes="返回导入情况接口",response = TbZbzs.class)    @PostMapping(value = "/excelProTbZbzs")    public String excelProTbZbzs(@RequestParam("file")  MultipartFile file){        try {            return buildResultStr(service.importTprkxx(file).get("state").equals("导入成功") ? buildSuccessResultData() : buildErrorResultData(service.importTprkxx(file).get("state").toString()));        }catch (RuntimeException e){            logError(log, e);            return buildResultStr(buildErrorResultData(e));        }    }

9、通过Swagger测试接口

Java如何将Excel数据导入数据库

10、在数据和控制台中查看导入效果

Java如何将Excel数据导入数据库

感谢各位的阅读!关于“Java如何将Excel数据导入数据库”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯