Ошибка в цикле for при чтении файла Excel в hashmap - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь получить доступ к файлу Excel в hashmap, но при i = 5 colNum получается значение 8, поэтому вывод не получается ожидаемым.Ниже приведен код Чтение этого файла Excel с помощью hashmap, после того, как вопрос типа соответствует, я хочу сохранить только соответствующую метку и значение, а затем передать соответствующему классу

enter image description here

public class HashMapObjectTest {

static HSSFSheet sheet;
static HSSFRow row;
private static MissingCellPolicy xRow;  
static DataFormatter df = new DataFormatter();

@Test
public void  getMapData() throws Exception
{
    File src=new File("D:\\Projects\\TestData_peerTest.xls");
    FileInputStream fis=new FileInputStream(src);
    HSSFWorkbook wb=new HSSFWorkbook(fis);
    sheet = wb.getSheetAt(0);
    DataFormatter df = new DataFormatter();
    Row row;

    //String value1 = null;
    String value = null;
    String keyQuestion;
    String label = null;


    Map<String,Map<String,String>>  superMap = new HashMap <String,Map<String,String>> ();
    Map<String,String> childMap=new HashMap<String,String>();

    ArrayList <String >data=new ArrayList<String>();


    for(int i=1; i<sheet.getLastRowNum();i++ )
    {
        row=sheet.getRow(i);
        int column=0;
        int colNum=row.getLastCellNum();

        Cell c=row.getCell(column, MissingCellPolicy.RETURN_BLANK_AS_NULL);


        //String label=df.formatCellValue(sheet.getRow(i).getCell(1));

        if(c==null)
        {
            //label=df.formatCellValue(sheet.getRow(i).getCell(i+1));
            label=df.formatCellValue(sheet.getRow(i).getCell(1));
            value=df.formatCellValue(sheet.getRow(i).getCell(2));
            data.add(value);
            continue;

        }

        else {
         keyQuestion= df.formatCellValue(sheet.getRow(i).getCell(0));

        for (int j=1;j<colNum-1;j++)
        {
            label=df.formatCellValue(sheet.getRow(i).getCell(1));
            value=df.formatCellValue(sheet.getRow(i).getCell(j+1));

            childMap.put(label, value);

        }

        superMap.put(keyQuestion, childMap);
    }

    }

    System.out.println(superMap);


    /*List keys = new ArrayList(superMap.keySet());
    for (int i = 0; i < keys.size(); i++) {
        Object obj = keys.get(i);
        // do stuff here
    }

    for (Entry<String, Map<String, String>> entry : superMap.entrySet()) {
        String key = entry.getKey();
        System.out.println(key);

        Map<String, String> childkey = entry.getKey();

        System.out.println(value);
        //TODO: other cool stuff
    }

Также я хочу проверить элемент hashmap (superMap), чтобы проверить questionType, для этого, пожалуйста, предложите возможный подход.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Сценарий, описанный выше, можно выполнить, сохранив начальный и конечный индексы для каждого типа вопроса.

Измененный код:

public class HashMapObjectTest {

    static HSSFSheet sheet;
    static HSSFRow row;
    private static MissingCellPolicy xRow;  
    static DataFormatter df = new DataFormatter();

    @Test
    public void  getMapData() throws Exception
    {
        File src=new File("D:\\Projects\\TestData_peerTest.xls");
        FileInputStream fis=new FileInputStream(src);
        HSSFWorkbook wb=new HSSFWorkbook(fis);
        sheet = wb.getSheetAt(0);

        Map<String,Map<String,String>>  superMap = new HashMap <String,Map<String,String>> ();

        //Start Index -> Question Type Start Index

        int startIndex=1;
        int endIndex=-1;
        int lastRow=sheet.getLastRowNum();

        while(startIndex<=lastRow){

            for(int i=startIndex;i<lastRow;i++){

                Row row=sheet.getRow(i+1);
                Cell c=row.getCell(0, MissingCellPolicy.RETURN_BLANK_AS_NULL);

                    if(c!=null){
                        endIndex=i;
                        break;
                    }
                    else if(i==lastRow-1){
                        endIndex=i+1;
                        break;
                    }

            }

            String keyQuestion=sheet.getRow(startIndex).getCell(0).getStringCellValue();
            Map<String,String> childMap=new HashMap<String,String>();

            for(int j=startIndex;j<=endIndex;j++){
                String label=sheet.getRow(j).getCell(1).getStringCellValue();
                String value=sheet.getRow(j).getCell(2).getStringCellValue();
                childMap.put(label, value);
            }

            System.out.println(childMap);
            superMap.put(keyQuestion,childMap);
            startIndex=endIndex+1;

        }

        System.out.println(superMap);

    }
0 голосов
/ 04 июня 2018

Как сказано в документе apache-poi здесь , методы getLastRowNum () , getRow () , ... основаны на 0 (ноль),поэтому вам нужно начинать цикл «для» с 0, считать «i-1» и т. д., если вы хотите, чтобы столбец «i» находился на листе.

Например, ваша 5-я строка в Excelдокумент будет sheet.getRow (5 - 1).

...