java常用工具类之Excel操作类及依赖包下载
依赖包下载:http://xiazai.jb51.net/201407/tools/java-excel-dependency(jb51.net).rar
Excel工具类ExcelUtil.java源码:
packagecom.itjh.javaUtil;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.io.OutputStream;
importjava.text.DecimalFormat;
importjava.util.LinkedList;
importjava.util.List;
importjavax.servlet.http.HttpServletResponse;
importorg.apache.poi.hssf.usermodel.HSSFCell;
importorg.apache.poi.hssf.usermodel.HSSFRichTextString;
importorg.apache.poi.hssf.usermodel.HSSFRow;
importorg.apache.poi.hssf.usermodel.HSSFSheet;
importorg.apache.poi.hssf.usermodel.HSSFWorkbook;
importorg.apache.poi.openxml4j.exceptions.InvalidFormatException;
importorg.apache.poi.ss.usermodel.Cell;
importorg.apache.poi.ss.usermodel.DateUtil;
importorg.apache.poi.ss.usermodel.Row;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.usermodel.Workbook;
importorg.apache.poi.ss.usermodel.WorkbookFactory;
/**
*封装对excel的操作,包括本地读写excel和流中输出excel,支持office2007。<br/>
*依赖于poi-3.9-20121203.jar,poi-ooxml-3.9-20121203.jar,poi-ooxml-schemas-3.9-
*20121203.jar,dom4j-1.6.1.jar<br/>
*有参构造函数参数为excel的全路径<br/>
*
*@author宋立君
*@date2014年07月03日
*/
publicclassExcelUtil{
//excel文件路径
privateStringpath="";
//写入excel时,是否自动扩展列宽度来符合内容。
privatebooleanautoColumnWidth=false;
/**
*无参构造函数默认
*/
publicExcelUtil(){
}
/**
*有参构造函数
*
*@parampath
*excel路径
*/
publicExcelUtil(Stringpath){
this.path=path;
}
/**
*读取某个工作簿上的所有单元格的值。
*
*@paramsheetOrder
*工作簿序号,从0开始。
*@returnList<Object[]>所有单元格的值。
*@throwsIOException
*加载excel文件IO异常。
*@throwsFileNotFoundException
*excel文件没有找到异常。
*@throwsInvalidFormatException
*@author宋立君
*@date2014年07月03日
*/
publicList<Object[]>read(intsheetOrder)throwsFileNotFoundException,
IOException,InvalidFormatException{
FileInputStreamfis=newFileInputStream(path);
Workbookworkbook=WorkbookFactory.create(fis);
if(fis!=null){
fis.close();
}
Sheetsheet=workbook.getSheetAt(sheetOrder);
//用来记录excel值
List<Object[]>valueList=newLinkedList<Object[]>();
//循环遍历每一行、每一列。
for(Rowrow:sheet){
//每一行
Object[]rowObject=null;
for(Cellcell:row){
//cell.getCellType是获得cell里面保存的值的type
switch(cell.getCellType()){
caseCell.CELL_TYPE_BOOLEAN:
//得到Boolean对象的方法
rowObject=CollectionUtil.addObjectToArray(rowObject,
cell.getBooleanCellValue());
break;
caseCell.CELL_TYPE_NUMERIC:
//先看是否是日期格式
if(DateUtil.isCellDateFormatted(cell)){
//读取日期格式
rowObject=CollectionUtil.addObjectToArray(rowObject,
cell.getDateCellValue());
}else{
DecimalFormatdf=newDecimalFormat();
//单元格的值,替换掉,
Stringvalue=df.format(cell.getNumericCellValue())
.replace(",","");
//读取数字
rowObject=CollectionUtil.addObjectToArray(rowObject,
value);
}
break;
caseCell.CELL_TYPE_FORMULA:
//读取公式
rowObject=CollectionUtil.addObjectToArray(rowObject,
cell.getCellFormula());
break;
caseCell.CELL_TYPE_STRING:
//读取String
rowObject=CollectionUtil.addObjectToArray(rowObject,cell
.getRichStringCellValue().toString());
break;
}
}
//将这行添加到list。
valueList.add(rowObject);
}
returnvalueList;
}
/**
*读取某个工作簿上的某个单元格的值。
*
*@paramsheetOrder
*工作簿序号,从0开始。
*@paramcolum
*列数从1开始
*@paramrow
*行数从1开始
*@return单元格的值。
*@throwsException
*加载excel异常。
*@author宋立君
*@date2014年07月03日
*/
publicStringread(intsheetOrder,intcolum,introw)throwsException{
FileInputStreamfis=newFileInputStream(path);
Workbookworkbook=WorkbookFactory.create(fis);
if(fis!=null){
fis.close();
}
Sheetsheet=workbook.getSheetAt(sheetOrder);
Rowrows=sheet.getRow(row-1);
Cellcell=rows.getCell(colum-1);
Stringcontent=cell.getStringCellValue();
returncontent;
}
/**
*在指定的工作簿、行、列书写值。
*
*@paramsheetOrder
*工作簿序号,基于0.
*@paramcolum
*列基于1
*@paramrow
*行基于1
*@paramcontent
*将要被书写的内容。
*@throwsException
*书写后保存异常。
*@author宋立君
*@date2014年07月03日
*/
publicvoidwrite(intsheetOrder,intcolum,introw,Stringcontent)
throwsException{
FileInputStreamfis=newFileInputStream(path);
Workbookworkbook=WorkbookFactory.create(fis);
if(fis!=null){
fis.close();
}
Sheetsheet=workbook.getSheetAt(sheetOrder);
Rowrows=sheet.createRow(row-1);
Cellcell=rows.createCell(colum-1);
cell.setCellValue(content);
FileOutputStreamfileOut=newFileOutputStream(path);
workbook.write(fileOut);
fileOut.close();
}
/**
*得到一个工作区最后一条记录的序号,相当于这个工作簿共多少行数据。
*
*@paramsheetOrder
*工作区序号
*@returnint序号。
*@throwsIOException
*根据excel路径加载excel异常。
*@throwsInvalidFormatException
*@author宋立君
*@date2014年07月03日
*/
publicintgetSheetLastRowNum(intsheetOrder)throwsIOException,
InvalidFormatException{
FileInputStreamfis=newFileInputStream(path);
Workbookworkbook=WorkbookFactory.create(fis);
if(fis!=null){
fis.close();
}
Sheetsheet=workbook.getSheetAt(sheetOrder);
returnsheet.getLastRowNum();
}
/**
*在磁盘生成一个含有内容的excel,路径为path属性
*
*@paramsheetName
*导出的sheet名称
*@paramfieldName
*列名数组
*@paramdata
*数据组
*@throwsIOException
*@author宋立君
*@date2014年07月03日
*/
publicvoidmakeExcel(StringsheetName,String[]fieldName,
List<Object[]>data)throwsIOException{
//在内存中生成工作薄
HSSFWorkbookworkbook=makeWorkBook(sheetName,fieldName,data);
//截取文件夹路径
StringfilePath=path.substring(0,path.lastIndexOf("\\"));
//如果路径不存在,创建路径
Filefile=newFile(filePath);
//System.out.println(path+"-----------"+file.exists());
if(!file.exists())
file.mkdirs();
FileOutputStreamfileOut=newFileOutputStream(path);
workbook.write(fileOut);
fileOut.close();
}
/**
*在输出流中导出excel。
*
*@paramexcelName
*导出的excel名称包括扩展名
*@paramsheetName
*导出的sheet名称
*@paramfieldName
*列名数组
*@paramdata
*数据组
*@paramresponse
*response
*@throwsIOException
*转换流时IO错误
*@author宋立君
*@date2014年07月03日
*/
publicvoidmakeStreamExcel(StringexcelName,StringsheetName,
String[]fieldName,List<Object[]>data,
HttpServletResponseresponse)throwsIOException{
OutputStreamos=null;
response.reset();//清空输出流
os=response.getOutputStream();//取得输出流
response.setHeader("Content-disposition","attachment;filename="
+newString(excelName.getBytes(),"ISO-8859-1"));//设定输出文件头
response.setContentType("application/msexcel");//定义输出类型
//在内存中生成工作薄
HSSFWorkbookworkbook=makeWorkBook(sheetName,fieldName,data);
os.flush();
workbook.write(os);
}
/**
*根据条件,生成工作薄对象到内存。
*
*@paramsheetName
*工作表对象名称
*@paramfieldName
*首列列名称
*@paramdata
*数据
*@returnHSSFWorkbook
*@author宋立君
*@date2014年07月03日
*/
privateHSSFWorkbookmakeWorkBook(StringsheetName,String[]fieldName,
List<Object[]>data){
//用来记录最大列宽,自动调整列宽。
Integercollength[]=newInteger[fieldName.length];
//产生工作薄对象
HSSFWorkbookworkbook=newHSSFWorkbook();
//产生工作表对象
HSSFSheetsheet=workbook.createSheet();
//为了工作表能支持中文,设置字符集为UTF_16
workbook.setSheetName(0,sheetName);
//产生一行
HSSFRowrow=sheet.createRow(0);
//产生单元格
HSSFCellcell;
//写入各个字段的名称
for(inti=0;i<fieldName.length;i++){
//创建第一行各个字段名称的单元格
cell=row.createCell((short)i);
//设置单元格内容为字符串型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
//为了能在单元格中输入中文,设置字符集为UTF_16
//cell.setEncoding(HSSFCell.ENCODING_UTF_16);
//给单元格内容赋值
cell.setCellValue(newHSSFRichTextString(fieldName[i]));
//初始化列宽
collength[i]=fieldName[i].getBytes().length;
}
//临时单元格内容
StringtempCellContent="";
//写入各条记录,每条记录对应excel表中的一行
for(inti=0;i<data.size();i++){
Object[]tmp=data.get(i);
//生成一行
row=sheet.createRow(i+1);
for(intj=0;j<tmp.length;j++){
cell=row.createCell((short)j);
//设置单元格字符类型为String
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
tempCellContent=(tmp[j]==null)?"":tmp[j].toString();
cell.setCellValue(newHSSFRichTextString(tempCellContent));
//如果自动调整列宽度。
if(autoColumnWidth){
if(j>=collength.length){//标题列数小于数据列数时。
collength=CollectionUtil.addObjectToArray(collength,
tempCellContent.getBytes().length);
}else{
//如果这个内容的宽度大于之前最大的,就按照这个设置宽度。
if(collength[j]<tempCellContent.getBytes().length){
collength[j]=tempCellContent.getBytes().length;
}
}
}
}
}
//自动调整列宽度。
if(autoColumnWidth){
//调整列为这列文字对应的最大宽度。
for(inti=0;i<fieldName.length;i++){
sheet.setColumnWidth(i,collength[i]*2*256);
}
}
returnworkbook;
}
/**
*功能:设置写入excel时,是否自动扩展列宽度来符合内容,默认为false。
*
*@author宋立君
*@date2014年07月03日
*@paramautoColumnWidth
*true或者false
*/
publicvoidsetAutoColumnWidth(booleanautoColumnWidth){
this.autoColumnWidth=autoColumnWidth;
}
}