zoukankan      html  css  js  c++  java
  • 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;  
        }  
    
  • 相关阅读:
    多级别过滤器
    MongoDBAppender
    org.slf4j.impl.SimpleLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext
    简单引入logback
    Logback configuration
    PatternLayoutEncoder 输出格式
    ConsoleAppender
    FileAppender
    Linux学习笔记
    GitLab CI/CD 学习记录
  • 原文地址:https://www.cnblogs.com/baixiaozheng/p/4953506.html
Copyright © 2011-2022 走看看