Java用POI操作Excel

1、Java 操作Excel可以使用poi或jxl等,poi和jxl的区别是:据说poi功能稍微强大点,效率高(占内存比较大,已空间换时间);pxl功能稍弱,但基本够用,占用资源比较稳定。POI除了可以操作Excel(ss=HSSF+XSSF)外 还可以操作Word(HWPF+XSLF)、PowerPoint(HSLF+XSLF),OpenXML4J(OOXML )、 OLE2 Filesystem (POIFS) OLE2 Document Props (HPSF) Outlook (HSMF) Visio (HDGF) TNEF (HMEF) Publisher (HPBF)等
下面是POI一个基本 新增、修改、删除、隐藏 的实例,
注意:poi操作Excel2007以前使用HSSF开头的,操作2007以后用XSSF开头,下面是以HSSF写的一个demo,需操作2007以后的只需把下面的HSSF改为XSSF即可,二者的功能方法基本一致,XSSF稍微强大点 新增一些高级操作,XSSF是在poi-ooxml-3.11-20141221.jar 包下存放的 ,使用时呀引入此jar包才可以,SXSSF功能可以说是XSSF扩展,可以设置每次刷新的行数。

package com.OperateExcel;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;

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;
/*
 * 操作2007之前的excel,如果要操作2007及之后的excel,只需把HSSF换成XSSF 即可
 */
public class HandleExcel {
	
	public HandleExcel(String filePath,String sheetName,int rowindex){
//		boolean flag = deleteExcel(filePath, sheetName, rowindex,2);
		boolean flag = hiddenSheet(filePath, sheetName);
		System.out.println(flag );
	}
	
	/*public WriteExcel(){
		//新建Excel
//		newExcel();
		//读取单元格的内容
//		readExcel();
	    long beginTime = System.currentTimeMillis();
		String filePath = "D:\\test.xls" ;
		String sheetName = "test1";
		readExcel(filePath,sheetName);
		long endTime = System.currentTimeMillis();
		System.out.println("耗时:"+(endTime-beginTime));
	}*/
	/*public WriteExcel(String filePath,String sheetName){
		//新建Excel
//		newExcel();
		//读取单元格的内容
//		readExcel();
	    long beginTime = System.currentTimeMillis();
		filePath = "D:\\test.xls" ;
		sheetName = "test1";
		readExcel(filePath,sheetName);
		long endTime = System.currentTimeMillis();
		System.out.println("耗时:"+(endTime-beginTime));
	}*/
	
