Как заставить книгу (outputtream) записывать все строки в файл xlsx вместо одной? - PullRequest
0 голосов
/ 24 октября 2019

Я все еще работаю над своей программой чтения файлов, но у меня есть некоторые проблемы с моим кодом. Класс 'рейтинг файлов' будет читать все файлы в каталоге и давать им оценку. Все значения даны моему «классу sheetWriter», который вы можете увидеть здесь. Класс получает правильные значения, если я печатаю obj (объекты), но запись их в excel не работает должным образом -> он будет записывать только две строки: строка 1 («Достижимая для пользователя», «Рейтинг»,«Путь к файлу» и т. Д.) И строка 2: (достижимо, 45, C: // blabla и т. Д.). Таким образом, он в основном записывает только один файл в xlsx. Как я могу заставить его работать так, чтобы он записывал все файлы в xlsx?

Спасибо! (Я новичок на Java)

public class SheetWriter {

private XSSFWorkbook workbook;
private XSSFSheet sheet;

//!! Maybe important to know: the values come from a for-loop
//from another class 'file rating': For (x : sourcefiles){ points=5  setPoints(points)  }    

public void SheetWriter(String file,String reachable, int points,String filePath,String fileName,String keywordMatch,String grootte, 
        String resolutie, String crea_date,String crea_mod,String last_acc, String authorString,String datetakenString,
        String manufactString,String modelString,String gps ) {

workbook = new XSSFWorkbook(); 
sheet = workbook.createSheet("Rating Files");

Map<String, Object[]> data = new TreeMap<String, Object[]>(); 
    data.put("1", new Object[]{"Reachable for user", "Rating", "File path","File name","Keyword","Size","Dimensions","Date_crea","Date_mod","Date_last_access",
    "Author","Date taken","Camera maker","Camera model","GPS-data"});

data.put(file, new Object[]{reachable, points,filePath,fileName,keywordMatch,grootte, resolutie, crea_date,crea_mod,last_acc,
             authorString,datetakenString,manufactString,modelString,gps});

Set<String> keyset = data.keySet(); 
    int rownum = 0; 
    for (String key : keyset) { 
        // this creates a new row in the sheet 
        Row row = sheet.createRow(rownum++);
        Object[] objArr = data.get(key); 
        int cellnum = 0;
        for (Object obj : objArr) { 
            // this line creates a cell in the next column of that row
            Cell cell = row.createCell(cellnum++);
            //System.out.println(obj);
            if (obj instanceof String) 
                cell.setCellValue((String)obj);
            else if (obj instanceof Integer) 
                cell.setCellValue((Integer)obj); 
        }

    }  //!! so here it's still OK. I can print all the obj (objects)

try { 
        sheet.autoSizeColumn(0);sheet.autoSizeColumn(1);sheet.autoSizeColumn(2);sheet.autoSizeColumn(3);
        sheet.autoSizeColumn(4);sheet.autoSizeColumn(5);sheet.autoSizeColumn(6);sheet.autoSizeColumn(7);
        sheet.autoSizeColumn(8);sheet.autoSizeColumn(9);sheet.autoSizeColumn(10);sheet.autoSizeColumn(11);
        sheet.autoSizeColumn(12);sheet.autoSizeColumn(13);sheet.autoSizeColumn(14);
         FileOutputStream out = new FileOutputStream(new File("C:/Users/user/Pictures/test.xlsx")); 
         workbook.write(out);  //!! Only writes one file to xlsx 
         out.close(); 
         workbook.close();
         System.out.println("test.xlsx is finished."); 

    } 
    catch (Exception e) { 
        e.printStackTrace(); 
    }

1 Ответ

1 голос
/ 24 октября 2019

Если вы хотите записать несколько строк на лист, а результат - только одна строка, то, скорее всего, у вас есть проблема с переменной счетчика, которая не увеличивается должным образом, или каждая итерация делает то же самое.

Этовремя немного отличается, потому что вы пишете (создаете и устанавливаете значение) строки в расширенном цикле for, опираясь на keySet из Map только с двумя записями.

Это означает, что вы всегдазаписать только эти две записи .

Проблема, связанная с записью не всех файлов, может быть вызвана проблемой во внешнем цикле. Я предлагаю передать аргумент List<String> fileNames вместо String fileName и выполнить запись для всех файлов в этом методе. В противном случае проверьте внешний цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...