Java - Apache POI - В этом шаблоне невозможно заполнить строки и ячейки циклами? (Excel)

Недавно открывал тему:

Java — Apache POI — Проблемы с заполнением строк и ячеек с циклами (Excel)

Я разработал другую структуру, надеясь, что это решит проблему, и проблема стала еще яснее.

Учитывая этот шаблон:

hashkey1 | hashkey2 | hashkey3 | hashkey4
value1-1 | value2-1 | value3-1 | value4-1  
value1-2 | value2-2 | value3-2 | value4-2  
value1-3 | value2-3 | value3-3 | value4-3  
value1-4 | value2-4 | value3-4 | value4-4  
value1-5 | value2-5 | value3-5 | value4-5 

Вот новый код:

Row keyRow = worksheet.createRow(4);
Row valueRow = null;
int keyCell = -2;
int firstIndex = 0;
int secondIndex = -2;
int row = 5;
ArrayList<String> keyArray = new ArrayList();
ArrayList<String> innerValueArray;
ArrayList<ArrayList<String>> outerValueArray = new ArrayList<ArrayList<String>>();
for (Map.Entry<String, ArrayList<String>> e : matrix.entrySet()) {
    keyArray.add(e.getKey());
    innerValueArray = new ArrayList();
    for (String s : e.getValue()) {
        innerValueArray.add(s);
    }
    outerValueArray.add(innerValueArray);
}
for (String s : keyArray) {
    keyCell += 2;
    keyRow.createCell(keyCell).setCellValue(keyArray.get(firstIndex++));
}
for (ArrayList<String> aS : outerValueArray) {
    secondIndex += 2;
    for (String s : aS) {
        if ((row - 5) < outerValueArray.size()) {
            row++;  
        }
        valueRow = worksheet.createRow(row);
        valueRow.createCell(secondIndex).setCellValue(s);
    }
}

В другой теме проблемной переменной является «keyCell», а в этой — secondIndex. Единственный способ поместить значения в нужное место — через ту же переменную, которая используется для ключей, но это позволяет заполнить только один столбец, стирая содержимое других. Проблема ТОЧНО такая же из другой темы. Все альтернативы ведут к этому, и я хочу значения в ОДИНАКОВЫХ строках.

Вопрос: НЕВОЗМОЖНО ли заполнять и эксель лист по этому шаблону? Потому что точно невозможно обновить переменную во внутреннем цикле и сохранить желаемый шаблон. Как я могу построить этот узор с петлями?

OBS: В моем ПО он увеличивается на 2, это не имеет значения. Выполнение этого по одному вызывает ту же проблему (ячейки стираются).

Большое спасибо!


person Ericson Willians    schedule 23.06.2013    source источник


Ответы (1)


Я не уверен, что действительно понимаю ваш вопрос, но проверьте это. Он создает рабочий лист с описанным вами шаблоном:

import java.io.*;
import java.util.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;

public class PoiPattern {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public static void main(String[] args) throws Exception {
        Map<String, ArrayList<String>> matrix = new HashMap<String, ArrayList<String>>();
        for (int i = 1; i <= 5; i++) {
            matrix.put("hashkey"+i, new ArrayList(Arrays.asList(new String[]{"value"+i+"-1", "value"+i+"-2", "value"+i+"-3", "value"+i+"-4", "value"+i+"-5"})));    
        }

        Workbook wb = new HSSFWorkbook();
        Sheet worksheet = wb.createSheet();

        Row keyRow = worksheet.createRow(0);
        int col = 0;
        for (String key : matrix.keySet()) {
            keyRow.createCell(col).setCellValue(key);
            ArrayList<String> values = matrix.get(key);
            for (int i = 0; i < values.size(); i++) {
                Row r = worksheet.getRow(i+1);
                if (r == null) { r = worksheet.createRow(i+1); }
                r.createCell(col).setCellValue(values.get(i));
            }
            col++;
        }
        FileOutputStream fos = new FileOutputStream(new File("ExampleFill.xls"));
        wb.write(fos);
    }
}
person acdcjunior    schedule 23.06.2013
comment
Кровавый ад!!! Я думал, что потеряю рассудок очень по-лавкрафтовски. Я вам очень благодарна, правда! Я действительно думал, что это невозможно сделать, а вы только что вызвали ИМЕННО то решение, которое мне было нужно. Спасибо, если бы я мог, я бы дал вам правильный ответ 999 раз. Я глубоко проанализирую магию, которую вы сделали внутри цикла. - person Ericson Willians; 23.06.2013
comment
Agora que vi que é brasileiro rs.. Muito obrigado!! :). - person Ericson Willians; 23.06.2013
comment
Опа! Эх шум!! :D Se quiser, gente pode discutir/simplificar o loop!! Vc Que Manda!! - person acdcjunior; 23.06.2013