springboot实现读取excel插入数据库

html:
<input type="file" name="fileName1" id="fileName1"/>
<input type="button" id="sendToUser" value="提交" />
JS
$('#sendToUser').click(function () {
        var $file1 = $("input[name='fileName1']").val();//用户文件内容(文件)
        // 判断文件是否为空
        if ($file1 == "") {
            alert("请选择上传的目标文件! ")
            return false;
        }
        //判断文件类型,我这里根据业务需求判断的是Excel文件
        var fileName1 = $file1.substring($file1.lastIndexOf(".") + 1).toLowerCase();
        if(fileName1 != "xls" && fileName1 !="xlsx"){
            alert("请选择Execl文件!");
            return false;
        }
        //判断文件大小
        var size1 = $("input[name='fileName1']")[0].files[0].size;
        if (size1>104857600) {
            alert("上传文件不能大于100M!");
            return false;
        }

        boo1 = true;
        var type = "file";
        var formData = new FormData();//这里需要实例化一个FormData来进行文件上传
        formData.append(type,$("#fileName1")[0].files[0]);
        //多文件上传在这里继续append
        //eg :
        //formData.append(type,$("#fileName1")[0].files[0]);
        $.ajax({
            type : "post",
            url : zzu+"/roughnes/importByExcel",
            data : formData,
            processData : false,
            contentType : false,
            success : function(data){
                if (data=="error") {
                    alert("文件提交失败!");
                }else{
                    $("input[name='userUrl']").val(data);
                    alert("文件上传成功!");
                }}
        });
    })
Controller
@PostMapping("importByExcel")
    @ResponseBody
    public String importByExcel(@RequestParam("file") MultipartFile file){

        roughnesService.importByExcel(file);
        return "success";
    }
