一,导出固定模板
1,两次调用encodeURI来解决乱码问题
id="+id+"&roleName="+encodeURI(encodeURI(roleName))+"&roleType="+roleType;
JAVA后台:
roleName = java.net.URLDecoder.decode(getRequest().getParameter("roleName"),"UTF-8");
假设项目upload文件下有 债券品种信息.xls 模板
public void uploadTemplate(HttpServletRequest request, HttpServletResponse response) {
String filePath = "债券品种信息.xls";
filePath = URLEncoder.encode(filePath , "utf-8");
String tempFile = File.separator + "upload" + File.separator + filePath ;
String pathURL = request.getSession().getServletContext().getRealPath(tempFile);
File file = new File(pathURL);
FileInputStream input = null;
try {
input = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] b = new byte[2048];
int len;
while ((len = input.read(b)) != -1) {
out.write(b, 0, len);
}
response.setHeader("Content-disposition", "attachment;fileName=" + filePath);
response.setContentType("application/vnd.ms-excel;utf-8");
response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));
input.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
ajax上传文件
<input type="hidden" id="taskId" value="${taskId }">
<input type="hidden" id="groupId" value="${groupId }">
<input type="hidden" id="userId" value="${userId }">
<input id="import_Excel" type="file">
var formData = new FormData();
var name = $("#import_Excel").val();
formData.append("file_data",$("#import_Excel")[0].files[0]);
formData.append("name",name);
var taskId = $("#taskId").val();
var groupId = $("#groupId").val();
var account = $("#account").val();
var reqParam='{"taskId":"' + taskId
+ '","groupId":"' + groupId
+ '","owner":"' + account
+ '"}';
formData.append("reqParam",reqParam);
$.ajax({
url: "cooperation/importFile.do",
type: "post",
async : false,
data: formData,
processData : false,
contentType : false,
success: function(data){
}
})
@RequestMapping(value = "/importFile.do", method = RequestMethod.POST)
@ResponseBody
public ResultDTO<ImportModel> importFile( MultipartFile file_data, String reqParam) {
String fileName = file_data.getOriginalFilename();
CommonsMultipartFile cf = (CommonsMultipartFile) file_data;
DiskFileItem fi = (DiskFileItem) cf.getFileItem();
File bipfile = fi.getStoreLocation();
}
二,根据模板导出数据
public class RelationShipController {
public void ExportRelationShipExcel(HttpServletResponse response) {
InputStream inputStream = RelationShipController.class.getResourceAsStream("RelationShip.xls");
Workbook wb= WorkbookFactory.create(inputStream );
//保存字段与列位置关系
List<String> keyList = new ArrayList<String>();
for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
Sheet sheet = wb.getSheetAt(sheetNum);
//取第二行的值作为 映射
Row rowNum = sheet.getRow(1);
for(int cellNum=0;cellNum<rowNum .getLastCellNum();cellNum++) {
Cell cell = rowNum .getCell(cellNum);
String cellValue = "";
if(cell !=null) {
cellValue = cell.getStringCellValue();
}
keyList.add(cellValue);
}
}
//删除Excel第二行数据
for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {
Sheet sheet = wb.getSheetAt(sheetNum);
//直接删除第二行即可
sheet.shiftRows(1 + 1, 1 + 1, -1); //shift的时候,以1作为开始, -1表示删除
}
//获取导出数据
List<Map<String,Object>> shipExcel = new ArrayList<Map<String,Object>>();
for(int sheet=0;sheet<template.getNumberOfSheets();sheet++) {
Sheet sheetAt = wb.getSheetAt(sheet);
for(int i=0;i<shipExcel.size();i++) {
Row createRow = sheetAt.createRow(i+1);
Cell createCell = null;
for(int cellNum=0;cellNum<keyList .size();cellNum++) {
createCell=createRow.createCell(cellNum);
createCell.setCellType(HSSFCell.CELL_TYPE_STRING);
createCell.setCellValue(shipExcel.get(i).get(keyList .get(cellNum).toUpperCase())+"");
}
}
}
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel;utf-8");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
wb.write(response.getOutputStream());
}
}