excel导入功能总结

1:前期依赖AI生成方案,生成的流程图相对于之前自己画的更加美观,填充的内容更全面;布局更美观;这是以后自己画图的时候需要改进的;
2:依赖AI生成文档,但是会造成token消耗超额,浪费了不少时间;
3.1:需求理解有问题,前期提的方案队列,其实是不需要的;
3.2:前期对于人天的评估过于乐观了,解析excel表格只评估了0.5人天,下载excel表格也评估了0.5人天;实际开发过程中发现复制的部件/文档解析以及导入的功能并不可用;
3.3:最大的问题在于对于数据结构的误解导致了需求人天评估的不准确;误以为的数据结构是行是一样的,每一行是一个对象,其实行是动态的,每一列也是动态的;页面的数据是类型-属性-各个工具的配置信息,而不是类型-属性-属性值,这一点是最大的区别以及整个开发的难点,相当于数据要以工具维度分成不同的sheet,同时行是类型,列是类型的属性,cell是该类型对应的属性配置的工具的值;
3.4:我们获取类型->属性->工具配置;要换换成工具sheet页,行是不同的类型,列是属性,cell是值;
如何实现呢?
先以工具维度分组,再以类型分组,最后的值就是该类型在此工具下不同的属性配置的值;该值的维度是三维的,
下面是借助AI生成的伪代码;

// ========== 核心分组逻辑 ==========
public class ExportCADGrouper {

    /**
     * 按 tool 分组,相同 tool + type 的记录合并为一个 GroupedCAD
     *
     * @param exportCADList 原始列表
     * @return Map<tool, List<GroupedCAD>>
     */
    public static Map<String, List<GroupedCAD>> groupByTool(List<ExportCAD> exportCADList) {
        if (exportCADList == null || exportCADList.isEmpty()) {
            return Collections.emptyMap();
        }

        // 中间结构:tool -> (type -> GroupedCAD)
        // 用 LinkedHashMap 保持插入顺序
        Map<String, Map<String, GroupedCAD>> intermediateMap = new LinkedHashMap<>();

        for (ExportCAD item : exportCADList) {
            String tool = item.getTool();
            String type = item.getType();

            // 获取或创建该 tool 下的 type -> GroupedCAD 映射
            intermediateMap.computeIfAbsent(tool, k -> new LinkedHashMap<>());
            Map<String, GroupedCAD> typeMap = intermediateMap.get(tool);

            // 获取或创建该 type 对应的 GroupedCAD
            typeMap.computeIfAbsent(type, k -> {
                GroupedCAD grouped = new GroupedCAD();
                grouped.setType(type);
                grouped.setTool(tool);
                grouped.setName(item.getName());
                grouped.setNumber(item.getNumber());
                return grouped;
            });

            // 将动态字段追加到已有对象
            GroupedCAD grouped = typeMap.get(type);
            if (item.getPlmAttrCode() != null || item.getPlmAttrName() != null) {
                DynamicAttr attr = new DynamicAttr(
                        item.getPlmAttrName(),
                        item.getPlmAttrCode(),
                        item.getCadValue()
                );
                grouped.getDynamicAttrs().add(attr);
            }
        }

        // 将中间结构转换为最终结果:tool -> List<GroupedCAD>
        Map<String, List<GroupedCAD>> result = new LinkedHashMap<>();
        intermediateMap.forEach((tool, typeMap) ->
                result.put(tool, new ArrayList<>(typeMap.values()))
        );

        return result;
    }
}

当然还有如何把这些数据转换成POI使用的数据也是有技巧的;此功能试错以及开发用了两个人天,刚开始就思考错了,代码也是不断尝试;

下面讲导入的总结
导入功能采用的是easyexcel,所以就需要在表格里面设置字段跟服务器的字段的注解能够匹配上;
大致思路
//1.0 先获取每一个sheet
ExcelReader reader = EasyExcel.read(multipartFile.getInputSream.build).build;
List<ReadSheet> sheetList = reader.excelExecuror().sheetList();
//2.0 再解析每一个sheet转成我们需要的数据
EasyExcel.readSheet(i).headRowNumber(0).registerReadListener(new CusterAnalysisEventListener()).build;
// 2.1 写一个类继承AnalysisEventListener然后实现invoke方法;
需要对easyExcel熟悉;

//3.0 按照系统需要的数据反向组装回去
以类型/属性分组处理数据;

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容