	//隐藏sheet页
	public boolean hiddenSheet(String filePath,String sheetName) { 
		boolean flag = true ;
		FileOutputStream os = null ;
		FileInputStream fis = null ;
        try { 
            fis = new FileInputStream(filePath); 
            HSSFWorkbook wb = new HSSFWorkbook(fis);
            int sheetIx = wb.getSheetIndex(sheetName) ;
            //隐藏Sheet 
            //0:不隐藏,1:隐藏;2:深度隐藏
            wb.setSheetHidden(sheetIx, 0);
            os = new FileOutputStream(new File(filePath)) ;
            wb.write(os); 
            fis.close(); 
        } catch (Exception e) { 
        	flag= false ;
            e.printStackTrace(); 
        } finally{ 
			try {
				if(fis!=null){
					fis.close();
				}
				if(os!=null){
					os.close();
				}
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
			
		}
        return flag ;
        
    } 
	
	    //删除Excel文档
		//①删除行内容但保留行位置②整行删除(删除后下方单元格上移)
		public boolean deleteExcel(String filePath,String sheetName,int rowindex,int sign){
			boolean flag = true ;
			FileInputStream fis = null ;
			POIFSFileSystem  poifsFileSystem = null ;
			FileOutputStream os = null ;
			try {
				//获取文件源
				fis = new FileInputStream(filePath);
				poifsFileSystem = new POIFSFileSystem(fis);//可有可无
				//创建对Excel工作簿文件的引用
				HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
				//指定行列读取
				//按名引用,也可用getSheetAt(int index)按索引引用
				HSSFSheet sheet = workbook.getSheet(sheetName);
				//删除指定的行
				HSSFRow row = sheet.getRow(rowindex);
				if(sign==1){
					sheet.removeRow(row);//删除行内容但保留行位置
				}else {
					sheet.shiftRows(1, 2, -1);//删除第1行(包括)到第3行(不包括),使下方单元格上移
				}
				//注意最后一定要 write 文件输出
				os = new FileOutputStream(new File(filePath)) ;
				workbook.write(os);
				os.flush();
				os.close();
				
			} catch (Exception e) {
				// TODO: handle exception
				flag = false ;
				e.printStackTrace();
			}finally{ 
				try {
					if(fis!=null){
						fis.close();
					}
					if(os!=null){
						os.close();
					}
				} catch (Exception e2) {
					// TODO: handle exception
					e2.printStackTrace();
				}
				
			}
			
			return flag ;
		}
	
	//更新Excel文档
	public boolean  updateExcel(String filePath,String sheetName,ConcurrentHashMap<String, Object> hashMap){
		boolean flag = true ;
		FileInputStream fis = null ;
		POIFSFileSystem  poifsFileSystem = null ;
		FileOutputStream os = null ;
		try {
			//获取文件源
			fis = new FileInputStream(filePath);
			poifsFileSystem = new POIFSFileSystem(fis);//可有可无
			//创建对Excel工作簿文件的引用
			HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
			//指定行列读取
			//按名引用,也可用getSheetAt(int index)按索引引用
			HSSFSheet sheet = workbook.getSheet(sheetName);
			//循环更新操作
			//获取第一行的内容
			
			Iterator it = hashMap.entrySet().iterator();
			int rowNum = 1 ;
			while(it.hasNext()){
			  Map.Entry<String, String[]> entry = (Entry<String, String[]>) it.next();
			  String key = entry.getKey();//编号
			  List list = (List) hashMap.get(key);
			  if(list==null||list.size()<1){//当前list为空值
				  continue ;
			  }
			  //第一个值 是名称 excel中已有
			  HSSFRow row = sheet.getRow(rowNum) ;//获取当前的行
			  for(int i=1;i<list.size();i++){
//				  HSSFCell cell = row.createCell(i+1);
				  HSSFCell cell = row.getCell(i+1);
				  System.out.println(list.get(i).toString());
				  cell.setCellValue(list.get(i).toString());
			  }
			  rowNum++ ;
			}
			
			//文件输出
			os = new FileOutputStream(new File(filePath)) ;
			workbook.write(os);
			os.flush();
			os.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			flag = false ;
			e.printStackTrace();
		}finally{ 
			try {
				if(fis!=null){
					fis.close();
				}
				if(os!=null){
					os.close();
				}
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
			
		}
		
		return flag ;
	}
	
	
	/**
	 * 读取指定Excel文件和sheet页
	 * @param filePath Excel文件全路径
	 * @param sheetName sheet页名称
	 */
	public ConcurrentHashMap<String, String> readExcel(String filePath,String sheetName){
		ConcurrentHashMap<String, String> hashMap = new ConcurrentHashMap<String, String>();
		try {
			//获取文件源
			FileInputStream fis = new FileInputStream(filePath);
			POIFSFileSystem  poifsFileSystem = new POIFSFileSystem(fis);//可有可无
			//创建对Excel工作簿文件的引用
			HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
			
			//循环读取
			HSSFSheet sheet = workbook.getSheet(sheetName);
			//获取第一行的内容
			HSSFRow row = null ;
			for(int m = 0;sheet.getRow(m)!=null;m++){//遍历行数
				row = sheet.getRow(m);
				for(int i=0;i<2;i++){//遍历当前列 row.getCell(i)!=null
					if(row.getCell(i)!=null||!"".equals(row.getCell(i))){
						hashMap.put(m+"", row.getCell(i).toString());
						System.out.println(m+"行 "+i+"列 "+row.getCell(i));
					}
				}
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		return hashMap ;
	}
	
	//读取Excel文档中的内容
	public void readExcel(String filePath){
		try {
			//获取文件源
			FileInputStream fis = new FileInputStream(filePath);
			POIFSFileSystem  poifsFileSystem = new POIFSFileSystem(fis);//可有可无
			//创建对Excel工作簿文件的引用
			HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
			
			//指定行列读取
			//按名引用,也可用getSheetAt(int index)按索引引用
			HSSFSheet sheet = workbook.getSheet("test1");
			//读取左上端单元,0:第一行
			HSSFRow row  = sheet.getRow(2);
			//读取该行的第一个单元格的内容; 0:第一个单元格
			HSSFCell cell = row.getCell((short)1);
			//获取单元格的内容
			String content =  cell.getStringCellValue();
			
			//循环读取
			/* 
	         HSSFRow ro=null;
	         for (int i = 0; sh.getRow(i)!=null; i++) {
	             ro=sh.getRow(i);
	             for (int j = 0; ro.getCell(j)!=null; j++) {
	                 System.out.print(ro.getCell(j)+"");
	             }
	             System.out.println();
	         }*/
			
			
			
			System.out.println(cell.getSheet()+" sheet页 "+cell.getRowIndex()+"行 "+cell.getColumnIndex()+" 列 "+cell.getCellType()+" 类型 content="+content);
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	/**
	 * 新建一个Excel文档
	 */
	private void newExcel(){
		try {
			//HSSFworkbook表示一个完整的excel表格
			HSSFWorkbook workbook = new HSSFWorkbook();
			//HSSFsheet表示excel中的一个工作薄
			HSSFSheet sheet0 = workbook.createSheet(); //在Excel工作簿中建一工作表,其名为缺省值
			HSSFSheet sheet1 = workbook.createSheet(); 
			HSSFSheet sheet = workbook.createSheet("test1");//创建一个sheet页名称是:test1
			//HSSFRow表示工作薄中的一行
			HSSFRow row = sheet.createRow(2);//创建一行,参数 表示 0:第一行,1:第二行
			//HSSFCell表示一个单元格
			HSSFCell cell = row.createCell(1);//创建一个单元格,参数 0:第一行,1:第二行
			cell.setCellValue("swh_test");//赋值
			//文件输出
			FileOutputStream os = new FileOutputStream(new File("D:\\test.xls")) ;
			workbook.write(os);
			os.flush();
			os.close();
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
	
	public String[] getSheetNames(String filePath){
		String []sheetName = null ;
		try {
			//获取文件源
			FileInputStream fis = new FileInputStream(filePath);
			POIFSFileSystem  poifsFileSystem = new POIFSFileSystem(fis);//可有可无
			//创建对Excel工作簿文件的引用
			HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
			int count = workbook.getNumberOfSheets();//获取sheet页的数量
			sheetName = new String[count];
			for(int i=0;i<count;i++){
				sheetName[i] = workbook.getSheetName(i);
			}
			
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
		return sheetName ;
	}
	
	public static void main(String [] args){
        try {
           /* HSSFWorkbook workbook= new HSSFWorkbook();
            HSSFSheet sheet= workbook.createSheet("test");
            HSSFRow row = sheet.createRow(1);
            HSSFCell cell= row.createCell(2);
            cell.setCellValue("test");
            FileOutputStream os= null;
            os = new FileOutputStream("fisrtExcel.xls");
            workbook.write(os);
            os.flush();
            os.close();*/
        	
        	String filePath = "D:\\test.xls" ;
    		String sheetName = "test1";
    		
    		new HandleExcel(filePath, sheetName, 2);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("ok");
    }

}

POI 3.11官网完整jar包下载地址(包括必备jar包、样例和文档): http://download.csdn.net/detail/sanfye/8623845
POI 3.11官网源码包: http://download.csdn.net/detail/sanfye/8623877

我是刚接触poi,如有问题可跟帖讨论,不对的地方请务喷 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值