POI问题总结,关于数字级联及多级级联(三级以上)

本文涉及的产品
可视分析地图(DataV-Atlas),3 个项目,100M 存储空间
数据可视化DataV,5个大屏 1个月
简介: POI问题总结,关于数字级联及多级级联(三级以上)

效果图:

image.png

问题1:


在做这一块的时候,碰到的第一个问题就是怎么实现级联,这方面资料很多我就不多赘述了,这里给大家推荐几个我找的觉得比较好的博客


https://www.cnblogs.com/atao/archive/2009/09/24/1572980.html

https://blog.csdn.net/it_zacard/article/details/77033095?utm_source=blogxgwz0

第一个博客对POI的基础覆盖的比较全面,很适合上手,第二篇主要解决三级联动问题2,一般的导出认值学习这两篇博客基本都能


解决,这也不是笔者写这篇文章的主要原因


问题2:


怎么解决数字级联的问题,放到我的业务需求中就是,现在我的分期是以数字开头的,怎么实现级联?


在查了很多文章都没有解决这个问题,最后我通过公式加隐藏列的方法实现了这个需求。


大致思路如下:


创建一个隐藏列,通过公式跟分期所在列关联,如果分期是以数字开头,隐藏隐藏列中的数据为:"_"+分期,否则隐藏列的数据为分 期。

    private void createDataValidationForSpace(Sheet sheet, int subCol) {
        // 主数据所在列对应的字符
        // 隐藏列对应字符
        for (int i = 3; i < EnergyConstant.Excel.MAX_SIZE; i++) {
            // 隐藏列公式:判断主数据所在单元格中的数据是否是以数字开头,以数字开头则隐藏列的数据为"_"+数据,否则为原数据
            // EnergyConstant.Excel.STAGE_LETTER:常量,分期所在列对应字符,在这里就是"E"
            String s1 = "IF(ISNUMBER(VALUE(LEFT(" + EnergyConstant.Excel.STAGE_LETTER + i + ",1)))," +
                    "CONCATENATE(\"_\"," + EnergyConstant.Excel.STAGE_LETTER + i + ")," + EnergyConstant.Excel.STAGE_LETTER + i + ")";
            // 设置公式可读
            sheet.setForceFormulaRecalculation(true);
            // 设置单元格样式为公式
            // EnergyConstant.Excel.HIDE_COL 隐藏列所在序号 我设置的是22 
            // EnergyConstant.Excel.HIDE_COL_LETTER 隐藏列对应字符  22对应字符为"W"
            String s = "CONCATENATE(";
            sheet.createRow(i - 1).createCell(EnergyConstant.Excel.HIDE_COL).setCellFormula(s1);
            s += "$" + EnergyConstant.Excel.HIDE_COL_LETTER + "$" + i;
            for (int j = EnergyConstant.Excel.STAGE_COL + 2; j < subCol; j++) {
                s += ",$" + this.numberToLetter(j) + "$" + i;
            }
            s += ")";
            s = "INDIRECT(" + s + ")";
            DVConstraint energyItemConstraint = DVConstraint.createFormulaListConstraint(s);
            CellRangeAddressList energyItemRegions = new CellRangeAddressList(i - 1, i - 1, subCol - 1, subCol - 1);
            HSSFDataValidation dataValidate1 = new HSSFDataValidation(energyItemRegions, energyItemConstraint);
            sheet.addValidationData(dataValidate1);
        }
    }

这里主要对公式进行说明,在EXCEL中对应公式为:=IF(ISNUMBER(VALUE(LEFT(E3,1))),CONCATENATE("_",E3),E3),POI对这些公式都是支持的,这个公式的作用就是,判断E3单元格zuo'b左边第一个字符是否是数字,如果是的话,当前单元格的数据为("_",E3)拼接的结果,如果不是数字开头,则为E3中的内容。当然也有更简单的做法,就是将隐藏列的公式,设置为CONCATENATE("_",E3),不管是否是数字开头都拼接下划线。但是笔者在业务中使用的是第一种做法。


问题3:


怎么用代码直接实现5级联动?


创建的数据结构如下:

