版本二:
第一步:先写一个ExportExcelUtil工具类
package com.jttxtech.www.util;
import java.io.OutputStream; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; 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.hssf.util.HSSFColor; import org.apache.poi.ss.util.CellRangeAddress; /** * 通用的导出Excel类,如果需要自定义格式的,参照此类自己再写类或方法来实现 * dataList里的每一个Object数组一个元素(object[0])都是序号,不可放真实数据 * @author<span style="white-space:pre;"> </span>TMACJ */ public class ExportExcelUtil { private String title; // 导出表格的表名 private String[] rowName;// 导出表格的列名 private List<Object[]> dataList = new ArrayList<Object[]>(); // 对象数组的List集合 private HttpServletResponse response; private HttpServletRequest request; /** * 实例化导出类 * @param title 导出表格的表名,最好是英文,中文可能出现乱码 * @param rowName 导出表格的列名数组 * @param dataList 对象数组的List集合 * @param response */ public ExportExcelUtil(String title,String[] rowName,List<Object[]> dataList, HttpServletRequest request, HttpServletResponse response){ this.title=title; this.rowName=rowName; this.dataList=dataList; this.response =response; this.request = request; } // 导出数据 public void exportData() throws Exception{ HSSFWorkbook workbook =new HSSFWorkbook(); // 创建一个excel对象 HSSFSheet sheet =workbook.createSheet(title); // 创建表格 //sheet.setDefaultRowHeightInPoints(18.5f); // sheet样式定义 HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook,16); // 头样式 HSSFCellStyle columnStyle = this.getColumnStyle(workbook,14); // 标题样式 HSSFCellStyle style = this.getStyle(workbook,11); // 单元格样式 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, (rowName.length-1)));// 合并第一行的所有列 // 产生表格标题行 HSSFRow rowm =sheet.createRow(0); // 行 rowm.setHeightInPoints(26f); HSSFCell cellTiltle =rowm.createCell(0); // 单元格 cellTiltle.setCellStyle(columnTopStyle); cellTiltle.setCellValue(title); int columnNum = rowName.length; // 表格列的长度 HSSFRow rowRowName = sheet.createRow(1); // 在第二行创建行 HSSFCellStyle cells =workbook.createCellStyle(); cells.setBottomBorderColor(HSSFColor.BLACK.index); rowRowName.setRowStyle(cells); // 循环 将列名放进去 for (int i = 0; i < columnNum; i++) { HSSFCell cellRowName = rowRowName.createCell(i); cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 单元格类型 HSSFRichTextString text = new HSSFRichTextString(rowName[i]); // 得到列的值 cellRowName.setCellValue(text); // 设置列的值 cellRowName.setCellStyle(columnStyle); // 样式 } // 将查询到的数据设置到对应的单元格中 for (int i = 0; i < dataList.size(); i++) { Object[] obj = dataList.get(i);//遍历每个对象 HSSFRow row = sheet.createRow(i+2);//创建所需的行数 for (int j = 0; j < obj.length; j++) { HSSFCell cell = null; //设置单元格的数据类型 if(j==0){ // 第一列设置为序号 cell = row.createCell(j,HSSFCell.CELL_TYPE_NUMERIC); cell.setCellValue(i+1); }else{ cell = row.createCell(j,HSSFCell.CELL_TYPE_STRING); if(!"".equals(obj[j]) && obj[j] != null){ cell.setCellValue(obj[j].toString()); //设置单元格的值 }else{ cell.setCellValue(" "); } } cell.setCellStyle(style); // 样式 } } // 让列宽随着导出的列长自动适应,但是对中文支持不是很好 也可能在linux(无图形环境的操作系统)下报错,报错再说 for (int i = 0; i < columnNum; i++) { sheet.autoSizeColumn(i); sheet.setColumnWidth(i, sheet.getColumnWidth(i)+888);//适当再宽点 } if(workbook !=null){ // 输出到服务器上 // FileOutputStream fileOutputStream = new FileOutputStream("D:/user.xls"); // workbook.write(fileOutputStream);//将数据写出去 // fileOutputStream.close();//关闭输出流 // 输出到用户浏览器上 OutputStream out = response.getOutputStream(); try { // excel 表文件名 String fileName = title + DateFormatUtils.format(new Date(), "yyyyMMddHHmmss") + ".xls"; String fileName11 = ""; String userAgent = request.getHeader("USER-AGENT"); if(StringUtils.contains(userAgent, "Firefox") || StringUtils.contains(userAgent, "firefox")){//火狐浏览器 fileName11 = new String(fileName.getBytes(), "ISO8859-1"); }else{ fileName11 = URLEncoder.encode(fileName,"UTF-8");//其他浏览器 } String headStr = "attachment; filename=\"" + fileName11 + "\""; response.setContentType("APPLICATION/OCTET-STREAM"); // response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition", headStr); workbook.write(out); out.flush(); workbook.close(); } catch (Exception e) { throw e; } finally { if (null != out) { out.close(); } } } } public HSSFCellStyle getColumnTopStyle(HSSFWorkbook workbook,int fontSize) { // 设置字体 HSSFFont font = workbook.createFont(); //设置字体大小 font.setFontHeightInPoints((short)fontSize); //字体加粗 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置字体名字 font.setFontName("宋体"); //设置样式; HSSFCellStyle style = workbook.createCellStyle(); //在样式用应用设置的字体; style.setFont(font); //设置自动换行; style.setWrapText(false); //设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } public HSSFCellStyle getColumnStyle(HSSFWorkbook workbook,int fontSize) { // 设置字体 HSSFFont font = workbook.createFont(); //设置字体大小 font.setFontHeightInPoints((short)fontSize); //字体加粗 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置字体名字 font.setFontName("宋体"); //设置样式; HSSFCellStyle style = workbook.createCellStyle(); //设置底边框; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //设置底边框颜色; style.setBottomBorderColor(HSSFColor.BLACK.index); //设置左边框; style.setBorderLeft(HSSFCellStyle.BORDER_THIN); //设置左边框颜色; style.setLeftBorderColor(HSSFColor.BLACK.index); //设置右边框; style.setBorderRight(HSSFCellStyle.BORDER_THIN); //设置右边框颜色; style.setRightBorderColor(HSSFColor.BLACK.index); //设置顶边框; style.setBorderTop(HSSFCellStyle.BORDER_THIN); //设置顶边框颜色; style.setTopBorderColor(HSSFColor.BLACK.index); //在样式用应用设置的字体; style.setFont(font); //设置自动换行; style.setWrapText(false); //设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } public HSSFCellStyle getStyle(HSSFWorkbook workbook,int fontSize) { //设置字体 HSSFFont font = workbook.createFont(); //设置字体大小 font.setFontHeightInPoints((short)fontSize); //字体加粗 //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //设置字体名字 font.setFontName("宋体"); //设置样式; HSSFCellStyle style = workbook.createCellStyle(); //设置底边框; style.setBorderBottom(HSSFCellStyle.BORDER_THIN); //设置底边框颜色; style.setBottomBorderColor(HSSFColor.BLACK.index); //设置左边框; style.setBorderLeft(HSSFCellStyle.BORDER_THIN); //设置左边框颜色; style.setLeftBorderColor(HSSFColor.BLACK.index); //设置右边框; style.setBorderRight(HSSFCellStyle.BORDER_THIN); //设置右边框颜色; style.setRightBorderColor(HSSFColor.BLACK.index); //设置顶边框; style.setBorderTop(HSSFCellStyle.BORDER_THIN); //设置顶边框颜色; style.setTopBorderColor(HSSFColor.BLACK.index); //在样式用应用设置的字体; style.setFont(font); //设置自动换行; style.setWrapText(false); //设置水平对齐的样式为居中对齐; style.setAlignment(HSSFCellStyle.ALIGN_CENTER); //设置垂直对齐的样式为居中对齐; style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); return style; } }
以上代码可直接复制使用
第二步:使用控制器调用工具类,并传递工具类所需参数
@RequestMapping("/api/Export")
@ResponseBody public String Export(HttpServletRequest request,HttpServletResponse response) throws Exception{ List<ProductRecordBean> dataList = productRecordService.findAll(); List<Object[]> data = new ArrayList<Object[]>(); Object[] objs = null; for(ProductRecordBean p : dataList) { //此代码是将List<ProductRecordBean>转换成工具类需要的参数类型List<Object[]> objs=new Object[6]; objs[0]=p.getRecord_data().toString();//此段代码无意义,因为工具类规定每行第一列将为序号列 objs[1]=p.getRecord_data().toString(); objs[2]=p.getSubmit_time(); objs[3]=p.getUpdate_time(); objs[4]=p.getInfo_id(); objs[5]=p.getProject_code(); data.add(objs); } String[]name= {"编号","数据","提交时间","更新时间","提交人","项目编码"}; ExportExcelUtil e=new ExportExcelUtil("项目记录表",name,data,request,response); e.exportData(); return null; }
第三步:通过前端代码来访问控制器
前端这段代码使用angularjs来写的,
注意:导出的请求不能用异步的,异步没效果,
这里你可以使用ocation.href
就是有效果的,反正不能用异步请求
好多人跟我刚开始一样,代码都没错,就是点击导出,excel并没有导出,这里就是使用了ajax请求的缘故
//导出项目记录表
$scope.Export=function(){ location.href="/jttx_record/api/Export.do"; }
至此,Excel导出代码结束
写此博客,是对自己技术的总结,也希望可以帮助别人,有不懂或着不同观点可留言,不喜勿喷........