引言
导出excel就是将后台的数据在数据库中查找出来,然后再将数据存放进excel表格中,这种操作多用于一些统计表中,将table中的数据导出来,存放进excel表格中.(最近在将手机中的短信往电脑中导出的时候,注意到导出来的文件就是一个excel表格,不得不说这个excel导入和导出的功能还是很强大的)
注:excel导入的技术可以在我的另一篇博客中去看https://blog.csdn.net/qq_36239350/article/details/84969607
话不多说,一起来看吧
两种方法的比较:
excel导出和Word导出也有两种方式,一种是前端导出,一种是后端导出,两种方法可以说是各有优劣吧,
首先是前端导出,这种方法是利用了第三方插件,他的优点是利用简简单单的几行代码就可以将一个table中的数据导出到excel表格中,所以说他很简洁,使用很方便,但是缺点也很明显,就是对于大量的数据,一页显示不下的数据,想要将所有的数据一次性全部都导出来就办不到了;第二种后端导出的方法的优点就很明显了,他的优点是支持大数据量的导出,缺点是导出的代码很多,相对于前端导出比较繁琐
前端导出
前台导出:
引入js插件:
//excel导出
function exportPageTable() {
$('#table的ID').tableExport({
type : 'excel',
escape : 'false',
fileName : '导出的文件名称'
});
$("#wordExcel").wordExport('导出的文件名称');
}
完成!
很简单吧,就这样几行代码,就完成excel的导出了
后端导出
首先是工具类:
工具类:
package org.changneng.framework.frameworkcore.utils;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;
/**
* 生成excel视图,可用excel工具打开或者保存
* 由ViewController的return new ModelAndView(viewExcel, model)生成
*/
public class ViewExcel extends AbstractExcelView {
public void buildExcelDocument(Map model, HSSFWorkbook workbook,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
String[] columnNames = (String[]) model.get("columnNames");
String[] dbColumnNames = (String[]) model.get("dbColumnNames");
String excelName = model.get("excelName")==null?"导出文件.xls":model.get("excelName").toString();
String sheetName = model.get("sheetName")==null?"sheet1":model.get("sheetName").toString();
// 设置response方式,使执行此controller时候自动出现下载页面,而非直接使用excel打开
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(excelName, "UTF-8"));
List resultList = (List) model.get("list");
// 产生Excel表头
HSSFSheet sheet = workbook.createSheet(sheetName);
//设置默认宽度、高度
sheet.setDefaultColumnWidth(25);
sheet.setDefaultRowHeight(new Short(400+""));
HSSFRow header = sheet.createRow(0);
//第一列是否为序号
boolean flag = (Boolean)model.get("flag");
int start = 0;
int length = columnNames.length;
// 第0行
// 产生标题列
if(flag){
header.createCell((short) start).setCellValue("序号");
start++;
}
for(int i=0;i header.createCell((short) start).setCellValue(columnNames[i]); start++; } HSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("mm/dd/yyyy")); writeContext(sheet, resultList, dbColumnNames,flag); } private int rows = list.size(); int cols = dbColumnNames.length; String columnName = null; Object value = null; try { for (int i = 0; i < rows; i++) { HSSFRow row = sheet.createRow(i+1); T t = (T) list.get(i); //第一列为序号 int start = 0; if(flag){ row.createCell((short) start) .setCellValue(i+1); start++; } for (int j = 0; j < cols; j++) { columnName = dbColumnNames[j]; value = PropertyUtils.getProperty(t, columnName); if(ChangnengUtil.isNull(value)){ value=""; } if(value instanceof Date){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); value = sdf.format(value); } row.createCell((short) start) .setCellValue(value+""); start++; } } } catch (Exception e) { e.printStackTrace(); } } } 接下来再给出一个完整的例子: 使用示例: @RequestMapping("/downSuccessFile") public ModelAndView downSuccessFile(HttpServletRequest request, HttpServletResponse response,HSSFWorkbook workbook, @RequestParam(value = "id", required = false) String id) { try {{ ViewExcel viewExcel = new ViewExcel(); Map // 表头 String[] columnNames = { "巡查编号(本地系统)", "巡查人", "巡查时间", "巡查描述", "巡查地点东经", "巡查地点北纬" }; model.put("columnNames", columnNames); // list集合对应的值 String[] dbColumnNames = { "localSysNo", "patroName", "patrolDate", "title", "gisCoordinateX", "gisCoordinateY"}; model.put("dbColumnNames", dbColumnNames); // SysUsers user = (SysUsers) // SecurityContextHolder.getContext().getAuthentication() .getPrincipal(); List model.put("list", list); // excel文件的名称 model.put("excelName", "巡查台账导入成功列表" + DateUtil.getDateTime("yyyyMMddHHmmss") + ".xls"); // excel 文件的sheet model.put("sheetName", "sheet1"); // 标记序号 model.put("flag", true); viewExcel.buildExcelDocument(model, workbook, request, response); return new ModelAndView(new ViewExcel(), model); }} catch (Exception e) { e.printStackTrace(); } return null; } 代码虽然比较多,但是比较简单,只要使用工具类就可以完成了 其实还有第三种方式,是利用framework,模板技术,这个我最近正在钻研,后续还会继续补充的