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操作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官网源码包: http://download.csdn.net/detail/sanfye/8623877
我是刚接触poi,如有问题可跟帖讨论,不对的地方请务喷