2011-12-29 90 views
4

其实我正在从一个从Excel文件中提取数据的java程序, 和我正在使用POI库,事实上,我必须指定每个提取的值的类型,但该文件包含大量的不同类型的数据, 所以我问是否有另一种方式来获取所有的数据作为一个字符串。如何从excel文件中获取数据?

谢谢。 最好的问候

package DAO; 

import java.io.FileInputStream; 
import java.util.Iterator; 
import java.util.Vector; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 

public class ReadExcelFile { 

    public static void main(String[] args) { 
     String fileName = "C:\\Users\\marrah\\Desktop\\TRIAL FILE1.xls"; 
     Vector dataHolder = ReadCSV(fileName); 
     printCellData(dataHolder); 
    } 

    public static Vector ReadCSV(String fileName) { 
     Vector cellVectorHolder = new Vector(); 

     try { 
      FileInputStream myInput = new FileInputStream(fileName); 
      POIFSFileSystem myFileSystem = new POIFSFileSystem(myInput); 
      HSSFWorkbook myWorkBook = new HSSFWorkbook(myFileSystem); 
      HSSFSheet mySheet = myWorkBook.getSheetAt(0); 
      Iterator rowIter = mySheet.rowIterator(); 

      while (rowIter.hasNext()) { 
       HSSFRow myRow = (HSSFRow) rowIter.next(); 
       Iterator cellIter = myRow.cellIterator(); 
       Vector cellStoreVector = new Vector(); 
       while (cellIter.hasNext()) { 
        HSSFCell myCell = (HSSFCell) cellIter.next(); 
        cellStoreVector.addElement(myCell); 
       } 
       cellVectorHolder.addElement(cellStoreVector); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return cellVectorHolder; 
    } 

    private static void printCellData(Vector dataHolder) { 
     for (int i = 0; i < dataHolder.size(); i++) { 
      Vector cellStoreVector = (Vector) dataHolder.elementAt(i); 
      for (int j = 0; j < cellStoreVector.size(); j++) { 
       HSSFCell myCell = (HSSFCell) cellStoreVector.elementAt(j); 
       Object stringCellValue=""; 
       stringCellValue =cellStoreVector.get(j).toString(); 
       System.out.print(stringCellValue.toString()+"\t"); 
      } 
     } 
    } 
} 
+0

你想,他们在Excel中的样子,或者你想控制施加给每个日期的格式来获取值细胞,每个细胞等? – Gagravarr 2011-12-30 10:19:28

回答

1

您可以创建一个共同的功能,当你运行直通每一行,其验证数据类型上的每一个细胞都使用,然后检索它在你的首选格式。所以你移动行与行,并且对于每个单元调用是这样的:

private static String getCellvalue(HSSFRow poiRow, int intColActual) { 

     if (poiFilaActual != null && poiRowActual.getLastCellNum() >= (short) intColActual) { 
      HSSFCell cell = poiRowActual.getCell(intColActual); 
      if (cell != null) { 
       if (HSSFCell.CELL_TYPE_STRING == cell.getCellType()) { 
        return cell.getRichStringCellValue().toString(); 
       } else if (HSSFCell.CELL_TYPE_BOOLEAN == cell.getCellType()) { 
        return new String((cell.getBooleanCellValue() == true ? "true" : "false")); 
       } else if (HSSFCell.CELL_TYPE_BLANK == cell.getCellType()) { 
        return ""; 
       } else if (HSSFCell.CELL_TYPE_NUMERIC == cell.getCellType()) { 
        if(HSSFDateUtil.isCellDateFormatted(cell)){ 
         return (new SimpleDateFormat("dd/MM/yyyy").format(cell.getDateCellValue())); 
        }else{ 
         return new BigDecimal(cell.getNumericCellValue()).toString(); 
        } 
       } 
      } 
     } 

     return null; 
    } 
2

我有一个单元测试,我使用以下方法来提取一个Excel文件中的所有文本没有任何格式的,对于一些用例,这可能是比遍历所有的元素一个接一个更快:

private POITextExtractor extractText(File file) throws IOException { 

    InputStream inp = null; 

    try { 

     inp = new PushbackInputStream(

      new FileInputStream(file), 8); 



     if(POIFSFileSystem.hasPOIFSHeader(inp)) { 

      return createExtractor(new POIFSFileSystem(inp)); 

     } 

     throw new IllegalArgumentException("Your File was neither an OLE2 file, nor an OOXML file"); 

    } finally { 

     if(inp != null) inp.close(); 

    } 

} 



private static POITextExtractor createExtractor(POIFSFileSystem fs) throws IOException { 

    return createExtractor(fs.getRoot(), fs); 

} 



private static POITextExtractor createExtractor(DirectoryNode poifsDir, POIFSFileSystem fs) throws IOException { 

    for(Iterator<Entry> entries = poifsDir.getEntries(); entries.hasNext();) { 

     Entry entry = entries.next(); 



     if(entry.getName().equals("Workbook")) { 

      { 

       return new ExcelExtractor(poifsDir, fs); 

      } 

     } 

    } 

    throw new IllegalArgumentException("No supported documents found in the OLE2 stream"); 

} 



private String assertContains(File file, String... contents) throws IOException { 

    assertTrue(file.exists()); 

    POITextExtractor extractor = extractText(file); 

    assertNotNull(extractor); 

    String str = extractor.getText(); 



    for(String s : contents) { 

     assertTrue("Did expect to find text '" + s + "' in resulting Excel file, but did not find it in str: " + str, str.contains(s)); 

    } 



    return str; 

}