2013-12-10 5 views
0

У меня есть код, который читает файл excel в java-код и затем анализирует XML-документ, создавая соответствующие теги. Проблема, которую я застрял, - это пустые ячейки. Представьте пару столбцов и строк, заполненных данными, и в случае, если ячейка пустая, тогда она закручивает XML-документ, потому что в этом случае он вставляет значение следующей ячейки, которая не пуста, поэтому результат не получается правильным , Любые предложения по редактированию кода?Пустые ячейки excel Ячейки для анализа XML

public class ExcelXMLParser { 
public ExcelXMLParser() { 
} 

public void displayFromExcel (String xlsPath) 
{ 
    InputStream inputStream = null; 
    try 
    { 
     inputStream = new FileInputStream (xlsPath); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.println ("File not found in the specified path."); 
     e.printStackTrace(); 
    } 

    POIFSFileSystem fileSystem = null; 

    try { 
     //Initializing the XML document 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document document = builder.newDocument(); 
     Element rootElement = document.createElement("records"); 
     document.appendChild(rootElement); 


     fileSystem = new POIFSFileSystem (inputStream); 
     HSSFWorkbook workBook = new HSSFWorkbook (fileSystem); 
     HSSFSheet sheet = workBook.getSheetAt (0); 
     Iterator<?> rows = sheet.rowIterator(); 

     ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>(); 
     while (rows.hasNext()) 
     { 
      HSSFRow row = (HSSFRow) rows.next(); 
      int rowNumber = row.getRowNum(); 
      // display row number 
      //System.out.println ("Row No.: " + rowNumber); 

      // get a row, iterate through cells. 
      Iterator<?> cells = row.cellIterator(); 

      ArrayList<String> rowData = new ArrayList<String>(); 
      while (cells.hasNext()) 
      { 
       HSSFCell cell = (HSSFCell) cells.next(); 
       switch (cell.getCellType()) 
       { 
       case HSSFCell.CELL_TYPE_NUMERIC : 
       { 
        // NUMERIC CELL TYPE 
        //System.out.println ("Numeric: " + Integer.toString((int) cell.getNumericCellValue())); 
        rowData.add(Integer.toString((int) cell.getNumericCellValue())); 
        break; 
       } 
       case HSSFCell.CELL_TYPE_STRING : 
       { 
        // STRING CELL TYPE 
        HSSFRichTextString richTextString = cell.getRichStringCellValue(); 

        //System.out.println ("String: " + richTextString.getString()); 
        rowData.add(richTextString.getString()); 
        break; 
       } 
       default: 
       { 
        // types other than String and Numeric. 
        System.out.println ("Type not supported."); 
        break; 
       } 
      } // end switch 
     } // end while 
     data.add(rowData); 
    } //end while 

    int numOfData = data.size(); 

    for (int i = 1; i < numOfData; i++){ 
     Element dataElement = document.createElement("data"); 
     rootElement.appendChild(dataElement); 

     int index = 0; 
     for(String s: data.get(i)) { 
      String headerString = data.get(0).get(index); 
      Element headerElement = document.createElement(headerString); 
      dataElement.appendChild(headerElement); 
      System.out.println(headerElement); 
      System.out.println(s); 
      headerElement.appendChild(document.createTextNode(s)); 
      index++; 
     } 
    } 

    TransformerFactory tFactory = TransformerFactory.newInstance(); 

    Transformer transformer = tFactory.newTransformer(); 

    //Add indentation to output 
    transformer.setOutputProperty 
    (OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty(
      "{http://xml.apache.org/xslt}indent-amount", "2"); 

    // Define source 
    DOMSource source = new DOMSource(document); 
    StreamResult result = new StreamResult(new File("c:\\Users\\Temped\\Desktop\\dataXML.xml")); 
    transformer.transform(source, result); 

} 
catch(IOException e) 
{ 
    System.out.println("IOException " + e.getMessage()); 
} catch (ParserConfigurationException e) { 
    System.out.println("ParserConfigurationException " + e.getMessage()); 
} catch (TransformerConfigurationException e) { 
    System.out.println("TransformerConfigurationException "+ e.getMessage()); 
} catch (TransformerException e) { 
    System.out.println("TransformerException " + e.getMessage()); 
} 

}

public static void main (String[] args) 
{ 
    ExcelXMLParser generateOutput = new ExcelXMLParser(); 
    String xlsPath ="C:\\Users\\Temped\\Desktop\\dataXLS.xls"; 
    generateOutput.displayFromExcel (xlsPath); 
} 
} 
+0

Не было бы так просто, как добавление и пустая строка в ваши rowdata по умолчанию вашего коммутатора? – SBI

+0

Это не исправить, я думаю .. – n1ckgun

+0

Ну, если вы хотите зеркалировать макет вашего листа excel 1: 1, вам нужно создать узел для каждой ячейки. И это будет именно так. – SBI

ответ

0

Фиксированный с использованием карт. Создавая списки карт с помощью LinkedHashMap.

Смежные вопросы