java实现导入动态excel

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java实现导入动态excel相关的知识,希望对你有一定的参考价值。

问题是这样的:我要用java实现上传导入excel文件,但是每个excel文件的列是不固定的,如何才能动态的根据excel文件获取数据。
比如说:excel文件当中有5列是固定的,剩下的不同的excel文件是不一样的,有的可能在5列之外又有3列,有的可能就没有了。
求给力答案。。。解决靠谱可追加,谢谢了~~~

如果只是列字段的话的 可以采用动态判断第一列 是否有内容。如果有内容就继续读,直到读到最后一列为止。

错了 是第一行第一列。
参考技术A 可把第一行最为标识行,表示该列数据的含义,如“name”表示该列为名字,因此可循环读取第一行每一列的标识,直至为空(要求没有空列) 参考技术B 使用循环遍历每个excel文件的单元格cell 参考技术C 使用poi,遍历每个excel文件。别把宽度限定死就可以了。 参考技术D 使用POI类

java实现导入Excel数据入库

java实现导入Excel数据入库

将Excel表格数据通过java导入到mysql数据库,废话不多说,直接上代码

如果导入失败,需要检查文件,另存为 97-2003版本的.xls

数据导入之后可以直接做其他业务操作

如果有错误的地方请指出,便于及时改正

package com.yihu.jw.base.endpoint.patient;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.yihu.jw.entity.base.patient.BasePatientDO;
import com.yihu.jw.patient.dao.BasePatientDao;
import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.utils.security.MD5;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiParam;
import jxl.Sheet;
import jxl.Workbook;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.*;

/***
 * @ClassName: ImportExcelDemo
 * @Description:
 * @Auther:
 * @Date: 2021/9/14 13:45
 */
@RestController
@RequestMapping(value = BaseRequestMapping.BasePatient.PREFIX)
@Api(value = "数据导入", description = "数据导入", tags = {"数据导入"})
public class ImportExcelDemo extends EnvelopRestEndpoint {

    @Autowired
    private BasePatientDao basePatientDao;

    /**
     * 将表格数据导入到 base_patient 表
     *  如果添加失败,将Excel改成97-2003 xls版本
     * @param request
     * @param file
     * @return
     */
    @RequestMapping(value = "/importPatientFromExcel", produces = "application/json;charset=UTF-8",method = RequestMethod.POST)
    @ResponseBody
    public ObjEnvelop importPatientFromExcel(HttpServletRequest request, @ApiParam(value = "文件", required = true)
    @RequestParam(value = "file", required = true) MultipartFile file) {
        List errorLs = new ArrayList<>();
        List correctLs = new ArrayList<>();
        List idcardList = new ArrayList<>();
        Map<String, String> errorMsgMap = new HashMap<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<String> deviceCodes = new ArrayList<>();
        try {
            request.setCharacterEncoding("UTF-8");
            InputStream inputStream = file.getInputStream();
            Workbook rwb = Workbook.getWorkbook(inputStream);
            Sheet[] sheets = rwb.getSheets();
            int rows;
            int row;
            String name=null;//用户姓名
            String sex; //性别
            String age; //年龄
            String idcard;  //身份证号
            String mobile;  //联系方式
            String residentialArea; //居住小区
            String address; //居住地址
            String signTeam; //签约团队
            String label; //能力类型
            Sheet sheet = sheets[0];    //第一张表
            rows = sheet.getRows();
            for (int j = 1; j < rows; j++) {
                if (sheet.getRow(j).length == 0) {
                    continue;
                }
                BasePatientDO basePatientVO = new BasePatientDO();
                JSONObject infoMap = new JSONObject();
                row = j;
                name = sheet.getCell(0, row).getContents().trim();    //0 用户姓名
                sex = sheet.getCell(1, row).getContents().trim();  //1 性别
                age = sheet.getCell(2, row).getContents().trim();   //2 年龄
                idcard = sheet.getCell(3, row).getContents().trim(); //3 身份证号
                mobile = sheet.getCell(4, row).getContents().trim();  //4 联系方式
                residentialArea = sheet.getCell(5, row).getContents().trim(); //5 居住小区
                address = sheet.getCell(6, row).getContents().trim(); //6 居住地址
                signTeam = sheet.getCell(7, row).getContents().trim();; //签约团队
                label = sheet.getCell(8, row).getContents().trim();; //能力类型
                if (StringUtils.isBlank(idcard)){
                    continue;
                }
                if (StringUtils.isBlank(name)){
                    errorMsgMap.put(idcard,"姓名不能为空");
                    continue;
                }
                if (StringUtils.isBlank(sex)){
                    sex = "3";
                } else {
                    if (sex.equals("男")) {
                        sex = "1";
                    } else {
                        sex = "2";
                    }
                }
                if (StringUtils.isBlank(signTeam)){
                    errorMsgMap.put(idcard,"签约团队不能为空");
                    continue;
                }

                if (StringUtils.isBlank(label)){
                    errorMsgMap.put(idcard,"能力类型不能为空");
                    continue;
                }
                basePatientVO.setAddress(address);
                basePatientVO.setDel("1");
                basePatientVO.setIdcard(idcard);
                basePatientVO.setSex(new Integer(sex));
                basePatientVO.setName(name);
                basePatientVO.setMobile(mobile);
                basePatientVO.setArchiveStatus(3);
                basePatientVO.setArchiveType(1); //默认添加老人
                String pw = idcard.substring(idcard.length()-6);
                String salt = UUID.randomUUID().toString().substring(0,5);
                basePatientVO.setPassword(MD5.md5Hex(pw + "{" + salt + "}"));
                basePatientVO.setSalt(salt);
                basePatientVO.setId(getUID());
                infoMap.put("idcard",idcard);
                infoMap.put("signTeam",signTeam);
                infoMap.put("label",label);
                infoMap.put("patient",getUID());
                correctLs.add(basePatientVO);
                idcardList.add(infoMap);
            }

            basePatientDao.save(correctLs);

            //包装导入结果(导入成功数量、错误对象集合)
            Map<String, Object> map = new HashMap<>();
            map.put("successNum", correctLs.size());
            map.put("failedNum", rows-1 - correctLs.size() );
            map.put("errorData", JSON.toJSONString(errorMsgMap, SerializerFeature.WriteMapNullValue));
            System.out.println(map);
            return ObjEnvelop.getSuccess("获取成功",map);
        } catch (Exception e) {
            e.printStackTrace();
            return failedObjEnvelopException(e);
        }
    }



}

实体类代码就没必要上代码了,一张图

测试方式:postman进行测试

以上是关于java实现导入动态excel的主要内容,如果未能解决你的问题,请参考以下文章

java:JSP(JSPWeb.xml的配置,动态和静态导入JSP文件,重定项和请求转发,使用JSP实现数据库的增删改查实例)

java的poi技术写Excel的Sheet

使用CGLIB实现动态代理

spring boot 整合 quartz 集群环境 实现 动态定时任务配置原

Java实现pdf和Excel的生成及数据动态插入导出

java 能否实现桌面下雪花的效果?使用swing?