Giter Site home page Giter Site logo

Comments (8)

1015770492 avatar 1015770492 commented on September 24, 2024

en,是一个不错的场景。
你说的动态表头意思是标题上的数字会变对吧,从标题来看

image

如果你用的版本是 1.3.21
那么现在的做法也有很多种。
因为你要用javabean 去接这些单元格内容,所以不考虑后面还有 2023年...长度还不确定的情况,如果有这种情况,后续也可以做,这种情况就不能用javabean去接数据了。


基于版本1.3.21 可以有2种已经实现的做法。
实现一:
一种是固定index,给每一个字段都写死index,这样可以快速解决你现有的问题。

实现二:
上述截图中我讲了可以利用不重复的标题,利用相对位置来代替写死index的做法。

positionTitle="县(市)区、开发(度假)区" 再结合 offset=1 可以定位到 "2018年完成数_绝对值",这样可以绕开这个动态标题的问题


但基于之前的案例,我相信你更希望是类似于
"2018年完成数_绝对值" , "2018年完成数_增速(%)"的写法,对吧。但是问题是标题会变,不好通过注解的方式定位(我暂时的想法是通过允许你利用模糊标题,代替标题)。
title可以是 正则表达式,类似于:

@Data
@ExcelTableHeader(height = 2)
public class TempObj {

    @ExcelTitleBind(title = ".*年完成数_绝对值")
    private String w1_1;
    @ExcelTitleBind(title = ".*年完成数_增速(%)")
    private String w1_2;

    @ExcelTitleBind(title = ".*年完成数_绝对值")
    private String w2_1;
    @ExcelTitleBind(title = ".*年完成数_增速(%)")
    private String w2_2;

    @ExcelTitleBind(title = ".*年完成数_绝对值")
    private String w3_1;
    @ExcelTitleBind(title = ".*年完成数_增速(%)")
    private String w3_2;

    @ExcelTitleBind(title = ".*年完成数_绝对值")
    private String w4_1;
    @ExcelTitleBind(title = ".*年完成数_增速(%)")
    private String w4_2;
}

会在下一个版本1.3.22 中,当然暂时我也没想到更好的法子,暂时打算这么做,你如果有更好的想法的话,可以留言。

from excel-import-export.

TomYule avatar TomYule commented on September 24, 2024

二级表头也不一致

from excel-import-export.

1015770492 avatar 1015770492 commented on September 24, 2024

1.3.22
支持了正则标题,可以模糊匹配
测试案例代码
正则模糊匹配标题

指定了sheetName 也就是第三个sheet中造了点数据进去

@Data
@ExcelTableHeader(height = 3, sheetName = "市属企业")
public class ImportRegularTitle {

    @ExcelTitleBind(title = "市属企业")
    private String w1;
    @ExcelTitleBind(title = ".*年计划")
    private String w2;
    @ExcelTitleBind(title = ".*月完成情况")
    private String w3;
    @ExcelTitleBind(title = ".*年计划")
    private String w4;
    @ExcelTitleBind(title = ".*月$")
    private String m1;
    @ExcelTitleBind(title = ".*月$")
    private String m2;
    @ExcelTitleBind(title = ".*月$")
    private String m3;
    @ExcelTitleBind(title = ".*月$")
    private String m4;
    @ExcelTitleBind(title = ".*月$")
    private String m5;
    @ExcelTitleBind(title = ".*月$")
    private String m6;
    @ExcelTitleBind(title = ".*月$")
    private String m7;
    @ExcelTitleBind(title = ".*月$")
    private String m8;
    @ExcelTitleBind(title = ".*月$")
    private String m9;
    @ExcelTitleBind(title = ".*月$")
    private String m10;
    @ExcelTitleBind(title = ".*月$")
    private String m11;
    
}

测试数据和结果:
image
image

你截图中的对应的sheet是第一个sheet

因为字段太多,我只造了部分的字段和注解

@Data
@ExcelTableHeader(height = 4, sheetName = "县市区")
public class ImportRegularTitle_For_multiLevelTitle {

    @ExcelTitleBind(title = "县(市)区、开发(度假)区")
    private String A;
    // 2018
    @ExcelTitleBind(title = ".*年完成数$_绝对值")
    private String B;
    @ExcelTitleBind(title = ".*年完成数$_增速(%)")
    private String C;
    //2019
    @ExcelTitleBind(title = ".*年完成数$_绝对值")
    private String D;
    @ExcelTitleBind(title = ".*年完成数$_增速(%)")
    private String E;
    //2020
    @ExcelTitleBind(title = ".*年完成数$_绝对值")
    private String F;
    @ExcelTitleBind(title = ".*年完成数$_增速(%)")
    private String G;
    //2021
    @ExcelTitleBind(title = ".*年完成数$_绝对值")
    private String H;
    @ExcelTitleBind(title = ".*年完成数$_增速(%)")
    private String I;
    @ExcelTitleBind(title = "各县市区人代会目标_绝对值")
    private String J;
    @ExcelTitleBind(title = "各县市区人代会目标_增速(%)")
    private String K;

