2012-05-30 3 views
0

Я нахожусь есть таблицы Excel, которая выглядит примерно так:Apache POI: Сохранение ключа и суммы в карте

+-----------------+--------+----------------------+ 
| Title   | Value | Average Price List | 
+-----------------+--------+----------------------+ 
|     |  |      | 
| Item 1   | 10 |  9.99   | 
| Item 2   | 20 |  9.99   | 
| Item 3   | 30 |  8.99   | 
| Total Royalty A |  |      | 
|     |  |      | 
+-----------------+--------+----------------------+ 
| Item 1   | 10 |  9.90   | 
| Item 2   | 20 |  5.69   | 
| Item 3   | 30 |  9.99   | 
| Total Royalty B |  |      | 
|     |  |      | 
+-----------------+--------+----------------------+ 

Я хочу, чтобы получить общее значение средней колонки. Однако мне нужно, чтобы общее количество было разделено с помощью «Всего роялти-фри, 0» и «Всего В0 '; то есть, в конце концов результат должен быть что-то вроде этого:

Total Royalty A = 10.99 
Total Royalty B = 11.88 

Я использовал HashMap, в котором ключи являются «Итого гонорар» от «Всего Безвозмездная B». У меня возникли проблемы с моим кодом в , если оператор:

if(totalCell.getCellType() == Cell.CELL_TYPE_STRING) 

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

Это метод, который должен обрабатывать делать то, что описано выше:

public HashMap monthlyAverageUnitsTotal (HSSFSheet sheet, int colAvgNum, int colTitle) 
    { 


     HashMap hm = new HashMap(); 


     double sum = 0.0; 
     String key = null; 


     for(Row row : sheet) 
     { 

      Cell saleAverageCell = row.getCell(colAvgNum); 
      Cell totalCell = row.getCell(colTitle); 

      if(totalCell.getCellType() == Cell.CELL_TYPE_STRING) 
      { 
       String totalCellValue = totalCell.getStringCellValue().toString().trim(); 

       if(totalCellValue.startsWith("Total Royalty")) 
       { 
        key = totalCell.getStringCellValue().toString().trim(); 

       } 
      } 

      if(saleAverageCell.getCellType() == Cell.CELL_TYPE_NUMERIC) 
      { 
       double saleAverageCellValue = saleAverageCell.getNumericCellValue(); 
       sum += saleAverageCellValue; 

       // put the element in the map 
       hm.put(key, sum); 

       // return the value of sum to 0 
       sum = 0.0; 


      } 


     } 


     return hm; 
    } 

ответ

1

я имел функциональное требование, что участие для разбора таблицы Excel с большим количеством данных. Чтобы использовать проблему со значением ячейки, я создал функцию, которая возвращает значение ячейки в формате String, поэтому у меня не будет проблем со строковыми, числовыми, числовыми, булевыми или пустыми ячейками (они не обрабатывают значения формулы):

//Cell celdaActual is the actual cell in a row in a sheet in the book, the class 
//has Spanish names and comments and is big for a post, so I'm just posting 
//this function 
public String getCellValue() { 
    String strValor = ""; 
    int intValor; 
    double dblValor; 
    SimpleDateFormat objSimpleDateFormat; 
    if (celdaActual != null) { 
     strValor = celdaActual.toString(); 
     switch (celdaActual.getCellType()) { 
      case Cell.CELL_TYPE_STRING: 
       strValor = strValor.trim(); 
       break; 
      case Cell.CELL_TYPE_NUMERIC: 
       if (DateUtil.isCellDateFormatted(celdaActual)) { 
        objSimpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
        strValor = objSimpleDateFormat 
         .format(celdaActual.getDateCellValue()); 
       } else { 
        dblValor = celdaActual.getNumericCellValue(); 
        if (Math.floor(dblValor) == dblValor) { 
         intValor = (int)dblValor; 
         strValor = String.valueOf(intValor); 
        } else { 
         strValor = String.valueOf(dblValor); 
        } 
       } 
       break; 
      case Cell.CELL_TYPE_BLANK: 
       strValor = ""; 
       break; 
      case Cell.CELL_TYPE_ERROR: 
       strValor = ""; 
       break; 
      case Cell.CELL_TYPE_BOOLEAN: 
       strValor = String.valueOf(celdaActual.getBooleanCellValue()); 
       break; 
     } 
    } 
    return strValor; 
} 

Надеюсь, это сработает для вас.

+0

Спасибо, что решила проблема! – lv10

+0

@ lv10 Добро пожаловать :) –