【问题标题】:How can I dynamically write to Row 0 using Apache POI?如何使用 Apache POI 动态写入第 0 行?
【发布时间】:2019-12-03 23:05:58
【问题描述】:

我正在使用 Java 和 Apache POI 编写 excel。为了在我的 Excel 表中创建第一行(以显示列名/标题),我目前正在创建一个字符串数组,然后遍历数组中的每个值以填充我的 excel 表中的第 0 行。这工作正常,但我想删除这个数组,以便它可以从我的数据库中提取列名。有超过 30 个列名,但为简洁起见,我在下面进行了缩写。我需要将单元格值设置为数据库列名。我如何使用数据库中的列动态更新第 0 行,而不是说明每个字段?

List<?> cases = (List<?>) model.get("cases");
Sheet sheet = workbook.createSheet("Cases");
String[] columns = { "Case ID", "Acknowledgement Received Date", "Actual Amount Returned"};

    Row headerRow = sheet.createRow(0);
    for (int i = 0; i < columns.length; i++) {
        Cell cell = headerRow.createCell(i);
        cell.setCellValue(columns[i]);
        cell.setCellStyle(style);
    }

【问题讨论】:

  • 好的。但是你的问题是什么?
  • 抱歉,我现在已经编辑并清楚地说明了我的问题。我的问题不是说明每个字段,而是如何使用数据库中的列动态更新第 0 行?
  • 这取决于你使用什么样的数据库,列来自哪里,你使用哪个API从你的数据库中读取数据等等。你使用关系数据库吗?你使用 JDBC 吗?这些是单个表的列吗?你试过什么?

标签: java apache-poi


【解决方案1】:

您可以使用结果集的 getMetadata 方法从数据库中提取所有列名称。

更多详情here

【讨论】:

    【解决方案2】:

    您可以使用ResultSetMetaData

     ResultSetMetaData rsmd = rs.getMetaData()
    

    其中 rs 是 ResultSet 的一个实例

    然后你可以这样做:

    Row headerRow = sheet.createRow(0);
    for (int i = 0; i < rsmd.getColumnCount(); i++) {
        Cell cell = headerRow.createCell(i);
        cell.setCellValue(rsmd.getColumnName(i));
        cell.setCellStyle(style);
    }
    

    PS:您可以创建一些函数getLabel 将Snake case 转换为Title case 并执行

    cell.setCellValue(getLabel(rsmd.getColumnName(i)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      相关资源
      最近更新 更多