2017-01-26 5 views
0

Я почти готов решить свою проблему, но просто застрял в небольшой проблеме. Я пытаюсь распечатать файл excel с LinkedHashmap. Я использую Java и POI-библиотеку для своей цели.Написание листа excel с LinkedHashmap с использованием Java POI

Я извлекаю некоторые данные из другого файла excel в LinkedHashmap и распечатываю эти данные в новый файл excel.

Данные хранятся в LinkedHashmap большой и перечислены в следующем порядке:

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

Что я хочу:

Выход в Ехчел должен отображаться в следующем формате:

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); линии, внешний контур будет правильно печатать ключевые значения в первой строке столбца мудрым. Я не могу понять, где я ошибаюсь. Благодарю.

ответ

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++; 
} 

Проблема была:

лист. createRow (строка) .createCell (0) .setCellValue (ключ); // создаем новую строку в строке индекса ' sheet.createRow (строка) .createCell (2) .setCellValue (значение); // создаем новую строку с индексом той же строки

так что ваша первая строка будет переопределена.

+0

Благодарим вас за ответ и объяснение. Отлично работает. просто то, что я хотел :) – Dhruvify