Apache POI Java-写入excel并动态更新单元格

问题描述 投票:0回答:2

我的Java Spring Boot应用程序需要根据数据库的内容创建一个新的Excel文件。我当前的解决方案将数据库中的所有数据放入Excel工作表中,但是我想通过不声明单元格值来改善它。例如,尽管它可以工作,但是我的解决方案有34个字段,因此我对每个字段重复了34次指定userRow.createCell行。理想情况下,我想说创建cell(n)并从数据库的每一行中获取所有值。如何才能做到这一点?此for循环中的另一个for循环?我在网上查看的每个示例似乎都明确说明了单元格的值。

List<CaseData> cases = (List<CaseData>) model.get("cases");
    Sheet sheet = workbook.createSheet("PIE Cases");
int rowCount = 1;
    for (CaseData pieCase : cases) {
        Row userRow = sheet.createRow(rowCount++);
        userRow.createCell(0).setCellValue(pieCase.getCaseId());
        userRow.createCell(1).setCellValue(pieCase.getAcknowledgementReceivedDate());
    }
java spring-boot apache-poi
2个回答
2
投票

使用Reflection API

示例:

try {
    Class caseDataObj = CaseData.class;
    Method [] methods = caseDataObj.getDeclaredMethods();
    Sheet sheet = workbook.createSheet("PIE Cases");
    int rowCount = 1;
    for(CaseData cd : cases) {
        int cellIndex = 0;
        Row userRow = sheet.createRow(rowCount++);
        for (Method method : methods) {
            String methodName = method.getName();
            if(methodName.startsWith("get")) {
                // Assuming all getters return String
                userRow.createCell(cellIndex++).setCellValue((String) method.invoke(cd));
            }
        }
    }
} catch (Exception e) {
    e.printStackTrace();
}

1
投票

可能有很多方法可以执行此操作,您可以尝试这样的操作,这就是我通常针对诸如您正在做的事情执行的操作。

public enum DATA {
     CASE_ID(0), 
     ACK_RECIEVED(1), 
     ETC(2); 
     //ETC(3) and so on

     public int index;

     DATA(int index) { 
         this.index = index; 
     }

     public Object parse(CaseData data) throws Exception {
          switch (this) {
              case CASE_ID:
                 return data.getCaseId();
              case ACK_RECIEVED:
                 return data.getAcknowledgementReceivedDate();
              case ETC:
                 return "etc...";
              default: return null;
         }
     }
}

然后,实现为:

List<CaseData> cases = (List<CaseData>) model.get("cases");
Sheet sheet = workbook.createSheet("PIE Cases");
int rowCount = 1;
for (CaseData pieCase : cases) {
    Row userRow = sheet.createRow(rowCount++);
    for (DATA DAT : DATA.values()) {
        userRow.createCell(DAT.index).setCellValue(DAT.parse(pieCase));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.