实现文件的下载功能,下载excel文件
两种实现方式
一:下载本地指定路径下的指定文件。
前端代码:
<a id="download1" type="hidden" style='color:red' href='填写后台指定coltroller-方法的地址'> 下载数据</a>
Controller层代码:
@RequestMapping("download")
@ResponseBody
public ResponseEntity<byte[]> download() throws IOException {
ResponseEntity<byte[]> a = null;
try {
a = tranddelService.downloadExcel();
} catch (Exception e) {
e.printStackTrace();
}
return a;
}
ServiceImpl实现类方法:
public ResponseEntity<byte[]> downloadExcel() throws Exception{
//下载文件名称-下载后文件的名称+后缀
String name = "数据.xls";
//要下载文件的路径
String route = Utils.getRequest().getSession().getServletContext().getRealPath("/")+"file/qs/error/error.xls";
//根据路径创建file
File file=new File(route); //存放太那些好的excel的绝对路径
HttpHeaders headers = new HttpHeaders();
String fileName=new String(name.getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file), headers, HttpStatus.CREATED);
}
Tip:
Utils.getRequest()为获取request的方法,自己重写的。
二:设置模板路径,填充模板信息,下载。
设置模板下载和按照路径下载在实现层有区别
public ResponseEntity<byte[]> downloadExcel() throws Exception{
ExcelPoi excelPoi = new ExcelPoi();
/* 个入文件数据的业务
Map<String , String> map = new HashMap<String, String>();
//转date格式
Date today = DateUtil.strToDate(date);
//昨天的 yyyy-MM-dd
String Yesterday = DateUtil.get4yMd(DateUtil.getNextDay1(today));
//前天 yyyy-MM-dd
String TWOYesterday = DateUtil.get4yMd(DateUtil.getNextDay2(today));
map.put("Yesterday", Yesterday);
map.put("TWOYesterday", TWOYesterday);
List<Map<String, Object>> list = bankbilldataDao.getList("getBnoFile", map);*/
//拼接写入excel文件的那个数据格式
List<String[]> li = retExcelStr(list);
String filePath = excelPoi.writer(date, li);
String name = filePath.substring(filePath.length()-19,filePath.length());
File file=new File(filePath);
HttpHeaders headers = new HttpHeaders();
String fileName=new String(name.getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
headers, HttpStatus.CREATED);
}
//方法的作用:写入文件提出的公用类,会调用公用类,需要传进去List<String[]>类型的数据写入。String[]数据的顺序就是一行的从左到右顺序
public List<String[]> retExcelStr(List<Map<String, Object>> list){
List<String[]> retList = new ArrayList<String[]>();
StringBuilder stringBuilder = new StringBuilder();
if(list.size() > 0){
for (int i = 0;i < list.size();i++){
String bno = (String) list.get(i).get("BNO");
stringBuilder.append(bno).append(",");
}
String[] retStrArray = stringBuilder.substring(0,stringBuilder.length()-1).split(",");
retList.add(retStrArray);
}
return retList;
}
Tip:
excelPoi.writer(date, li);
public String writer(String date,List<String[]> list) {
try {
Workbook wb = null;
wb = new XSSFWorkbook( new FileInputStream(getRequest().getSession().getServletContext().getRealPath("/")+"mode/qsMode.xlsx"));
Sheet sheet1=wb.getSheetAt(0);
if(list.size()>0){
for(int i=0;i<list.get(0).length;i++){
Row row = (Row) sheet1.createRow(i+1);
Cell cell = row.createCell(0);
cell.setCellValue(list.get(0)[i]);
}
}
new File(getRequest().getSession().getServletContext().getRealPath("/")+"file/qs/"+new SimpleDateFormat("yyyyMMdd").format(new Date())).mkdirs();
f = getRequest().getSession().getServletContext().getRealPath("/")+"file/qs/"+new SimpleDateFormat("yyyyMMdd").format(new Date())+"/"+date+"商编文件.xlsx";
OutputStream stream= new FileOutputStream(f);
wb.write(stream);
stream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return f;
}
模板为:qsMode.xlsx文件,只有第一列有头信息,只写入第一列的值