首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用apache-poi在列中显示对象

如何使用apache-poi在列中显示对象
EN

Stack Overflow用户
提问于 2019-02-05 20:57:30
回答 2查看 572关注 0票数 0

我有一个正好有234个字段的大DTO,并且我必须在用apache-poi创建的Excel文件的列中显示这个DTO的每个字段的值。

这是我的代码:

代码语言:javascript
复制
// Blank workbook
XSSFWorkbook workbook = new XSSFWorkbook();

Sheet sheet = workbook.createSheet("Export values");

// Get the Entity
Simfoot simEntity = simService.findById(simId).get();

Row row = sheet.createRow(0);
row.createCell(1).setCellValue("Consult our values");

// and after this I want to convert my Simfoot object to a column in the third column ( so creteCell(2) ..... ).

我想在我的第一列中有: nothing,在我的第二列中只有字符串显示(“参考我们的值”),在我的第三列中我需要有我的234个字段。在一个单元格中包含一个字段(字段的值)。因此,234行在第三列中显示一个值。

我希望这是清楚的。

非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-05 21:32:29

使用一些反射:

代码语言:javascript
复制
    // Blank workbook
    XSSFWorkbook workbook = new XSSFWorkbook();

    final Sheet sheet = workbook.createSheet("Export values");

    // Get the Entity
    final Simfoot simEntity = simService.findById(simId).get();

    Row row = sheet.createRow(0);
    row.createCell(1).setCellValue("Consult our values");

    // and after this I want to convert my Simfoot object to a column in the third column ( so creteCell(2) ..... ).
    Arrays.stream(simEntity.getClass().getDeclaredMethods())
            .filter(m -> m.getName().startsWith("get") && m.getParameterTypes().length == 0 && !void.class.equals(m.getReturnType()))
            .forEach(m -> {
                    try {
                            Object value = m.invoke(simEntity, null);
                            Row r = sheet.createRow(sheet.getLastRowNum()+1);
                            r.createCell(2).setCellValue(value == null ? "" : value.toString());
                    }
                    catch (Exception ex) {
                            // Manage Exception....
                    }
            });
票数 1
EN

Stack Overflow用户

发布于 2019-02-05 21:26:07

我将在Simfoot上添加一个方法来返回所有值:

代码语言:javascript
复制
public List<String> getAllValues() {
    return Arrays.asList(getAtt1(), getAtt2(), .. , getAtt234());
}

然后为每个属性创建一行,然后可以合并前2列的行。下面是具有6个属性的示例:

代码语言:javascript
复制
int n = 6; // would be 234 for you
XSSFCellStyle styleAlignTop = workbook.createCellStyle();
styleAlignTop.setVerticalAlignment(VerticalAlignment.TOP);
Row row;
for(int i=0; i<n; i++) {
    row = sheet.createRow(i);
    if(i==0) {
        Cell cell = row.createCell(1);
        cell.setCellStyle(styleAlignTop);
        cell.setCellValue("Consult our values");
    }
    row.createCell(2).setCellValue(simEntity.getAllValues().get(i));
}
sheet.addMergedRegion(new CellRangeAddress(0, n-1, 0, 0));
sheet.addMergedRegion(new CellRangeAddress(0, n-1, 1, 1));

它如下所示:

另一种列出属性的方法是使用反射,但我发现它非常笨拙:

代码语言:javascript
复制
Simfoot simEntity = new Simfoot("pap", "pep", "pip", "pop", "pup", "pyp");

for(PropertyDescriptor propertyDescriptor :
    Introspector.getBeanInfo(Simfoot.class).getPropertyDescriptors()) {
        System.out.println(propertyDescriptor.getReadMethod().invoke(simEntity));
}

输出:

代码语言:javascript
复制
pap
pep
pip
pop
pup
pyp
class Simfoot

因此您必须过滤掉getClass和任何其他不需要方法和getter

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54534966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档