使用Java POI使用LinkedHashmap编写Excel工作表

时间:2017-01-26 15:27:15

标签: java excel apache-poi

我几乎可以解决我的问题,但只是陷入了小问题。我正在尝试从LinkedHashmap打印excel文件。我将Java和POI库用于我的目的。

我从LinkedHashmap中的另一个excel文件中提取一些数据,然后将这些数据打印到新的excel文件中。

LinkedHashmap中存储的数据很大,并按以下方式列出:

    Keys | Values
-----------------------------------
    Key1 : value1, value1, value1
    Key2 : value2, value2, value2
    key3 : value3, value3, value3

我想要的是什么:

excel文件中的输出应以下列格式显示:

Excel_file_out_deserved.xslx:

     + 
key1 | value1
key1 | value1
key1 | value1
     |        // (if possible, empty cell space here will look good)
key2 | value2
key2 | value2
key2 | value2
     |        // (if possible, empty cell space here will look good)
key3 | value3
key3 | value3
key3 | value3

我得到了什么:

My_excel_file_out.xslx:

     | value1  // (why my first column is empty?!, it should print keys there)
     | value1
     | value1
     | value2
     | value2
     | value2
     | value3
     | value3
     | value3 

我尝试了什么:

FileOutputStream out = new FileOutputStream(new File("my_excel.xlsx"));

XSSFWorkbook newWorkbook = new XSSFWorkbook();
XSSFSheet sheet = newWorkbook.createSheet("print_vertical");
int row = 0;

// loop through all the keys
for(String key : linkMap.keySet()){

    List<String> values = linkMap.get(key);

    for (String value:values){

         // print keys in 1st column
         sheet.createRow(row).createCell(0).setCellValue(key); // why this doesn't work? :-/
         // print values in 3rd column
         sheet.createRow(row).createCell(2).setCellValue(value); // this works fine
         row++;
        }

    }

    newWorkbook.write(out);
    out.close();

神奇的是,当我在不省略sheet.createRow(row).createCell(0).setCellValue(key);行的情况下删除内部for循环值时,外部循环将在第一列中正确地打印键值。我无法弄清楚我在哪里弄错了。谢谢。

1 个答案:

答案 0 :(得分:2)

通过调用

创建两次行
sheet.createRow(row)

您需要将行存储在变量中并调用createCell(x)那里

for (String value:values){
    Row newRow = sheet.creatRow(row);
    newRow.createCell(0).setCellValue(key);
    newRow.createCell(2).setCellValue(value);
    row++;
}

问题是:

<强> sheet.createRow(行) .createCell(0).setCellValue(键); //在索引'row'创建新行 的 sheet.createRow(行) .createCell(2).setCellValue(值); //在同一行索引处创建新行

所以你的第一行会被覆盖。