对导入表格进行校验并下载导入失败原因
- 第一步 将上传Excel进行解析(不是重点不过多介绍)
- 第二步 在服务器本地建临时文件将异常数据写入临时文件
- 第三部将建好的表格上传ftp,可供用户下载(上传后记得三次本地文件)
第一步 将上传Excel进行解析(不是重点不过多介绍)
public R checkExcel(MultipartFile teamFile) {
String originalFilename = teamFile.getOriginalFilename();
if (!(org.apache.commons.lang.StringUtils.endsWith(originalFilename, "xls") ||
org.apache.commons.lang.StringUtils.endsWith(originalFilename, "xlsx"))) {
log.info("文件格式错误,只允许导入xls和xlsx格式的文件!");
return R.failed("文件格式错误,只允许导入xls和xlsx格式的文件!");
}
long fileSize = teamFile.getSize();
if (fileSize > 4 * 1024 * 1024) {
return R.failed("只支持4M以内的文件!");
}
//获取文件流
XSSFWorkbook xssfWorkbook;
InputStream inputStream = null;
try {
inputStream = teamFile.getInputStream();
xssfWorkbook = new XSSFWorkbook(inputStream);
} catch (Exception e) {
log.info("获取文件输入流失败");
return R.failed("导入失败 - 表格文件错误,请下载正确的模板!");
}
//获取模板内数据并执行导入
if (xssfWorkbook == null) {
return R.failed("上传附件为空");
}
//从第一个sheet获取数据
XSSFSheet sheetOne = xssfWorkbook.getSheetAt(0);
if (sheetOne.getPhysicalNumberOfRows() <= 1) {
log.info("表格内无数据!");
return R.failed("表格内无数据!");
}
//开始导入数据
int rows = sheetOne.getPhysicalNumberOfRows();
//从第二行开始导入,第一行为表头
for (int i = 1; i < rows; i++) {
log.info("解析活动方案团队内容附件");
XSSFRow row = sheetOne.getRow(i);
setCellType(row);
}
}
第二步 在服务器本地建临时文件将异常数据写入临时文件
FileOutputStream out=null;
//用于判断附件是否正常
boolean isOk = true;
String name = "附件校验异常数据" +".xls";
//miceExecl_fil_path 是本地目录
String filename = miceExecl_fil_path + name;
File Path=new File(miceExecl_fil_path);
if (!Path.exists()) {
Path.mkdirs();
}
//在服务器本地指定目录下建个文件
File file = new File(filename);
if (!file.exists()) {
file.createNewFile();
//创建一个工作簿
HSSFWorkbook wb=new HSSFWorkbook();
//创建一个sheet页
HSSFSheet sheet=wb.createSheet("异常数据");
//创建第一行
HSSFRow title=sheet.createRow(0);
//这里你可以直接封装你的标题
//循环写入标题
for(int i=0;i<teamTitleStr.length;i++) {
//获取单元格
HSSFCell cell=title.createCell(i);
//设置单元格的值
cell.setCellValue(teamTitleStr[i]);
}
//循环写入数据
for (int i = 0; i < infos.size(); i++) {
Info info= infos.get(i);
HSSFRow row1 = sheet.createRow(i+1);
StringBuffer stringBuffer = new StringBuffer("");
if(StringUtils.isBlank(info.getPeopleNum())){
stringBuffer.append("人数、为必填项;");
isOk = false;
}else if(!NumberUtil.numberType(info.getPeopleNum())){
stringBuffer.append("人数必须为数字格式;");
isOk = false;
isOkNumBol = false;
}
if(StringUtils.isBlank(info.getPrice())){
stringBuffer.append("报价为必填项;");
isOk = false;
isOkNumBol = false;
}else if(!NumberUtil.numberType(info.getPrice())){
stringBuffer.append("报价必须为数字格式;");
isOk = false;
isOkNumBol = false;
}
if(StringUtils.isBlank(info.getTax())){
stringBuffer.append("税费为必填项;");
isOk = false;
isOkNumBol = false;;
}else if(!NumberUtil.numberType(info.getTax())){
stringBuffer.append("税费必须为数字格式;");
isOk = false;
isOkNumBol = false;
}
row1.createCell(0).setCellValue(info.getSerialNumber());
row1.createCell(1).setCellValue(info.getPeopleNum());
row1.createCell(2).setCellValue(info.getPrice());
row1.createCell(3).setCellValue(info.getTax());
row1.createCell(4).setCellValue(stringBuffer.toString());
}
//获取输出流
out=new FileOutputStream(file);
//向out写入数据
wb.write(out);
//刷新
out.flush();
//关闭流和工作簿
out.close();
wb.close();
}
第三部将建好的表格上传ftp,可供用户下载(上传后记得三次本地文件)
调用ftp方法进行上传
InputStream inputStream1 = new FileInputStream(file);
boolean flag = FTPUtil.uploadFile(ftpHost,ftpPort,ftpUserName,ftpPassword,ftpFilePath,name,inputStream1);
if(!flag){
R.failed("校验数据上传附件失败");
}
//上传完将本地文件删除
if(file.exists()){
file.delete();
}
上传ftp附件方法
//上传ftp方法 host是地址, port是端口号,uname是ftp登陆账号,pwd是密码,path是ftp地址,filename是文件名,input是需要上传的文件流
public static boolean uploadFile(String host, int port, String uname, String pwd,
String path, String filename, InputStream input) {
boolean result = false;
FTPClient ftp = new FTPClient();
try {
int reply;
ftp.setControlEncoding("UTF-8");
// 连接FTP服务器
ftp.connect(host, port);
ftp.enterLocalPassiveMode();
// 登录
ftp.login(username, password);
log.info("登录ftp成功!!!!!!!!!!!!!!");
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftp.disconnect();
}
//切换到上传目录
if (!ftp.changeWorkingDirectory(filePath)) {
//如果目录不存在创建目录
String[] dirs = filePath.split("/");
String tempPath = "";
for (String dir : dirs) {
if (null == dir || "".equals(dir)){
continue;
}
tempPath += "/" + dir;
if (!ftp.changeWorkingDirectory(tempPath)) {
if (!ftp.makeDirectory(tempPath)) {
log.info("========ftp.makeDirectory========"+filename);
return result;
} else {
ftp.changeWorkingDirectory(tempPath);
}
}
}
}
//设置上传文件的类型为二进制类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
//上传文件
if (!ftp.storeFile(filename, input)) {
log.info("保存文件失败"+filename);
return result;
}
input.close();
ftp.logout();
result = true;
} catch (Exception e) {
log.error("ftp上传文件异常:", e);
} finally {
if (ftp.isConnected()) {
try {
ftp.disconnect();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
return result;
}