簡體   English   中英

使用Java POI用LinkedHashmap編寫Excel工作表

[英]Writing excel sheet with LinkedHashmap using Java 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();

神秘地,當我刪除值的內部for-loop而沒有忽略sheet.createRow(row).createCell(0).setCellValue(key); 行,則外循環將在第一列的行中正確打印鍵值。 我不知道自己在哪里犯錯。 謝謝。

您通過調用兩次來創建行

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(row) .createCell(0).setCellValue(key); //在索引“​​行” 表上創建新行。createRow(row) .createCell(2).setCellValue(value); //在同一行索引處創建新行

因此您的第一行將被覆蓋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM