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官网源码包:http://download.csdn.net/detail/sanfye/8623877
我是刚接触poi,如有问题可跟帖讨论,不对的地方请务喷
0 0
- Java用POI操作Excel
- Java操作Excel Poi
- Java操作Excel Poi
- POI Java操作Excel
- java poi excel 操作
- java poi操作EXCEL
- Java操作Excel Poi
- java poi操作excel
- java POI操作excel
- java poi Excel操作
- java-poi-操作excel
- java poi操作Excel
- Java-poi操作Excel
- JAVA POI操作EXCEL
- java用poi.jar操作Excel
- java用poi.jar操作Excel
- Java语言用POI操作Excel
- 用POI操作Excel
- 【c语言】有一个函数: x < 1 --- y = x 1 <= x < 10 --- y = 2 * x - 1 x >= 10 --- y = 3 * x - 11 输
- c#委托案例和理解
- 回溯-POJ2676-Sudoku
- Leetcode:Set Matrix Zeroes
- 让Android屏幕不响应任何点击
- Java用POI操作Excel
- java 技术导图
- 【c语言】给出100分制成绩,要求输出成绩等级A,B,C,D,E。90分以上为A,80~89位B,70~79位C ,60~69位D,60以下为E
- HDU 4006 The kth great number
- Xcode自定义Eclipse中常用的快捷键
- python以gzip header请求html数据时,response内容乱码无法解码的解决方案
- BeanUtils框架的使用
- 第二次作业:WinForm可视化设计 - 顺序图片显示器开发
- 【c语言】给一个不多于5位的正整数,要求: 1、求出它是几位数 2、分别输出每一位数字 3、按逆序输出各位数字