Как написать список данных в Excel по столбцам с помощью Java? - PullRequest
0 голосов
/ 12 октября 2018

У меня есть список данных в ArrayList, который содержит заголовок, а также значения, связанные с ним.Как показано ниже,

Fruits 
Apple 
Orange 
******
Vegetables 
Beans
Carrot 
Brinjal
Cucumber 
******
Colors
Orange 
Blue
Red
Green
Yellow

Now, I want to write the values in `excel` with each heading and the associated values in column-wise. Like below,

Fruits   Vegetable   Colors
Apple    Beans       Orange 
Orange   Carrot      Blue
         Brinjal     Red
         Cucumber    Green
                     Yellow

Я пишу свой код в Java и использую библиотеку apache.poi.xssf.usermodel для обработки манипуляций excel.Проблема, с которой я здесь сталкиваюсь, заключается в том, что когда я пишу второй заголовок и связанные с ним значения, первый заголовок и его значения очищаются из-за Row кода создания

XSSFRow row = outputSheet.createRow(rowNumValue);

Можеткто-нибудь помочь мне сделать это?

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

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

List<List<String>> makeColumns(List<String> linearList) {
    List<List<String>> columns = new ArrayList<>();
    int column = 0;
    for (String s : linearList) {
        if (s.startsWith("***")) {
            ++column;
        } else {
            while (column >= columns.size()) {
                columns.add(new ArrayList<>());
            }
            columns.get(column).add(s);
        }
    }
}

Теперь можно выполнять итерацию по строкам для заполнения листа..

List<List<String>> columns = makeColumns(...);
int rows = columns.stream().mapToInt(List::size).max().orElse(0);

for (int rowi = 0; rowi < rows; ++rowi) {
    XSSFRow row = outputSheet.createRow(rowi + 1);
    for (int coli = 0; coli < columns.size(); ++coli) {
        if (rowi < columns.get(coli).size()) {
            String value = columns.get(coli).get(rowi);
            row.createCell(coli);
            ...
        }
    }
}
0 голосов
/ 12 октября 2018

Что вам нужно сделать, это использовать createRow() в первый раз, чтобы ... создать строку, и getRow() для всего последующего доступа.Таким образом, вы получите строку уже в объекте листа вместо создания нового.getRow() возвращает ноль, если строка не существует, поэтому вы можете сделать эквивалент этого:

XSSFRow row = outputSheet.getRow(rowNumValue) ? outputSheet.getRow(rowNumValue) : outputSheet.createRow(rowNumValue);
...