@Component
public class DictDataService {
    @Resource
    private EnergyClassifyService energyClassifyService;
    @Resource
    private EnergyItemService energyItemService;
    @Reference
    private ParkService parkService;
    @Reference
    private ParkUnitService parkUnitService;
    @Reference
    private ParkFloorService parkFloorService;
    @Reference
    private ParkHouseService parkHouseService;
    /**
     * 空间字典
     */
    public static final String STAGE_BUILD = "stage_build";
    public static final String STAGE_BUILD_UNIT = "stage_build_unit";
    public static final String STAGE_BUILD_UNIT_GROUND = "stage_build_unit_ground";
    public static final String STAGE_BUILD_UNIT_GROUND_HOUSE = "stage_build_unit_ground_house";
    /**
     * 空间名称id对应字典
     */
    public static final String SPACE_NAME_ID = "space_name_id";
    /**
     * 主字典
     */
    private Map<String, Object> dict = new HashMap();
    public Object getDict(String condition) {
        return dict.get(condition);
    }
    public void setDict(String parkId) {
        try {
            // 查询到所有的空间的信息
            List<ParkHouse> parkHouses = parkHouseService.listParkHouses(parkHouse);
            // 分期跟楼栋的映射
            Map<String, Set<String>> stage_build = new HashMap<>();
            Map<String, Set<String>> stage_build_unit = new HashMap<>();
            Map<String, Set<String>> stage_build_unit_ground = new HashMap<>();
            Map<String, Set<String>> stage_build_unit_ground_house = new HashMap<>(parkHouses.size());
            for (ParkHouse forExportSpace : parkHouses) {
                String stageName = forExportSpace.getStageName();
                String buildName = forExportSpace.getBuildName();
                String unitNo = forExportSpace.getUnitNo() == null ? "" : forExportSpace.getUnitNo();
                String groundNo = forExportSpace.getGroundNo() == null ? "" : forExportSpace.getGroundNo();
                String houseName = forExportSpace.getHouseName();
                this.createDict(stage_build, stageName, buildName);
                this.createDict(stage_build_unit, stageName + buildName, unitNo);
                this.createDict(stage_build_unit_ground, stageName + buildName + unitNo, groundNo);
                this.createDict(stage_build_unit_ground_house, stageName + buildName + unitNo + groundNo, houseName);
            }
            dict.put(STAGE_BUILD, stage_build);
            dict.put(STAGE_BUILD_UNIT, stage_build_unit);
            dict.put(STAGE_BUILD_UNIT_GROUND, stage_build_unit_ground);
            dict.put(STAGE_BUILD_UNIT_GROUND_HOUSE, stage_build_unit_ground_house);
            dict.put(SPACE_NAME_ID, ids);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 创建从字典
     *
     * @param map
     * @param name
     */
    private void createDict(Map<String, Set<String>> map, String name, String name1) {
        if (map.containsKey(name)) {
            map.get(name).add(name1);
        } else {
            Set<String> names = new HashSet<>();
            names.add(name1);
            map.put(name, names);
        }
    }
}

大概就是将数据转换成:名称空间名称跟显示数据一一对应的结构,方便之后处理

细心的读者在看到解决数字级联后,我还拼了一段公式,实际就是为了实现多级级联,核心就是这部分代码

 String s = "CONCATENATE(";
            sheet.createRow(i - 1).createCell(EnergyConstant.Excel.HIDE_COL).setCellFormula(s1);
            s += "$" + EnergyConstant.Excel.HIDE_COL_LETTER + "$" + i;
            for (int j = EnergyConstant.Excel.STAGE_COL + 2; j < subCol; j++) {
                s += ",$" + this.numberToLetter(j) + "$" + i;
            }
            s += ")";
            s = "INDIRECT(" + s + ")";
            DVConstraint energyItemConstraint = DVConstraint.createFormulaListConstraint(s);
            CellRangeAddressList energyItemRegions = new CellRangeAddressList(i - 1, i - 1, subCol - 1, subCol - 1);
            HSSFDataValidation dataValidate1 = new HSSFDataValidation(energyItemRegions, energyItemConstraint);
            sheet.addValidationData(dataValidate1);

这部分代码做的shi时间就是,通过从列所在的列数,跟第一列所在列数也就是分期所在列相差了几列,判断需要实现几级级联,通过indirect函数跳到指定名称空间。这部分主要麻烦在字符串的拼接。

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
1月前
|
存储 C语言
操作多级(一、二、三级)指针才是我们的该有的姿态~
本文通过一道C语言编程题目,详细解析了多级指针的加减操作,包括二级指针和三级指针的使用,以及如何理解指针的地址计算过程,帮助读者巩固和理解指针概念。
37 0
|
4月前
|
存储 SQL 缓存
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
MySQL设计规约问题之为什么要将大字段、访问频率低的字段拆分到单独的表中存储
|
5月前
|
JavaScript 前端开发
buildadmin实现多级关联下拉效果
buildadmin实现多级关联下拉效果
31 0
|
6月前
|
Windows
(文件[夹]批量分类整理_多级匹配_交叉匹配_路径结构交叉调整)文件[夹]批量复制
该文介绍了如何使用特定工具进行批量文件整理。首先,需要从提供的百度网盘和蓝奏云链接下载工具,并用提取码解锁。接着,打开工具的批量复制功能,将待整理的图片文件拖入“来源路径”,目标文件夹拖入“终点路径”。通过层级过滤排除不需要的路径。然后,利用多级匹配设置,提取文件名和路径中的关键词,如“动物”、“小型”、“食草”等,设置复制后的文件重命名规则。最后,执行批量复制,完成文件的智能分类与命名。整个过程旨在根据文件的原始分类信息,自动将其移动到相应的新目录结构下。
带有上下级关系的数据改为树形菜单的数据
带有上下级关系的数据改为树形菜单的数据
51 0
|
6月前
|
前端开发
使用elementUI构建复杂表格,合并行或列,多级表头等
前端开发过程中常常会遇到各种开发表格的场景,有时候有的表格比较简单有的比较复杂(如下图简单示例所示,有合并项和多级表头),Elementui的el-table控件也可以支持构建复杂的表格,本文将指导你如何快速开发复杂表格~~~
638 0
|
6月前
|
SQL Java 数据库连接
MyBatis练习(2)查询所有的一级分类,同时查询二级分类,以及查询二级分类下的所有图书
MyBatis练习(2)查询所有的一级分类,同时查询二级分类,以及查询二级分类下的所有图书
49 0
|
SQL 存储 缓存
霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种“指南”和“圣经”难以枚举,不一而足,仿佛SQL优化已然是妇孺皆知的理论常识,然后根据多数无知(Pluralistic ignorance)理论,人们印象里觉得多数人会怎么想怎么做,但这种印象往往是不准确的。那SQL优化到底应该怎么做?本次让我们褪去SQL华丽的躯壳,以最浅显,最粗俗,最下里巴人的方式讲解一下SQL优化的前因后果,前世今生。
霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理
|
SQL 数据可视化
tp6中无限极分类里面的获取多级分类数据
tp6中无限极分类里面的获取多级分类数据
tp6中无限极分类里面的获取多级分类数据
Word 技术篇-文档续表设置方法,跨页表格拆分方法
Word 技术篇-文档续表设置方法,跨页表格拆分方法
1375 0
Word 技术篇-文档续表设置方法,跨页表格拆分方法