下载模板方式一:
Controller类
/**
* 下载模板
* @param response
* @param activeId
*/
@RequestMapping("/downloadExcel")
public void downloadExcel(HttpServletResponse response, @RequestParam("id") Long activeId){
String excelFile = getClass().getResource("/static/templates/links_addr.xlsx").getPath();
String path = getClass().getResource("/static/templates/").getPath();
//查询所有需要上传的榜单id列表
List<Top> topList = topService.getNeedTopLinkList(activeId);
if(CollectionUtils.isNotEmpty(topList)){
File newFile = linkService.convertDownExcel(excelFile, path, topList);
//向前后输出文件流
exportExcel(response, newFile);
//删除新生成的文件
deleteFile(newFile);
}else{
//导出文件
exportExcel(response, new File(excelFile));
}
logger.error("没有榜单链接模板,activeId:{}",activeId);
}
/**
* 导出excel文件
* @param response
* @param excelFile
*/
public static void exportExcel(HttpServletResponse response, File excelFile){
try{
// 下载
InputStream fis = new BufferedInputStream(new FileInputStream(excelFile));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
response.reset();
response.setContentType("text/html;charset=UTF-8");
OutputStream output = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/x-msdownload");
String newName = URLEncoder.encode(excelFile.getName(),"UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=\"" + newName + "\"");
response.addHeader("Content-Length", "" + excelFile.length());
output.write(buffer);
output.flush();
}catch (IOException e) {
e.printStackTrace();
}
}
service类
/**
* 解析excel
* @param tempPath
* @param path
* @param topList
* @return
*/
@Override
public File convertDownExcel(String tempPath, String path,List<Top> topList) {
File newFile = ExcelUtil.createNewFile(tempPath, path);
// File newFile = new File(tempPath);
InputStream is = null;
XSSFWorkbook workbook = null;
XSSFSheet sheet = null;
try {
is = new FileInputStream(newFile);// 将excel文件转为输入流
workbook = new XSSFWorkbook(is);// 创建个workbook,
// 获取第一个sheet
sheet = workbook.getSheetAt(1);
} catch (Exception e1) {
e1.printStackTrace();
}
if (sheet != null) {
try {
// 写数据
FileOutputStream fos = new FileOutputStream(newFile);
XSSFRow row = sheet.getRow(0);
if (row == null) {
row = sheet.createRow(0);
}
XSSFCell cell = row.getCell(0);
if (cell == null) {
cell = row.createCell(0);
}
for (int i = 0; i < topList.size(); i++) {
Top vo = topList.get(i);
row = sheet.createRow(i + 1); //从第二行开始
//根据excel模板格式写入数据....
ExcelUtil.createRowAndCell(vo.getId(), row, cell, 0);
ExcelUtil.createRowAndCell(vo.getTitle(), row, cell, 1);
}
workbook.write(fos);
fos.flush();
fos.close();
// 下载
InputStream fis = new BufferedInputStream(new FileInputStream(newFile));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != is) {
is.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
return newFile;
}
ExcelUtil.java
/**
* 读取excel模板,并复制到新文件中供写入和下载
*
* @return
*/
public static File createNewFile(String tempPath, String rPath) {
// 读取模板,并赋值到新文件************************************************************
// 文件模板路径
String path = tempPath;
File file = new File(path);
// 保存文件的路径
String realPath = rPath;
// 新的文件名
String newFileName = System.currentTimeMillis() + "_" + file.getName();
// 判断路径是否存在
File dir = new File(realPath);
if (!dir.exists()) {
dir.mkdirs();
}
// 写入到新的excel
File newFile = new File(realPath, newFileName);
try {
newFile.createNewFile();
// 复制模板到新文件
fileChannelCopy(file, newFile);
} catch (Exception e) {
e.printStackTrace();
}
return newFile;
}
/**
* 复制文件
*
* @param s 源文件
* @param t 复制到的新文件
*/
public static void fileChannelCopy(File s, File t) {
try {
InputStream in = null;
OutputStream out = null;
try {
in = new BufferedInputStream(new FileInputStream(s), 1024);
out = new BufferedOutputStream(new FileOutputStream(t), 1024);
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
} finally {
if (null != in) {
in.close();
}
if (null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}