導出excel的兩種方式

引言

導出excel就是將後臺的數據在數據庫中查找出來,然後再將數據存放進excel表格中,這種操作多用於一些統計表中,將table中的數據導出來,存放進excel表格中.(最近在將手機中的短信往電腦中導出的時候,注意到導出來的文件就是一個excel表格,不得不說這個excel導入和導出的功能還是很強大的)
注:excel導入的技術可以在我的另一篇博客中去看https://blog.csdn.net/qq_36239350/article/details/84969607

話不多說,一起來看吧

兩種方法的比較:

excel導出和Word導出也有兩種方式,一種是前端導出,一種是後端導出,兩種方法可以說是各有優劣吧,

  1. 首先是前端導出,這種方法是利用了第三方插件,他的優點是利用簡簡單單的幾行代碼就可以將一個table中的數據導出到excel表格中,所以說他很簡潔,使用很方便,但是缺點也很明顯,就是對於大量的數據,一頁顯示不下的數據,想要將所有的數據一次性全部都導出來就辦不到了;
  2. 第二種後端導出的方法的優點就很明顯了,他的優點是支持大數據量的導出,缺點是導出的代碼很多,相對於前端導出比較繁瑣

前端導出

前臺導出:
引入js插件:<script src="${webpath }/static/js/tableExport.min.js" type="text/javascript"></script>
//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<columnNames.length;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 <T> void writeContext(HSSFSheet sheet, List<T> list,String[] dbColumnNames,boolean flag) {
		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, Object> model = new HashMap<String, Object>();
			// 表頭
			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<PatroDataImp> list = patroDataImpService.getAllSuccessPatroData(id);
			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,模板技術,這個我最近正在鑽研,後續還會繼續補充的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章