SSM專案檔案下載方法二
阿新 • • 發佈:2019-01-29
思路:
(1)通過ajax提交表單資料至一個Controller,由引數查詢出資料集合,存入excel檔案,返回excel檔名
(2)使用js window.open()方法訪問檔案下載的Controller,下載之前生成的檔案
(3)下載完成之後刪除檔案,因為檔案儲存在專案路徑下,覺得還是刪掉比較好,日後優化可以設定一個定時任務,定期刪掉也行。
<form role="form" method="post" id="speedFrom">
.......表單內容
<div class="form-group">
<button type="button" class="btn btn-info" id="dlspeed" >下載資料檔案</button>
</div>
</form>
button 繫結事件
$(document).ready(function() {
//按鈕下載資料檔案
$("#dlspeed").click(function(){
var url="[[@{/dl}]]";
var road=$("#roads").val();
console.log(road);
if (road!=null && "請選擇"!=road && typeof(road)!="undefined"){
$.post(url,$("#speedFrom").serialize(),
function(data, status){
console.log(data);
if("NoData"==data.info){
layer.msg('你選擇的路在此時間段內沒有資料, 請重新選擇!' );
}else{
layer.msg('已經生成資料檔案正在為您下載 !');
var fileName=data.fileName;
console.log(fileName);
window.open("[[@{/file/downFile}]]?filename="+fileName,'_blank');
console.log("ccccccc");
}
},"json");
}else{
layer.msg('請選擇路段和時間 !');
}
});
});
Controller
/**
* 下載資料檔案
* @param startDate
* @param endDate
* @param startTime
* @param endTime
* @param roadName
* @param weekdays
* @return
*/
@RequestMapping(value = "/dl", produces = "application/json;charset=UTF-8", method = RequestMethod.POST)
public @ResponseBody Map<String, String> dlspeed(String startDate, String endDate,
String startTime, String endTime, String[] roadName,
String[] weekdays,HttpServletResponse response,HttpServletRequest request) {
Map<String, String> map=new HashMap<String, String>(2);
List<Integer> weeks=new ArrayList<Integer>(weekdays.length);
for (int i = 0; i < weekdays.length; i++) {
weeks.add(Integer.parseInt(weekdays[i]));
}
try {
List<GdRoadSpeed> list = gdService.listSpeed(startDate, endDate, startTime, endTime, roadName[0], weeks);
if(list!=null && list.size()>0){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sd = new SimpleDateFormat("HH:mm:ss");
String[] firstRow=new String[5];
firstRow[0]="date";
firstRow[1]="time";
firstRow[2]="road name";
firstRow[3]=" direction ";
firstRow[4]=" speed ";
String[][] datas=new String[list.size()][5];
for (int i=0;i<list.size();i++) {
GdRoadSpeed gds = list.get(i);
datas[i][0]=sdf.format(gds.getDate());
datas[i][1]=sd.format(gds.getTime());
datas[i][2]=gds.getName();
datas[i][3]=gds.getDirection();
datas[i][4]=gds.getSpeed()+"";
}
String sheetName = "路段速度分析";
// 新檔名
String newFileName = roadName[0]+startDate.replaceAll("-", "")
+"_"+startTime.replaceAll(":", "")+"-"
+endDate.replaceAll("-", "")+"_"+endTime.replaceAll(":", "")+".xlsx";
// 獲得專案的路徑
ServletContext sc = request.getSession().getServletContext();
// 上傳位置
String path = sc.getRealPath("/tempFiles") + "/"; // 設定檔案儲存的目錄
File folder = new File(path);
if (!folder.exists()) {
folder.mkdirs();
}
File file =new File(path,newFileName);
if (!file.exists()) {
file = FileUtils.createExcel(file,sheetName, firstRow, datas);
}
map.put("info", "SaveData");
System.out.println(file.getAbsolutePath());
System.out.println(file.getName());
map.put("fileName", file.getName());
}else{
map.put("info", "NoData");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
logger.error(e.getMessage());
}
return map;
}
生成excel檔案的方法createExcel
public static File createExcel(File file,String sheetName,String[] firstRow,String[][] datas) throws IOException{
// 建立HSSFWorkbook物件(excel的文件物件)
HSSFWorkbook wkb = new HSSFWorkbook();
// 建立新的sheet物件(excel的表單)
HSSFSheet sheet = wkb.createSheet(sheetName);
// sheet.setDefaultRowHeightInPoints(60);
// sheet.setDefaultColumnWidth(20); //設定預設列寬
// 在sheet裡建立第一行,引數為行索引(excel的行),可以是0~65535之間的任何一個
HSSFRow row1 = sheet.createRow(0); //表格當中的第一行放置 列說明
HSSFCellStyle style=wkb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER);
for (int i = 0; i < firstRow.length; i++) {
// 建立單元格(excel的單元格,引數為列索引,可以是0~255之間的任何一個
HSSFCell cell = row1.createCell(i);
cell.setCellStyle(style);
// 設定單元格內容
cell.setCellValue(firstRow[i]);
}
// 合併單元格CellRangeAddress構造引數依次表示起始行,截至行,起始列, 截至列
// sheet1.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));
// 在sheet裡建立其他行
if(datas!=null && datas.length>0){
for (int i = 0; i < datas.length; i++) {
if(datas[i]!=null && datas[i].length>0){
HSSFRow row = sheet.createRow(i+1);
for (int j = 0; j < datas[i].length; j++) {
HSSFCell cell = row.createCell(j);
cell.setCellStyle(style);
cell.setCellValue(datas[i][j]);
}
}
}
}
wkb.write(file);
//write out this workbook to a new File
return file;
}
下載檔案的Controller
@RequestMapping("/downFile")
public void downFile(HttpServletRequest request,
HttpServletResponse response) {
// 得到要下載的檔名
String fileName = request.getParameter("filename");
try {
// 獲取上傳檔案的目錄
ServletContext sc = request.getSession().getServletContext();
// 上傳位置
String fileSaveRootPath = sc.getRealPath("/tempFiles");
// 得到要下載的檔案
File file = new File(fileSaveRootPath + "\\" + fileName);
// 設定響應頭,控制瀏覽器下載該檔案
response.setHeader("content-disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
// 讀取要下載的檔案,儲存到檔案輸入流
FileInputStream in = new FileInputStream(fileSaveRootPath + "\\" + fileName);
// 建立輸出流
OutputStream out = response.getOutputStream();
// 建立緩衝區
byte buffer[] = new byte[1024];
int len = 0;
// 迴圈將輸入流中的內容讀取到緩衝區當中
while ((len = in.read(buffer)) > 0) {
// 輸出緩衝區的內容到瀏覽器,實現檔案下載
out.write(buffer, 0, len);
}
// 關閉檔案輸入流
in.close();
// 關閉輸出流
out.close();
//下載完成,刪除檔案
file.delete();
} catch (Exception e) {
}
}