Java用POI操作Excel

来源:互联网 发布:知乎 一天背1000个单词 编辑:程序博客网 时间:2024/05/16 10:35
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 exceptione2.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 exceptionflag = false ;e.printStackTrace();}finally{ try {if(fis!=null){fis.close();}if(os!=null){os.close();}} catch (Exception e2) {// TODO: handle exceptione2.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 exceptionflag = false ;e.printStackTrace();}finally{ try {if(fis!=null){fis.close();}if(os!=null){os.close();}} catch (Exception e2) {// TODO: handle exceptione2.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)!=nullif(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 exceptione.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 exceptione.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 exceptione.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 exceptione.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,如有问题可跟帖讨论,不对的地方请务喷 

0 0
原创粉丝点击