JAVAPOI通用工具类.docx

上传人:b****8 文档编号:28365339 上传时间:2023-07-10 格式:DOCX 页数:20 大小:19.08KB
下载 相关 举报
JAVAPOI通用工具类.docx_第1页
第1页 / 共20页
JAVAPOI通用工具类.docx_第2页
第2页 / 共20页
JAVAPOI通用工具类.docx_第3页
第3页 / 共20页
JAVAPOI通用工具类.docx_第4页
第4页 / 共20页
JAVAPOI通用工具类.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

JAVAPOI通用工具类.docx

《JAVAPOI通用工具类.docx》由会员分享,可在线阅读,更多相关《JAVAPOI通用工具类.docx(20页珍藏版)》请在冰豆网上搜索。

JAVAPOI通用工具类.docx

JAVAPOI通用工具类

JAVAPOI数据导入导出工具类

1.Exception处理

publicclassExcelExceptionextendsException{

publicExcelException(){

//TODOAuto-generatedconstructorstub

}

publicExcelException(Stringmessage){

super(message);

//TODOAuto-generatedconstructorstub

}

publicExcelException(Throwablecause){

super(cause);

//TODOAuto-generatedconstructorstub

}

publicExcelException(Stringmessage,Throwablecause){

super(message,cause);

//TODOAuto-generatedconstructorstub

}

}

2.POI核心处理

/**

*author:

SUNZK-QQ:

1131341075

*Date:

2018-8-23下午9:

13:

21

*Comments:

导入导出Excel工具类

*/

publicclassExcelUtil{

/**

*MethodName:

listToExcel

*Description:

导出Excel〔可以导出到本地文件系统,也可以导出到浏览器,可自定义工作表大小〕

*paramlist数据源

*paramfieldMap类的英文属性和Excel中的中文列名的对应关系

*如果需要的是引用对象的属性,那么英文属性使用类似于EL表达式的格式

*如:

list中存放的都是student,student中又有college属性,而我们需要学院名称,那么可以这样写

*fieldMap.put("college.collegeName","学院名称")

*paramsheetName工作表的名称

*paramsheetSize每个工作表中记录的最大个数

*paramout导出流

*throwsExcelException

*/

publicstaticvoidlistToExcel(

Listlist,

LinkedHashMapfieldMap,

StringsheetName,

intsheetSize,

OutputStreamout

)throwsExcelException{

 

if(list.size()==0||list==null){

thrownewExcelException("数据源中没有任何数据");

}

if(sheetSize>65535||sheetSize<1){

sheetSize=65535;

}

//创立工作簿并发送到OutputStream指定的地方

WritableWorkbookwwb;

try{

wwb=Workbook.createWorkbook(out);

//因为2003的Excel一个工作表最多可以有65536条记录,除去列头剩下65535条

//所以如果记录太多,需要放到多个工作表中,其实就是个分页的过程

//1.计算一共有多少个工作表

doublesheetNum=Math.ceil(list.size()/newInteger(sheetSize).doubleValue());

//2.创立相应的工作表,并向其中填充数据

for(inti=0;i

//如果只有一个工作表的情况

if(1==sheetNum){

WritableSheetsheet=wwb.createSheet(sheetName,i);

fillSheet(sheet,list,fieldMap,0,list.size()-1);

//有多个工作表的情况

}else{

WritableSheetsheet=wwb.createSheet(sheetName+(i+1),i);

//获取开场索引和完毕索引

intfirstIndex=i*sheetSize;

intlastIndex=(i+1)*sheetSize-1>list.size()-1?

list.size()-1:

(i+1)*sheetSize-1;

//填充工作表

fillSheet(sheet,list,fieldMap,firstIndex,lastIndex);

}

}

wwb.write();

wwb.close();

}catch(Exceptione){

e.printStackTrace();

//如果是ExcelException,那么直接抛出

if(einstanceofExcelException){

throw(ExcelException)e;

//否那么将其它异常包装成ExcelException再抛出

}else{

thrownewExcelException("导出Excel失败");

}

}

}

/**

*MethodName:

listToExcel

*Description:

导出Excel〔可以导出到本地文件系统,也可以导出到浏览器,工作表大小为2003支持的最大值〕

*paramlist数据源

*paramfieldMap类的英文属性和Excel中的中文列名的对应关系

*paramout导出流

*throwsExcelException

*/

publicstaticvoidlistToExcel(

Listlist,

LinkedHashMapfieldMap,

StringsheetName,

OutputStreamout

)throwsExcelException{

listToExcel(list,fieldMap,sheetName,65535,out);

}

 

/**

*MethodName:

listToExcel

*Description:

导出Excel〔导出到浏览器,可以自定义工作表的大小〕

*paramlist数据源

*paramfieldMap类的英文属性和Excel中的中文列名的对应关系

*paramsheetSize每个工作表中记录的最大个数

*paramresponse使用response可以导出到浏览器

*throwsExcelException

*/

publicstaticvoidlistToExcel(

Listlist,

LinkedHashMapfieldMap,

StringsheetName,

intsheetSize,

HttpServletResponseresponse

)throwsExcelException{

//设置默认文件名为当前时间:

年月日时分秒

StringfileName=newSimpleDateFormat("yyyyMMddhhmmss").format(newDate()).toString();

//设置response头信息

response.reset();

response.setContentType("application/vnd.ms-excel");//改成输出excel文件

response.setHeader("Content-disposition","attachment;filename="+fileName+".xls");

//创立工作簿并发送到浏览器

try{

OutputStreamout=response.getOutputStream();

listToExcel(list,fieldMap,sheetName,sheetSize,out);

}catch(Exceptione){

e.printStackTrace();

//如果是ExcelException,那么直接抛出

if(einstanceofExcelException){

throw(ExcelException)e;

//否那么将其它异常包装成ExcelException再抛出

}else{

thrownewExcelException("导出Excel失败");

}

}

}

 

/**

*MethodName:

listToExcel

*Description:

导出Excel〔导出到浏览器,工作表的大小是2003支持的最大值〕

*paramlist数据源

*paramfieldMap类的英文属性和Excel中的中文列名的对应关系

*paramresponse使用response可以导出到浏览器

*throwsExcelException

*/

publicstaticvoidlistToExcel(

Listlist,

LinkedHashMapfieldMap,

StringsheetName,

HttpServletResponseresponse

)throwsExcelException{

listToExcel(list,fieldMap,sheetName,65535,response);

}

/**

*MethodName:

excelToList

*Description:

将Excel转化为List

*paramin:

承载着Excel的输入流

*paramsheetIndex:

要导入的工作表序号

*paramentityClass:

List中对象的类型〔Excel中的每一行都要转化为该类型的对象〕

*paramfieldMap:

Excel中的中文列头和类的英文属性的对应关系Map

*paramuniqueFields:

指定业务主键组合〔即复合主键〕,这些列的组合不能重复

*return:

List

*throwsExcelException

*/

publicstaticListexcelToList(

InputStreamin,

StringsheetName,

ClassentityClass,

LinkedHashMapfieldMap,

String[]uniqueFields

)throwsExcelException{

//定义要返回的list

ListresultList=newArrayList();

try{

//根据Excel数据源创立WorkBook

Workbookwb=Workbook.getWorkbook(in);

//获取工作表

Sheetsheet=wb.getSheet(sheetName);

//获取工作表的有效行数

intrealRows=0;

for(inti=0;i

intnullCols=0;

for(intj=0;j

CellcurrentCell=sheet.getCell(j,i);

if(currentCell==null||"".equals(currentCell.getContents().toString())){

nullCols++;

}

}

if(nullCols==sheet.getColumns()){

break;

}else{

realRows++;

}

}

 

//如果Excel中没有数据那么提示错误

if(realRows<=1){

thrownewExcelException("Excel文件中没有任何数据");

}

 

Cell[]firstRow=sheet.getRow(0);

String[]excelFieldNames=newString[firstRow.length];

//获取Excel中的列名

for(inti=0;i

excelFieldNames[i]=firstRow[i].getContents().toString().trim();

}

//判断需要的字段在Excel中是否都存在

booleanisExist=true;

ListexcelFieldList=Arrays.asList(excelFieldNames);

for(StringName:

fieldMap.keySet()){

if(!

excelFieldList.contains(cnName)){

isExist=false;

break;

}

}

//如果有列名不存在,那么抛出异常,提示错误

if(!

isExist){

thrownewExcelException("Excel中缺少必要的字段,或字段名称有误");

}

 

//将列名和列号放入Map中,这样通过列名就可以拿到列号

LinkedHashMapcolMap=newLinkedHashMap();

for(inti=0;i

colMap.put(excelFieldNames[i],firstRow[i].getColumn());

}

 

//判断是否有重复行

//1.获取uniqueFields指定的列

Cell[][]uniqueCells=newCell[uniqueFields.length][];

for(inti=0;i

intcol=colMap.get(uniqueFields[i]);

uniqueCells[i]=sheet.getColumn(col);

}

//2.从指定列中寻找重复行

for(inti=1;i

intnullCols=0;

for(intj=0;j

StringcurrentContent=uniqueCells[j][i].getContents();

CellsameCell=sheet.findCell(currentContent,

uniqueCells[j][i].getColumn(),

uniqueCells[j][i].getRow()+1,

uniqueCells[j][i].getColumn(),

uniqueCells[j][realRows-1].getRow(),

true);

if(sameCell!

=null){

nullCols++;

}

}

if(nullCols==uniqueFields.length){

thrownewExcelException("Excel中有重复行,请检查");

}

}

//将sheet转换为list

for(inti=1;i

//新建要转换的对象

Tentity=entityClass.newInstance();

//给对象中的字段赋值

for(Entryentry:

fieldMap.entrySet()){

//获取中文字段名

StringNormalName=entry.getKey();

//获取英文字段名

StringenNormalName=entry.getValue();

//根据中文字段名获取列号

intcol=colMap.get(cnNormalName);

//获取当前单元格中的容

Stringcontent=sheet.getCell(col,i).getContents().toString().trim();

//给对象赋值

setFieldValueByName(enNormalName,content,entity);

}

resultList.add(entity);

}

}catch(Exceptione){

e.printStackTrace();

//如果是ExcelException,那么直接抛出

if(einstanceofExcelException){

throw(ExcelException)e;

//否那么将其它异常包装成ExcelException再抛出

}else{

e.printStackTrace();

thrownewExcelException("导入Excel失败");

}

}

returnresultList;

}

 

/*<-------------------------辅助的私有方法----------------------------------------------->*/

/**

*MethodName:

getFieldValueByName

*Description:

根据字段名获取字段值

*paramfieldName字段名

*paramo对象

*return字段值

*/

privatestaticObjectgetFieldValueByName(StringfieldName,Objecto)throwsException{

Objectvalue=null;

Fieldfield=getFieldByName(fieldName,o.getClass());

if(field!

=null){

field.setAccessible(true);

value=field.get(o);

}else{

thrownewExcelException(o.getClass().getSimpleName()+"类不存在字段名"+fieldName);

}

returnvalue;

}

/**

*MethodName:

getFieldByName

*Description:

根据字段名获取字段

*paramfieldName字段名

*paramclazz包含该字段的类

*return字段

*/

privatestaticFieldgetFieldByName(StringfieldName,Class

>clazz){

//拿到本类的所有字段

Field[]selfFields=clazz.getDeclaredFields();

//如果本类中存在该字段,那么返回

for(Fieldfield:

selfFields){

if(field.getName().equals(fieldName)){

returnfield;

}

}

//否那么,查看父类中是否存在此字段,如果有那么返回

Class

>superClazz=clazz.getSuperclass();

if(superClazz!

=null&&superClazz!

=Object.class){

returngetFieldByName(fieldName,superClazz);

}

//如果本类和父类都没有,那么返回空

returnnull;

}

 

/**

*MethodName:

getFieldValueByNameSequence

*Description:

*根据带路径或不带路径的属性名获取属性值

*

*paramfieldNameSequence带路径的属性名或简单属性名

*paramo对象

*return属性值

*throwsException

*/

privatestaticObjectgetFieldValueByNameSequence(StringfieldNameSequence,Objecto)throwsException{

Objectvalue=null;

//将fieldNameSequence进展拆分

String[]attributes=fieldNameSequence.split("\\.");

if(attributes.length==1){

value=getFieldValueByName(fieldNameSequence,o);

}else{

//根据属性名获取属性对象

ObjectfieldObj=getFieldValueByName(attributes[0],o);

StringsubFieldNameSequence=fieldNameSequence.substring(fieldNameSequence.indexOf(".")+1);

value=getFieldValueByNameSequence(subFieldNameSequence,fieldObj);

}

returnvalue;

}

 

/**

*MethodName:

setFieldValueByName

*Description:

根据字段名给对象的字段赋值

*paramfieldName字段名

*paramfieldValue字段值

*paramo对象

*/

privatestaticvoidsetFieldValueByName(StringfieldName,ObjectfieldValue,Object

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1