java一对多导入

1、导入依赖

        <!--导入导出-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.2.0</version>
        </dependency>

 2、创建导入中一对多的一的实体类

建议导入导出的实体类(只有需要导入导出的字段)重新写一个Vo,不要和表的实体类混在一起

注意这里使用的 @Excel 的包,是红框圈出来的,不要导错包,要不然没有用

@Excel(name = "年级")
import cn.afterturn.easypoi.excel.annotation.Excel;

3、创建导入中一对多的多的的实体类

 

 4、将多的这个实体类放入到一的里面

 

5、制作模版
模版制作中每个字段的名称都要和实体类中的字段名称一样,要不然导入不成功

6、Controller

在 importCustomer()方法中

MultipartFile file       第一个参数是文件                                                  

int sheet                  第二个参数是工作簿的索引(从0开始)       

int rows                   第三个参数是表头行数(表头占几行,就是几)  

    /*一对多导入*/
    @PostMapping("/importData")
    @ApiOperation("一对多导入")
    
    public AjaxResult importData(@RequestPart("file") MultipartFile file,String trainId) throws Exception {

        // 调用业务层
        String importCustomer = testService.importCustomer(file, 1, 2,trainId);
        return AjaxResult.success(importCustomer);

    }

7、service

    /*一对多导入*/
    String importCustomer(MultipartFile file, int sheet, int rows,String trainId);

8、impl


    @Transactional
    @Override
    public String importCustomer(MultipartFile file, int sheet, int rows,String trainId) {
        TbExaminationTitle tbExaminationTitle = new TbExaminationTitle();
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        // 设置sheet 跟行头(也就是所谓的字段展现在哪行)
        ImportParams importParams = new ImportParams();
        //表头行数,默认1
        importParams.setHeadRows(rows);
//        importParams.setTitleRows(sheet);
        //开始读取的sheet位置,默认为0
        importParams.setStartSheetIndex(sheet);
        importParams.setNeedVerify(true);
        try {

            // TODO 获取导入的全部数据
            //获取数据时使用  import cn.afterturn.easypoi.excel.annotation.Excel; 注解 @Excel(name = "获取值")
            List<Vo> importVoList =
                    ExcelImportUtil.importExcel(file.getInputStream(), Vo.class, importParams);
			//判断导入数据是否为空,可以找一个必填字段做为校验
            if (StringUtils.isNull(importVoList.get(0).getTitle())){
                failureNum++;
                failureMsg.append("导入数据不能为空");
            }

            // 判断主表是否有数据导入,如果有进行获取添加到主表数据库
            for (Vo  importParam:importVoList)  {
            // TODO 循环的获取到主表数据,添加到数据库之中
            //复制一下
                    tbTitle = BeanUtil.copyProperties(importParam, TbTitle.class);
                	//可以添加一些默认数据

                    int i = Mapper.insert(tbnTitle);

                    // TODO 判断主表是否插入成功  添加试题内容表
                    if (i > 0) {
                        List<Vo> List = importParam.getList();
                        //做自己想要进行的操作

                    }
                    successNum++;
                    successMsg.append( successNum + "、"+importParam.getTitle()+" 导入成功  ");

                }else {
                    failureNum++;

                    failureMsg.append( failureNum + "导入失败,请修改完成后重新导入");
                }
            }


            if (failureNum > 0) {
                failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
                throw new ServiceException(failureMsg.toString());
            } else {
                successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
            }


            //如果主表没有数据添加,那样直接结束,
        } catch (IOException e) {
            failureNum++;
            String msg = failureNum + "、导入失败:";
            failureMsg.append(msg + e.getMessage());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return successMsg.toString();
    }

到这里一对多的导入就完成了,代码仅供参考,有些地方不太规范,需要自己去完善一下

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于EasyExcel库来说,一对多导入可以通过使用嵌套对象的方式实现。下面是一个示例代码,展示了如何使用EasyExcel进行一对多导入: ```java // 创建一个嵌套对象,用于表示一对多的数据结构 public class ParentData { private String parentField; private List<ChildData> childList; // 省略getter和setter方法 } public class ChildData { private String childField; // 省略getter和setter方法 } // 在导入时,将Excel中的数据映射为嵌套对象 public void importData(String filePath) { try { List<ParentData> parentList = EasyExcel.read(filePath).head(ParentData.class).sheet().doReadSync(); // 遍历父对象列表 for (ParentData parentData : parentList) { // 处理父数据 System.out.println("Parent Field: " + parentData.getParentField()); // 遍历子对象列表 List<ChildData> childList = parentData.getChildList(); for (ChildData childData : childList) { // 处理子数据 System.out.println("Child Field: " + childData.getChildField()); } } System.out.println("Import completed."); } catch (Exception e) { e.printStackTrace(); } } ``` 在上述示例中,我们定义了`ParentData`类和`ChildData`类来表示一对多的数据结构。在导入时,我们使用EasyExcel的`read()`方法读取Excel文件,并通过`head()`方法指定父对象的类。然后,通过`doReadSync()`方法将Excel数据映射为`ParentData`对象的列表。接下来,我们遍历父对象列表,并处理每个父对象的数据和对应的子对象列表。 请注意,上述示例仅提供了一种使用EasyExcel进行一对多导入的方式,具体实现可能会根据你的需求和数据结构进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值