Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

数据为空时,表头也没有输出 #361

Open
linmii opened this issue Sep 19, 2023 · 5 comments
Open

数据为空时,表头也没有输出 #361

linmii opened this issue Sep 19, 2023 · 5 comments

Comments

@linmii
Copy link
Contributor

linmii commented Sep 19, 2023

自定义导出列,当data中没有数据时,导出的Excel中,表头也没有,完全是一个空的表格。怎样设置,才能使得不管有没有数据,表头都会输出?

List<Content> contentList = mapper.getContentList();
List<User> userList = mapper.getExcelTemplate();
Column[] columns = new Column[5 + contentList.size() * 2];
columns[0] = new Column("用户id", "userId");
columns[1] = new Column("姓名", "userName");
columns[2] = new Column("单位", "deptName");
columns[3] = new Column("职务", "postArrangement");
columns[4] = new Column("身份证号", "idCard");
int i = 5;
for (PerformanceAssessmentContent content : contentList) {
    columns[i++] = new Column(content.getAssessmentContentName() + "(" + content.getMaxGrade() + "分)-得分", "score-" + content.getId());
    columns[i++] = new Column(content.getAssessmentContentName() + "-备注", "remark-" + content.getId());
}
ExcelUtils.export("绩效考核模板.xlsx", new Workbook().addSheet(new ListSheet<>("人员列表", userList, columns)));
@wangguanquan
Copy link
Owner

临时处理:覆写getHeaderColumns方法代码如下,并没有完全测试,需要考虑配合more方法时否能成功绑定get方法。不过你的这个场景似乎预处理数据应该是可以满足的。

new Workbook().setAutoSize(true)
    .addSheet(new ListSheet<ListObjectSheetTest.Item>(
        new Column("id", "id")
        , new Column("name", "name")
        ) {
            @Override
            protected Column[] getHeaderColumns() {
                if (!headerReady) {
                    int size = init();
                    // --> 这里增加一个null判断,如果外部有指定则使用外部的表头
                    if (size <= 0 && columns == null) {
                        columns = new Column[0];
                    }
                }
                return columns;
            }
        }.setData(new ArrayList<>())
    ).writeTo(defaultTestPath.resolve("issue#361.xlsx"));

@linmii
Copy link
Contributor Author

linmii commented Sep 19, 2023

临时处理:覆写getHeaderColumns方法代码如下,并没有完全测试,需要考虑配合more方法时否能成功绑定get方法。不过你的这个场景似乎预处理数据应该是可以满足的。

new Workbook().setAutoSize(true)
    .addSheet(new ListSheet<ListObjectSheetTest.Item>(
        new Column("id", "id")
        , new Column("name", "name")
        ) {
            @Override
            protected Column[] getHeaderColumns() {
                if (!headerReady) {
                    int size = init();
                    // --> 这里增加一个null判断,如果外部有指定则使用外部的表头
                    if (size <= 0 && columns == null) {
                        columns = new Column[0];
                    }
                }
                return columns;
            }
        }.setData(new ArrayList<>())
    ).writeTo(defaultTestPath.resolve("issue#361.xlsx"));

这样处理可以满足要求,感谢!
个人觉得默认将表头输出到excel中,是否更好一些?这样就算没有数据,通过表头的信息,也能够知道应该导出的数据是哪些信息。

@wangguanquan
Copy link
Owner

采纳!下个版本加入

@linmii
Copy link
Contributor Author

linmii commented Oct 8, 2023

更新到0.5.11版本,在没有数据的情况下,ListMapSheet方式导出时,表头有输出,但是通过ListSheet(注解方式)导出时,表头没有输出。

@wangguanquan
Copy link
Owner

wangguanquan commented Oct 8, 2023

没有数据时拿不到对象,也无法通过反射拿到,所以无法取到对象的注解。这种情况与JSON反序列化时遇到转泛型必须 指定TypeReference的情况一样,处理方式也一样

有两种方式解决,一是覆写getTClass方法,一种是覆写more方法

.addSheet(new ListSheet<Item>() {
        @Override
        protected Class<?> getTClass() {
            return Item.class; // 指定类型
        }
    }.setData(new ArrayList<>())

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants