本文小编为大家详细介绍“如何创建一个Java工具类来导出Excel”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何创建一个Java工具类来导出Excel”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

项目实现
1、构建pom.xml

我们的工程是利用Maven来构建的,项目具体搭建过程大家可以参见网上其他资料,这里我们仅给出最核心的Maven配置

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.11-beta2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.11-beta2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.11-beta2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-excelant</artifactId><version>3.11-beta2</version></dependency>2、编写ExportExcelUtil类

这个类使我们整个工具的核心,它实现了Excel文件的导出功能,具体代码如下:

packagecom.lyz.utils.excel.poi;importjava.io.IOException;importjava.io.OutputStream;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.text.SimpleDateFormat;importjava.util.Collection;importjava.util.Date;importjava.util.Iterator;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.commons.lang3.StringUtils;importorg.apache.poi.hssf.usermodel.HSSFCell;importorg.apache.poi.hssf.usermodel.HSSFCellStyle;importorg.apache.poi.hssf.usermodel.HSSFFont;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.hssf.util.HSSFColor;importorg.apache.poi.xssf.usermodel.XSSFCell;importorg.apache.poi.xssf.usermodel.XSSFCellStyle;importorg.apache.poi.xssf.usermodel.XSSFColor;importorg.apache.poi.xssf.usermodel.XSSFFont;importorg.apache.poi.xssf.usermodel.XSSFRichTextString;importorg.apache.poi.xssf.usermodel.XSSFRow;importorg.apache.poi.xssf.usermodel.XSSFSheet;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;/***导出Excel*@authorliuyazhuang**@param<T>*/publicclassExportExcelUtil<T>{//2007版本以上最大支持1048576行publicfinalstaticStringEXCEl_FILE_2007="2007";//2003版本最大支持65536行publicfinalstaticStringEXCEL_FILE_2003="2003";/***<p>*导出无头部标题行Excel<br>*时间格式默认:yyyy-MM-ddhh:mm:ss<br>*</p>**@paramtitle表格标题*@paramdataset数据集合*@paramout输出流*@paramversion2003或者2007,不传时默认生成2003版本*/publicvoidexportExcel(Stringtitle,Collection<T>dataset,OutputStreamout,Stringversion){if(StringUtils.isEmpty(version)||EXCEL_FILE_2003.equals(version.trim())){exportExcel2003(title,null,dataset,out,"yyyy-MM-ddHH:mm:ss");}else{exportExcel2007(title,null,dataset,out,"yyyy-MM-ddHH:mm:ss");}}/***<p>*导出带有头部标题行的Excel<br>*时间格式默认:yyyy-MM-ddhh:mm:ss<br>*</p>**@paramtitle表格标题*@paramheaders头部标题集合*@paramdataset数据集合*@paramout输出流*@paramversion2003或者2007,不传时默认生成2003版本*/publicvoidexportExcel(Stringtitle,String[]headers,Collection<T>dataset,OutputStreamout,Stringversion){if(StringUtils.isBlank(version)||EXCEL_FILE_2003.equals(version.trim())){exportExcel2003(title,headers,dataset,out,"yyyy-MM-ddHH:mm:ss");}else{exportExcel2007(title,headers,dataset,out,"yyyy-MM-ddHH:mm:ss");}}/***<p>*通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中<br>*此版本生成2007以上版本的文件(文件后缀:xlsx)*</p>**@paramtitle*表格标题名*@paramheaders*表格头部标题集合*@paramdataset*需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的*JavaBean属性的数据类型有基本数据类型及String,Date*@paramout*与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中*@parampattern*如果有时间数据,设定输出格式。默认为"yyyy-MM-ddhh:mm:ss"*/@SuppressWarnings({"unchecked","rawtypes"})publicvoidexportExcel2007(Stringtitle,String[]headers,Collection<T>dataset,OutputStreamout,Stringpattern){//声明一个工作薄XSSFWorkbookworkbook=newXSSFWorkbook();//生成一个表格XSSFSheetsheet=workbook.createSheet(title);//设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth(20);//生成一个样式XSSFCellStylestyle=workbook.createCellStyle();//设置这些样式style.setFillForegroundColor(newXSSFColor(java.awt.Color.gray));style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(XSSFCellStyle.BORDER_THIN);style.setBorderLeft(XSSFCellStyle.BORDER_THIN);style.setBorderRight(XSSFCellStyle.BORDER_THIN);style.setBorderTop(XSSFCellStyle.BORDER_THIN);style.setAlignment(XSSFCellStyle.ALIGN_CENTER);//生成一个字体XSSFFontfont=workbook.createFont();font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);font.setFontName("宋体");font.setColor(newXSSFColor(java.awt.Color.BLACK));font.setFontHeightInPoints((short)11);//把字体应用到当前的样式style.setFont(font);//生成并设置另一个样式XSSFCellStylestyle2=workbook.createCellStyle();style2.setFillForegroundColor(newXSSFColor(java.awt.Color.WHITE));style2.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);style2.setBorderRight(XSSFCellStyle.BORDER_THIN);style2.setBorderTop(XSSFCellStyle.BORDER_THIN);style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);//生成另一个字体XSSFFontfont2=workbook.createFont();font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);//把字体应用到当前的样式style2.setFont(font2);//产生表格标题行XSSFRowrow=sheet.createRow(0);XSSFCellcellHeader;for(inti=0;i<headers.length;i++){cellHeader=row.createCell(i);cellHeader.setCellStyle(style);cellHeader.setCellValue(newXSSFRichTextString(headers[i]));}//遍历集合数据,产生数据行Iterator<T>it=dataset.iterator();intindex=0;Tt;Field[]fields;Fieldfield;XSSFRichTextStringrichString;Patternp=Pattern.compile("^//d+(//.//d+)?$");Matchermatcher;StringfieldName;StringgetMethodName;XSSFCellcell;ClasstCls;MethodgetMethod;Objectvalue;StringtextValue;SimpleDateFormatsdf=newSimpleDateFormat(pattern);while(it.hasNext()){index++;row=sheet.createRow(index);t=(T)it.next();//利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值fields=t.getClass().getDeclaredFields();for(inti=0;i<fields.length;i++){cell=row.createCell(i);cell.setCellStyle(style2);field=fields[i];fieldName=field.getName();getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);try{tCls=t.getClass();getMethod=tCls.getMethod(getMethodName,newClass[]{});value=getMethod.invoke(t,newObject[]{});//判断值的类型后进行强制类型转换textValue=null;if(valueinstanceofInteger){cell.setCellValue((Integer)value);}elseif(valueinstanceofFloat){textValue=String.valueOf((Float)value);cell.setCellValue(textValue);}elseif(valueinstanceofDouble){textValue=String.valueOf((Double)value);cell.setCellValue(textValue);}elseif(valueinstanceofLong){cell.setCellValue((Long)value);}if(valueinstanceofBoolean){textValue="是";if(!(Boolean)value){textValue="否";}}elseif(valueinstanceofDate){textValue=sdf.format((Date)value);}else{//其它数据类型都当作字符串简单处理if(value!=null){textValue=value.toString();}}if(textValue!=null){matcher=p.matcher(textValue);if(matcher.matches()){//是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));}else{richString=newXSSFRichTextString(textValue);cell.setCellValue(richString);}}}catch(SecurityExceptione){e.printStackTrace();}catch(NoSuchMethodExceptione){e.printStackTrace();}catch(IllegalArgumentExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(InvocationTargetExceptione){e.printStackTrace();}finally{//清理资源}}}try{workbook.write(out);}catch(IOExceptione){e.printStackTrace();}}/***<p>*通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中<br>*此方法生成2003版本的excel,文件名后缀:xls<br>*</p>**@paramtitle*表格标题名*@paramheaders*表格头部标题集合*@paramdataset*需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的*JavaBean属性的数据类型有基本数据类型及String,Date*@paramout*与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中*@parampattern*如果有时间数据,设定输出格式。默认为"yyyy-MM-ddhh:mm:ss"*/@SuppressWarnings({"unchecked","rawtypes"})publicvoidexportExcel2003(Stringtitle,String[]headers,Collection<T>dataset,OutputStreamout,Stringpattern){//声明一个工作薄HSSFWorkbookworkbook=newHSSFWorkbook();//生成一个表格HSSFSheetsheet=workbook.createSheet(title);//设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth(20);//生成一个样式HSSFCellStylestyle=workbook.createCellStyle();//设置这些样式style.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//生成一个字体HSSFFontfont=workbook.createFont();font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);font.setFontName("宋体");font.setColor(HSSFColor.WHITE.index);font.setFontHeightInPoints((short)11);//把字体应用到当前的样式style.setFont(font);//生成并设置另一个样式HSSFCellStylestyle2=workbook.createCellStyle();style2.setFillForegroundColor(HSSFColor.WHITE.index);style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);style2.setBorderRight(HSSFCellStyle.BORDER_THIN);style2.setBorderTop(HSSFCellStyle.BORDER_THIN);style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//生成另一个字体HSSFFontfont2=workbook.createFont();font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//把字体应用到当前的样式style2.setFont(font2);//产生表格标题行HSSFRowrow=sheet.createRow(0);HSSFCellcellHeader;for(inti=0;i<headers.length;i++){cellHeader=row.createCell(i);cellHeader.setCellStyle(style);cellHeader.setCellValue(newHSSFRichTextString(headers[i]));}//遍历集合数据,产生数据行Iterator<T>it=dataset.iterator();intindex=0;Tt;Field[]fields;Fieldfield;HSSFRichTextStringrichString;Patternp=Pattern.compile("^//d+(//.//d+)?$");Matchermatcher;StringfieldName;StringgetMethodName;HSSFCellcell;ClasstCls;MethodgetMethod;Objectvalue;StringtextValue;SimpleDateFormatsdf=newSimpleDateFormat(pattern);while(it.hasNext()){index++;row=sheet.createRow(index);t=(T)it.next();//利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值fields=t.getClass().getDeclaredFields();for(inti=0;i<fields.length;i++){cell=row.createCell(i);cell.setCellStyle(style2);field=fields[i];fieldName=field.getName();getMethodName="get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);try{tCls=t.getClass();getMethod=tCls.getMethod(getMethodName,newClass[]{});value=getMethod.invoke(t,newObject[]{});//判断值的类型后进行强制类型转换textValue=null;if(valueinstanceofInteger){cell.setCellValue((Integer)value);}elseif(valueinstanceofFloat){textValue=String.valueOf((Float)value);cell.setCellValue(textValue);}elseif(valueinstanceofDouble){textValue=String.valueOf((Double)value);cell.setCellValue(textValue);}elseif(valueinstanceofLong){cell.setCellValue((Long)value);}if(valueinstanceofBoolean){textValue="是";if(!(Boolean)value){textValue="否";}}elseif(valueinstanceofDate){textValue=sdf.format((Date)value);}else{//其它数据类型都当作字符串简单处理if(value!=null){textValue=value.toString();}}if(textValue!=null){matcher=p.matcher(textValue);if(matcher.matches()){//是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));}else{richString=newHSSFRichTextString(textValue);cell.setCellValue(richString);}}}catch(SecurityExceptione){e.printStackTrace();}catch(NoSuchMethodExceptione){e.printStackTrace();}catch(IllegalArgumentExceptione){e.printStackTrace();}catch(IllegalAccessExceptione){e.printStackTrace();}catch(InvocationTargetExceptione){e.printStackTrace();}finally{//清理资源}}}try{workbook.write(out);}catch(IOExceptione){e.printStackTrace();}}}

为了演示导出功能,这里我们创建了一个Student学生类。

3、创建Student类

packagecom.lyz.utils.excel.poi;/***例子JavaBean*@authorliuyazhuang**/publicclassStudent{privateintid;privateStringname;privateStringsex;publicStudent(intid,Stringname,Stringsex){this.id=id;this.name=name;this.sex=sex;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicStringgetSex(){returnsex;}publicvoidsetSex(Stringsex){this.sex=sex;}}4、创建测试类TestExportExcelUtil

这个类,主要是用来测试我们的工具类。具体代码如下:

packagecom.lyz.test;importjava.io.FileOutputStream;importjava.util.ArrayList;importjava.util.List;importcom.lyz.utils.excel.poi.ExportExcelUtil;importcom.lyz.utils.excel.poi.Student;/***测试文件导出*@authorliuyazhuang**/publicclassTestExportExcelUtil{publicstaticvoidmain(String[]args)throwsException{ExportExcelUtil<Student>util=newExportExcelUtil<Student>();//准备数据List<Student>list=newArrayList<>();for(inti=0;i<10;i++){list.add(newStudent(111,"张三asdf","男"));list.add(newStudent(111,"李四asd","男"));list.add(newStudent(111,"王五","女"));}String[]columnNames={"ID","姓名","性别"};util.exportExcel("用户导出",columnNames,list,newFileOutputStream("E:/test.xls"),ExportExcelUtil.EXCEL_FILE_2003);}}5、测试

我们运行TestExportExcelUtil类,会发现在我们的E盘下生成了test.xls文件,具体如下:

项目扩展

以上实现均是在本地磁盘生成excel文件,但更多的时候,我们需要通过点击网页上的某个按钮来自动生成并下载Excel文档,那么,这又如何实现呢?下面我们就一起来实现这个功能。

1、扩展ExportExcelUtil类

根据Java的继承思想,我们不在ExportExcelUtil类上修改添加,我们创建一个ExportExcelUtil类的子类ExportExcelWrapper,这个类继承ExportExcelUtil的所有功能,同时,扩展了网页生成Excel的功能。具体代码如下:

packagecom.lyz.utils.excel.poi;importjava.net.URLEncoder;importjava.util.Collection;importjavax.servlet.http.HttpServletResponse;importorg.apache.commons.lang3.StringUtils;/***包装类*@authorliuyazhuang**@param<T>*/publicclassExportExcelWrapper<T>extendsExportExcelUtil<T>{/***<p>*导出带有头部标题行的Excel<br>*时间格式默认:yyyy-MM-ddhh:mm:ss<br>*</p>**@paramtitle表格标题*@paramheaders头部标题集合*@paramdataset数据集合*@paramout输出流*@paramversion2003或者2007,不传时默认生成2003版本*/publicvoidexportExcel(StringfileName,Stringtitle,String[]headers,Collection<T>dataset,HttpServletResponseresponse,Stringversion){try{response.setContentType("application/vnd.ms-excel");response.addHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".xls");if(StringUtils.isBlank(version)||EXCEL_FILE_2003.equals(version.trim())){exportExcel2003(title,headers,dataset,response.getOutputStream(),"yyyy-MM-ddHH:mm:ss");}else{exportExcel2007(title,headers,dataset,response.getOutputStream(),"yyyy-MM-ddHH:mm:ss");}}catch(Exceptione){e.printStackTrace();}}}

这样,我们可以在Controller层调用ExportExcelWrapper将相关的数据和HttpServletResponse传递进来,即可实现通过网页生生并下载Excel文档了。

2、编写Controller类

@Controller("test")@RequestMapping("/test")publicclassTestController{@RequestMapping("/get/excel")publicvoidgetExcel(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{//准备数据List<Student>list=newArrayList<>();for(inti=0;i<10;i++){list.add(newStudent(111,"张三asdf","男"));list.add(newStudent(111,"李四asd","男"));list.add(newStudent(111,"王五","女"));}String[]columnNames={"ID","姓名","性别"};StringfileName="excel1";ExportExcelWrapper<Student>util=newExportExcelWrapper<Student>();util.exportExcel(fileName,fileName,columnNames,list,response,ExportExcelUtil.EXCEL_FILE_2003);}}3、编写index.html

这个网页很简单,具体实现如下:

<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>导出Excel</title></head><body><formid="form_login"action="http://127.0.0.1:8080/test/get/excel"method="post"></form><buttonid="btn-submit"onclick="beforeSubmit()">Submit</button><scripttype="text/javascript">varloginForm=document.getElementById('form_login');functionbeforeSubmit(){loginForm.submit();}</script></body></html>

读到这里,这篇“如何创建一个Java工具类来导出Excel”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。