Service
	@Override
    @Transactional(propagation = Propagation.REQUIRED)
    public void importByExcel(MultipartFile file) {
        //获取从excel中读取的数据转成的map集合
        Map<Integer, Map<Object,Object>> map = new HashMap<>();
        try {
            map = OfficeUtils.readExcelContentz(file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        //将class.toString() 返回的字符串转为列表,用作对map中的数据进行验证
        Roughnes roughnes = new Roughnes();
        String classParamStr = roughnes.toString();
        String finalStr = classParamStr.substring(classParamStr.indexOf("(") + 1)
                .replace("=null", "")
                .replace(")","")
                .replace(" ", "");
        System.out.println(finalStr);
        String[] split = finalStr.split(",");
        List<String> paramList = Arrays.asList(split);

        //初始化最终接收数据的列表
        ArrayList<Roughnes> roughnesList = new ArrayList<>();
        //对从excel中读取的数据进行遍历
        map.forEach((key,val) -> {
            //接收数据的实体对象 - 此处表示的是excel中的一行
            Roughnes finalRoughnes = new Roughnes();
            val.forEach((key1,val1) -> {
                //此处才是一行中的每个单元格
                //先对k,v进行字符串转换,方便数据验证和实体类类型转换
                String keyStr = String.valueOf(key1);
                String valStr = String.valueOf(val1);
                if (StringUtils.isEmpty(keyStr) || StringUtils.isEmpty(valStr)) {
                    return;
                }

                //对id的格式进行加工
                if ("id".equals(keyStr)) {
                    valStr = "X-" + valStr;
                }
                //数据验证
                if (paramList.contains(keyStr)) {
                    switch (keyStr) {
                        case "id" :
                            //向实体类set数据
                            finalRoughnes.setId(valStr);
                            break;
                        case "angle":
                            finalRoughnes.setAngle(Double.valueOf(valStr));
                            break;
                            case "p1Roughness" :
                            finalRoughnes.setP1Roughness(Double.valueOf(valStr));
                            break;
                        case "p2Roughness":
                            finalRoughnes.setP2Roughness(Double.valueOf(valStr));
                            break;
                            case "p3Roughness" :
                            finalRoughnes.setP3Roughness(Double.valueOf(valStr));
                            break;
                        case "p4Roughness":
                            finalRoughnes.setP4Roughness(Double.valueOf(valStr));
                            break;
                            case "p5Roughness" :
                            finalRoughnes.setP5Roughness(Double.valueOf(valStr));
                            break;
                        case "averageRoughne":
                            finalRoughnes.setAverageRoughne(Double.valueOf(valStr));
                            break;
                    }

                }
            });
            //将一行数据(一个实体)追加进列表
            roughnesList.add(finalRoughnes);
        });

        //迭代器移除操作
        /*Iterator<Roughnes> iterator = roughnesList.iterator();
        while (iterator.hasNext()) {
            if (iterator.next().getId() == null) {
                iterator.remove();
            }
        }*/

        //将空行移出,数据清洗后进入数据库
        roughnesList.removeIf(roughnes1 -> null == roughnes1.getId());
        roughnesMapper.insertBatch(roughnesList);
    }
Mapper
<insert id="insertBatch" parameterType="list">
    insert into roughnes
    (id, angle, p1_roughness, p2_roughness, p3_roughness, p4_roughness, p5_roughness,average_roughne)
    values
    <foreach collection="list" item="item" separator=",">
      (#{item.id},#{item.angle},#{item.p1Roughness},#{item.p2Roughness},#{item.p3Roughness},#{item.p4Roughness},#{item.p5Roughness},#{item.averageRoughne})
    </foreach>
  </insert>
OfficeUtils
public class OfficeUtils {
    protected static final Logger logger = LoggerFactory.getLogger(OfficeUtils.class);

    public static Map<Integer, Map<Object, Object>> readExcelContentz(MultipartFile file) throws Exception {
        Map<Integer, Map<Object, Object>> content = new HashMap<Integer, Map<Object, Object>>();
        // 上传文件名
        Workbook wb = getWb(file);
        if (wb == null) {
            throw new RuntimeException("文件上传失败");
        }
        Sheet sheet = wb.getSheetAt(0);
        // 得到总行数
        int rowNum = sheet.getLastRowNum();
        Row row = sheet.getRow(0);
        int colNum = row.getPhysicalNumberOfCells();
        // 正文内容应该从第二行开始,第一行为表头的标题
        Row firstRowCell = sheet.getRow(0);
        for (int i = 1; i <= rowNum; i++) {
            row = sheet.getRow(i);
            int j = 0;
            Map<Object, Object> cellValue = new HashMap<Object, Object>();
            while (j < colNum) {
                Object obj = getCellFormatValue(row.getCell(j));

                //excel的表头是下划线命名,方便进行数据清洗,将表头命名改为驼峰命名
                StringBuilder str = new StringBuilder(String.valueOf(firstRowCell.getCell(j)));
                int o = 0;
                StringBuilder replaced = str;
                //递归实现,出现多个_组合也可
                while ((o = str.indexOf("_",o)) != -1) {
                    String replaceStr = String.valueOf(str.charAt(o + 1)).toUpperCase();
                    replaced = str.replace(o+1,o+2,replaceStr);
                    str.replace(o, o+1, "");
                    o+=1;
                }
                cellValue.put(replaced, obj);
                j++;
            }
            content.put(i, cellValue);

        }
        return content;
    }

    //根据Cell类型设置数据
    private static Object getCellFormatValue(Cell cell) {
        Object cellvalue = "";
        if (cell != null) {
            switch (cell.getCellTypeEnum()) {
                case NUMERIC:
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                    break;
                case FORMULA: {
                    cellvalue = cell.getDateCellValue();
                    break;
                }
                case STRING:
                    cellvalue = cell.getRichStringCellValue().getString();
                    break;
                default:
                    cellvalue = "";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }

    private static Workbook getWb(MultipartFile mf) {
        String filepath = mf.getOriginalFilename();
        String ext = filepath.substring(filepath.lastIndexOf("."));
        Workbook wb = null;
        try {
            InputStream is = mf.getInputStream();
            if (".xls".equals(ext)) {
                wb = new HSSFWorkbook(is);
            } else if (".xlsx".equals(ext)) {
                wb = new XSSFWorkbook(is);
            } else {
                wb = null;
            }
        } catch (FileNotFoundException e) {
            logger.error("FileNotFoundException", e);
        } catch (IOException e) {
            logger.error("IOException", e);
        }
        return wb;
    }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现Excel文件上传到数据库有多种方法,以下是一种基于Spring Boot和Vue的实现方式: 1. 前端页面实现 在Vue的前端页面中,添加一个文件上传组件,例如使用element-ui的el-upload组件: ```html <template> <el-upload class="upload-demo" action="/upload" // 文件上传的后端接口 :on-success="handleSuccess" :before-upload="beforeUpload"> <el-button size="small" type="primary">点击上传</el-button> </el-upload> </template> ``` 2. 后端接口实现 在Spring Boot后端实现一个文件上传的接口,例如使用Spring Boot自带的MultipartFile实现: ```java @RestController public class FileUploadController { @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") MultipartFile file) { // 读取Excel文件,解析数据并插入数据库中 ... return "success"; } } ``` 3. 解析Excel插入数据库中 在handleFileUpload方法中,可以使用Apache POI库来解析上传的Excel文件,并将数据插入数据库中。示例代码如下: ```java Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { String name = row.getCell(0).getStringCellValue(); String age = row.getCell(1).getStringCellValue(); // 将数据插入数据库中 ... } ``` 这样就可以实现Excel文件上传到数据库中了。需要注意的是,上传的Excel文件需要符合一定的格式,例如第一列是姓名,第二列是年龄等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值