java的poi技术读取和写入excel

 1、poi帮助文档:

API:http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFCell.html

poi包:http://pan.baidu.com/s/1hmIQU

2、小知识点

  1.sheet, 以0开始,以workbook.getNumberOfSheets()-1结束 
   2.row, 以0开始(getFirstRowNum),以getLastRowNum结束 
   3.cell, 以0开始(getFirstCellNum),以getLastCellNum结束

3、例子:

excel内容的值如果不是string,则用getNumericCellValue(),得到double类型,再做相应转换,如果为string,则用getStringCellValue()

double转换为int:int i_yhfw= (int) Double.parseDouble(Demo.getExcel(index, 13));

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
/**
	 * 获取excel文件
	 * index为sheet页,从0开始
	 * rowNum为行数,从0开始
	 * 从来colNumNum为列数,从0开始
	 * 只能读取excel2003(2003的后缀名是.xls)
	 */
	public static String getExcel(int index,int rowNum,int colNum){
//		String Divpath="C:/Users/gmsd11/workspace";//文件保存的路径
//		File dirFile=new File(Divpath);//创建文件对象
//		if(!dirFile.exists()){//如果文件路径不存在,自动创建目录
//			dirFile.mkdir();
//		}
//		System.out.println(dirFile.getAbsolutePath());
		
		String path="C:/Users/gmsd11/workspace/testdate1.xls";//文件路径
		File file=new File(path);//创建文件对象
		System.out.println(file.getAbsolutePath());
		String cellValue=null;//保存读取出的列值
		int rowN=rowNum-1;//将excel的行数-1
		
		Row row=null;//行对象(接口)
		Cell cell=null;//列对象(接口)
		HSSFCell hssfcell=null;//该类实现了以上Cell接口
		
		try {
			FileInputStream in=new FileInputStream(file);//通过打开一个到实际文件的连接来创建一个FileInputStream对象,该文件通过文件系统的File对象file制指定(创建文件流)
			HSSFWorkbook wb=new HSSFWorkbook(in);//创建一个Excel对象
			HSSFSheet sheet=wb.getSheetAt(index);//创建一个Excel的sheet,sheet页,index从0开始(创建表格)
			
			//从哪行读取
			//int firstRowNum=sheet.getFirstRowNum()+1;
			//int loatRowNum=sheet.getLastRowNum();
			
			row=sheet.getRow(rowN);//取得行
			hssfcell=(HSSFCell)row.getCell(colNum);//取得行的第3列(获得单元格),从0开始
			
			if(hssfcell!=null){
				//((Object) hf).setEncoding(HSSFCell.ENCODING_UTF_16);
				
				//判断excel内容的数值类型
				switch (hssfcell.getCellType()) {
				case HSSFCell.CELL_TYPE_STRING://字符串
					cellValue=hssfcell.getStringCellValue().trim();
					break;
					
				case HSSFCell.CELL_TYPE_NUMERIC://数值型
					if(HSSFDateUtil.isCellDateFormatted(cell)){
						//如果是date类型则,获取该hssfcell的date值
						Date date=hssfcell.getDateCellValue();
						if(date!=null){
							cellValue=new SimpleDateFormat("yyyy-MM-dd").format(date);//创建一个日期格式并以格式处理日期
						}else{
							cellValue="";
						}
					}else {//纯数字
						cellValue=new DecimalFormat("###.###").format(hssfcell.getNumericCellValue());//格式化十进制数字
						 //cellValue = String.valueOf(cell.getNumericCellValue());
					}
					break;
					
				case HSSFCell.CELL_TYPE_FORMULA://公式类型
					//导入时如果为公式生成的数据则无值
					if(!hssfcell.getStringCellValue().endsWith("")){
						cellValue=hssfcell.getStringCellValue();
					}else{
						cellValue=hssfcell.getNumericCellValue()+"";
					}		 
//			            //读公式计算值  
//			            value = String.valueOf(cell.getNumericCellValue());  
//			            if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串  
//			                value = cell.getStringCellValue().toString();  
//			            } 
//			            break;  
					break;
					
				case HSSFCell.CELL_TYPE_BLANK://空值
					cellValue="";
					System.out.println("excel出现空值");
					break;
					
				case HSSFCell.CELL_TYPE_ERROR://故障
					cellValue="";
					System.out.println("excel出现故障");
					break;
					
				case HSSFCell.CELL_TYPE_BOOLEAN://布尔类型
					cellValue=(hssfcell.getBooleanCellValue()==true ? "Y" : "N" );
					break;
					
				default:
					cellValue="";
					break;
				}
			}else{
cellValue="";
} in.close();//关闭流 } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return cellValue; }

4、excel类型问题,获得数据(网站转载)

//解决excel类型问题,获得数值  
    public  String getValue(Cell cell) {  
        String value = "";  
        if(null==cell){  
            return value;  
        }  
        switch (cell.getCellType()) {  
        //数值型  
        case Cell.CELL_TYPE_NUMERIC:  
            if (HSSFDateUtil.isCellDateFormatted(cell)) {  
                //如果是date类型则 ,获取该cell的date值  
                Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());  
                SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
                value = format.format(date);;  
            }else {// 纯数字  
                BigDecimal big=new BigDecimal(cell.getNumericCellValue());  
                value = big.toString();  
                //解决1234.0  去掉后面的.0  
                if(null!=value&&!"".equals(value.trim())){  
                     String[] item = value.split("[.]");  
                     if(1<item.length&&"0".equals(item[1])){  
                         value=item[0];  
                     }  
                }  
            }  
            break;  
            //字符串类型   
        case Cell.CELL_TYPE_STRING:  
            value = cell.getStringCellValue().toString();  
            break;  
        // 公式类型  
        case Cell.CELL_TYPE_FORMULA:  
            //读公式计算值  
            value = String.valueOf(cell.getNumericCellValue());  
            if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串  
                value = cell.getStringCellValue().toString();  
            }  
            break;  
        // 布尔类型  
        case Cell.CELL_TYPE_BOOLEAN:  
            value = " "+ cell.getBooleanCellValue();  
            break;  
        // 空值  
        case Cell.CELL_TYPE_BLANK:   
            value = "";  
            LogUtil.getLogger().error("excel出现空值");  
            break;  
        // 故障  
        case Cell.CELL_TYPE_ERROR:   
            value = "";  
            LogUtil.getLogger().error("excel出现故障");  
            break;  
        default:  
            value = cell.getStringCellValue().toString();  
    }  
    if("null".endsWith(value.trim())){  
        value="";  
    }  
  return value;  
    }  

 

posted on 2015-11-10 16:44  小果子  阅读(394)  评论(0编辑  收藏  举报