场景
用户导入EXCEL表格数据,服务器执行导入检查、合法数据写入数据库、回写文件。
文件中要在表格数据中每一行标明执行结果。若不成功说明错误原因。
实现方案
- 采用异步方案,在获取到上传组件成功上传之后。将结果文件存储到服务器/分布式文件服务器中,前端异步去执行下载文件。
- 采用同步,在上传的请求中将结果文件以流的形式返回给前端
方案1,简单高效。存在浪费服务器空间问题,因为这个文件不需要长期存放在服务器。若上传文件很多势必将造成磁盘空间紧张
方案2,简单直接高效。(故采用此方案)
Java 后台核心代码 (示例)
/**
* excel导入staff信息
*
* @param files
* @param request
* @param response
*/
@ApiOperation(value = "导入code staff信息", httpMethod = "POST")
@RequestMapping(value = "import_code_staff", method = RequestMethod.POST)
@ResponseBody
public ResponseEntity importCodeStaffInfo(@RequestPart(value = "files") MultipartFile files, HttpServletRequest request, HttpServletResponse response) {
String fileName = files.getOriginalFilename();
if (!ReadExcelUtil.isExcelFile(files.getOriginalFilename()))
throw new BusinessException("Please upload the Excel file");
Map<String, String> titleMap = GoodCodeStaffInfo.getExcelTileMapInfo();
//0. todo 解析数据
//List<GoodCodeStaffInfo> datas = ExcelUtils.getListBySheetName(sheetName, files,GoodCodeStaffInfo.class, titleMap);
//1.todo 检查数据,并标记正确数据
//2.todo 将正确数据写入数据库
//3.回写文件
try {
handelResultExcel(files, datas, request, response);
} catch (IOException e) {
LOGGER.error("处理回写文件错误");
}
//此处return null
return null;
}
/**
* 处理回写文件内容
*
* @param files
* @param datas
* @param request
* @param response
* @throws IOException
*/
private void handelResultExcel(MultipartFile files, List<GoodCodeStaffInfo> datas, HttpServletRequest request,
HttpServletResponse response) throws IOException {
try {
XSSFWorkbook workbook = new XSSFWorkbook(files.getInputStream());
//todo 写入文件内容
String fileName = "result_" + System.currentTimeMillis() + ".xlsx";
//将文件名进行URLEncode转换