Excel匯出 並完成後自動開啟

librag發表於2019-03-19

java 設定Response 實現自動下載Excel並完成後自動開啟

實現 下載檔案完成後自動開啟 本文以Excel為例子 環境為SpringMVC
maven依賴如下:

		<!--檔案上傳-->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.1</version>
		</dependency>
                <dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.5</version>
		</dependency>
		
		<!--poi-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>3.9</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.9</version>
		</dependency>


//SpringMVC
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.MultipartFile;
//java.io
import java.io.InputStream;
import java.io.IOException;
//Servlet
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
//poi
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

我們可以設定response的請求頭來讓瀏覽器識別,做出相應的效果

// 故障匯出
	@RequestMapping(value = "doExportHideFaultGuide")  
	public ModelAndView doExportHideFaultGuide(@RequestParam String[] trainType,HttpServletResponse response){
		
		//表示“我不清楚程式碼內容,只需要儲存為一個檔案
		response.setContentType("application/octet-stream");
		//檔案的名字
		response.setHeader("name", "隱性規則.xls");
		//Cach-Control的作用: https://blog.csdn.net/u012375924/article/details/82806617
		//關於 Cache-Control 的 must-revalidate 表示強制頁面不快取,作用與 no-cache 相同,但是是強制的意思 
		//詳細請參考:http://hi.baidu.com/chenleibupt/blog/item/9627bec6932e5a179c163df2.html
		//post-check=0, pre-check=0 為IE5的指令
		response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
		//快取指令
		response.setHeader("Pragma", "public");
		//設定頁面立即過期  頁面立刻過期 (關閉)
		response.setDateHeader("Expires", 0);
		
		//資料集合
		List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();
		
		try {
			//設定檔名和編碼
			response.setHeader("Content-disposition", "attachment; filename=\""
					+ new String(fileName.getBytes("UTF-8"), "ISO-8859-1") + "\"");
			try {
				//需要匯出的map集合(獲取資料集合)
				list = evGroupService.selectHideFaultGuide(trainType);
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			//也開這樣寫evGroupService.doExport(list).write(response.getOutputStream());
			//這裡的操作為 將資料集合抓換成SXSSFWorkbook 物件
			SXSSFWorkbook doExport = evGroupService.doExport(list);
			
			doExport.write(response.getOutputStream());
			response.getOutputStream().flush();
			response.getOutputStream().close();
		} catch (Exception e) {
			Log.warn("引數統計分析匯出異常!!!",e);
		}
		
		return null;
	}
//evGroupService.doExport 方法 此處的使用 poi
@Override
	public SXSSFWorkbook doExport(List<Map<String, Object>> list) throws Exception {
		
		//工作簿構建時指定視窗大小
		SXSSFWorkbook workbook = new SXSSFWorkbook(100);
		//建立工作簿的一個工作表
		Sheet sheet = workbook.createSheet();
		//凍結工作表前兩行
		sheet.createFreezePane(0, 1, 0, 1); /
		
		// sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));//合併單元格
		// sheet.setColumnWidth(0, 32 * 80);// 對A列設定寬度為180畫素
		
		//匯出的title陣列
		String[] headerTitles = { "序號",  "車型", "頻率型別", "頻率次數","預警等級", "故障程式碼", "預警提示" };

		//setColumnWidth設定每列寬度(第幾列,寬度)
		for (int i = 0; i < headerTitles.length; i++) {
			sheet.setColumnWidth(i, 32 * 180);// 對A列設定寬度為180畫素
		}
		//獲取樣式
		CellStyle headerStyle0 = ExcelStyle.getHeaderStyleA(workbook);
		CellStyle contentStyle = ExcelStyle.getContentStyle(workbook);
		//建立下標為0一行(第一行)
		Row row = sheet.createRow(0);// 設定第一行資訊
		//setHeight高
		row.setHeight((short) (32 * 18));
		
		//格子
		Cell cell = null;
		
		for (int i = 0; i < headerTitles.length; i++) {
			//建立第一格
			cell = row.createCell(i);
			//設定值和樣式
			cell.setCellValue(headerTitles[i]);
			cell.setCellStyle(headerStyle0);
		}
		
		//要匯出的物件 遍歷第一行
		for (int i = 0; i < list.size(); i++) {
			//從第二行開始
			row = sheet.createRow(i + 1);
			//設值和樣式
			for (int j = 0; j < headerTitles.length; j++) {
				cell = row.createCell(j);
				cell.setCellStyle(contentStyle);
			}
			
			//獲取當前行 資料物件
			Map<String, Object> map = list.get(i);
			
			//設定第一格序號
			row.getCell(0).setCellValue(String.valueOf(i + 1));
			
			//第二格資料
			row.getCell(1).setCellValue(map.get("TRAINNAME").toString());
			
			
			//頻率型別 對值進行判斷
			if(map.get("DTYPE") != null){
				if("0".equals(map.get("DTYPE").toString())){
					row.getCell(2).setCellValue("任何一次");
				}else if("3".equals(map.get("DTYPE").toString())){
					row.getCell(2).setCellValue("日均");
				}else if("8".equals(map.get("DTYPE").toString())){
					row.getCell(2).setCellValue("持續天數");
				}
			}
			
			//頻率次數 第四格資料
			if(map.get("DSCOPE") != null ){
				row.getCell(3).setCellValue(map.get("DSCOPE").toString());
			}else{
				row.getCell(3).setCellValue("");
			}
			//預警等級 第五格資料
			if(map.get("LVL") != null){
				row.getCell(4).setCellValue(map.get("LVL").toString());
			}else{
				row.getCell(4).setCellValue("");
			}
			//故障程式碼 第六格資料
			if(map.get("FT_CODE") != null){
				row.getCell(5).setCellValue(map.get("FT_CODE").toString());
			}else{
				row.getCell(5).setCellValue("");
			}
			//預警提示 第七格資料
			if(map.get("EVENT") != null){
				row.getCell(6).setCellValue(map.get("EVENT").toString());
			}else{
				row.getCell(6).setCellValue("");
			}
		}
		return workbook;
	}

/**
	 * 
	* @Description: 2007擴充套件方法
	* @param workbook
	* @return CellStyle
	* @throws
	* @author LiLW
	* @date 2017年4月19日 下午3:13:25  
	* @version V1.0
	 */
	public static CellStyle getHeaderStyleA(SXSSFWorkbook workbook) {

		// 建立樣式
		Font font1 = workbook.createFont();
		// 字型加粗
		font1.setFontName("黑體");
		font1.setFontHeightInPoints((short) 12);// 設定字型大小
		// font1.setColor(HSSFColor.LIGHT_BLUE.index); //綠字
		font1.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);

		CellStyle headerStyle = workbook.createCellStyle();
		// 設定垂直居中
		headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
		// 設定邊框
		headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		headerStyle.setFont(font1);
		headerStyle.setWrapText(true); 

		return headerStyle;
	}
	
	/**
	 * 
	* @Description: 2007擴充套件方法
	* @param workbook
	* @return CellStyle
	* @throws
	* @author LiLW
	* @date 2017年4月19日 下午3:18:46  
	* @version V1.0
	 */
	public static CellStyle getContentStyle(SXSSFWorkbook workbook) {

		// 設定內容行格式
		CellStyle contentStyle = workbook.createCellStyle();
		// 設定垂直居中
		contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
		// 設定邊框
		contentStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

		return contentStyle;
	}

相關文章