    @ExcelTitleBind(title = ".*年预期目标$_绝对值")
    private String L;
    @ExcelTitleBind(title = ".*年预期目标$_增速(%)")
    private String M;
    @ExcelTitleBind(title = ".*年1-2月完成数$_绝对值")
    private String N;
    @ExcelTitleBind(title = ".*年1-2月完成数$_增速(%)")
    private String O;

    @ExcelTitleBind(title = ".*年1-2月完成数$_绝对值")
    private String P;
    @ExcelTitleBind(title = ".*年1-2月完成数$_增速(%)")
    private String Q;

    /**
     * 2021年1-3月完成投资
     */
    @ExcelTitleBind(title = ".*完成投资$_绝对值")
    private String R;
    @ExcelTitleBind(title = ".*完成投资$_增速(%)")
    private String S;
    @ExcelTitleBind(title = ".*完成投资$_单月完成数")
    private String T;
    @ExcelTitleBind(title = ".*完成投资$_进度(%)")
    private String U;

    /**
     * 2021年1-4月完成投资
     */
    @ExcelTitleBind(title = ".*完成投资$_绝对值")
    private String V;
    @ExcelTitleBind(title = ".*完成投资$_增速(%)")
    private String W;
    @ExcelTitleBind(title = ".*完成投资$_单月完成数")
    private String X;
    @ExcelTitleBind(title = ".*完成投资$_进度(%)")
    private String Y;

}

提供的测试案例代码:
正则多级标题
为了方便对比数据,我将字段的命名和单元格列相同
image
测试得到的数据如下:
image

from excel-import-export.

1015770492 avatar 1015770492 commented on September 24, 2024

二级表头也不一致

发布了版本1.3.22 还有看下,上面我最新的回复

from excel-import-export.

TomYule avatar TomYule commented on September 24, 2024

解决了部分问题 但也没全部解决

录入数据是一对多的数据存储
图片

列表是从数据字典存储维护 每年会变
所以 每一列表头 是从数据库取值

是一个二维的概念 相当于 横向循环
横向循环 又分为 一级表头 二级表头

from excel-import-export.

1015770492 avatar 1015770492 commented on September 24, 2024

你的意思是对应javabean是这样的对吗

class Temp {
    // 2018
    @ExcelTitleBind(title = "标题")
    private String A;
    @ExcelTitleBind(title = "绝对值")
    private String B;
    @ExcelTitleBind(title = "增速(%)")
    private String C;
}
@Data
@ExcelTableHeader(height = 4, sheetName = "县市区")
public class ImportRegularTitle_For_multiLevelTitle {
    List<Temp> list;
}

from excel-import-export.

1015770492 avatar 1015770492 commented on September 24, 2024

解决了部分问题 但也没全部解决

录入数据是一对多的数据存储 图片

列表是从数据字典存储维护 每年会变 所以 每一列表头 是从数据库取值

是一个二维的概念 相当于 横向循环 横向循环 又分为 一级表头 二级表头

从截图来讲,意思就是说,可以通过UI上的按钮 “添加年度完成数”来添加这里的一行数据,这样excel的列信息就会变化对吧。

如果是这样的话,通过注解的方式可能已经做不到了(你可以自己想想这个标题个数是动态的,你要加注解是根据标题而加的,如果标题都不存在,注解自然就不知道怎么加)。

简便的改法就是
我会暴漏一个方法出来,然后你需要自己查数据库,然后将这些信息处理成excel-import-export能够处理的标题信息,然后传进去,这样就可以解决这个问题。

之前的处理是通过注解传进去的,比较麻烦的是,你该用什么对象去接这个excel数据,
如果说用前面提到的 List 而Obj则是一类属性(关键是list长度是动态的)不好操作。

以前的做法是这样的,我不知道该怎么处理。

List<ImportRegularTitle> quarterList = 
ExcelImportExportUtils.importExcel(new FileInputStream(areaQuarter), ImportRegularTitle.class, 2000);

如果换成下面的

ExcelImportExportUtils.importExcel(new FileInputStream(areaQuarter), 标题信息数据 2000);

那么返回给你一个jsonObject是可以的。
然后你自己可以通过JsonObject.parseObject( )尝试转换,这种是不依赖与注解的方式。

from excel-import-export.

TomYule avatar TomYule commented on September 24, 2024

http://doc.wupaas.com/docs/easypoi/easypoi-1c1rqdskq6nbs
通过模板解决了

from excel-import-export.

Related Issues (8)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.