使用 apache poi 将 Map<String, List<Map<String,Object>>> 数据写入 excel

writing Map<String, List<Map<String,Object>>> data into excel using apache poi

我正在使用 Map>> 使用 apache poi 库在 springboot 应用程序中创建 excel 文件。

我有数据:{Sheet1=[{header1=abc, header2=def, header3=ghi}], Sheet2=[{header1=ab, header2=de, header3=gh}], Sheet3=[{header1=bc, header2=ef, header3=嗨}]}

我需要创建 excel 如下。

  **data.xlsx**

 | header1 header2 header3 |   |header1 header2 header3 |  |header1 header2 header3 |
    abc     def     ghi          ab      de      gh          bc      ef      hi
  <Sheet1>                      <Sheet2>                    <Sheet3>

我可以使用 Map>> 中的键名创建不同的 sheets data.I 我正在尝试创建 excel sheets 来自值,即 List,其中字符串应用作 header 和 Object 数据作为 header。我正在尝试用 header 名称填充 excel sheet 行。 for 循环 运行s 并仅填充最后一个单元格值。

我写了下面的代码来填充 header 个名称,如下所示。

//code to create excel sheet

Map<String, List<Map<String, Object>>> data = info.getData(); //getting data from database

 XSSFWorkbook wb = new XSSFWorkbook();

  FileOutputStream out = new FileOutputStream(new File("C:...path"+"data.xlsx"));

  Set<String> keyset = data.keySet();
  for(String key: keyset){

    XSSFSheet sheet = wb.crateSheet(key);
    int rowNo = 0;
    List<Map<String, Object>> list = data.get(key);

    for(Map<String, Object> value : list){

      XSSFRow row = sheet.createRow(rowNo++);

      Set<String> headerKeyset = value.keySet();

      for(String keyHeader : headerKeyset){

       int cellnum= 0;
       XSSFCell cell = row.createCell(cellnum++);
       cell.setCellValue(keyHeader);
}}}
 wb.write(out);
 out.close();

.
.
.

我可以在 Excel 文件中创建名为 Sheet1、Sheet2、Sheet3 的不同 Sheets/tab。 但是无法填写正确的 header 和数据,当我 运行 上面的代码时,只有最后一个单元格值被填充如下。

  **data.xlsx**

 | header3                  |   |header3                 |  |header3                |
    
  <Sheet1>                      <Sheet2>                    <Sheet3>

有人可以让我知道我必须更改什么才能使其正常工作吗?

您的代码片段不可编译。所以我希望你在 post 之前修改它。 这一行 -> for(Map<String, Object> value : list({

关于代码,您可能遗漏或错放了花括号。在此特定示例中,您的行 wb.write(out); 被调用了 3 次

更新:在您更改代码后,我发现您甚至没有使用 object 值来填充数据,仅使用 header。使用这样的东西:

XSSFRow hrow = sheet.createRow(0);
XSSFRow vrow = sheet.createRow(1);
for(Map<String, Object> value : list) {
    
    Set<String> headerKeyset = value.keySet();
    for(String keyHeader : headerKeyset) {
       int cellnum= 0;
       XSSFCell hcell = hrow.createCell(cellnum++);
       hcell.setCellValue(keyHeader);
       XSSFCell vcell = vrow.createCell(cellnum++);
       vcell.setCellValue(value.getValue(keyHeader));
    }
}