工作中用到的poi解析execl并存数据库,把execl数据读到队列中之后存储数据库中,为了让大家能更好的理解,我把代码尽量多加些注释,并把逻辑改的简单易懂和字段缩短。
页面上传execl:
<form action="../TMTrade/TMTradeUpload" method="post" enctype="multipart/form-data">
<div class="row">
<div class="col-md-6">
<label>选择TM订单文件(天猫商城订单):</label>
<br>
<input type="file" class="form-control" name="fileName" />
</div>
<br>
</div>
<br>
<div class="row">
<div class="col-md-3">
<input type="submit" value="导入TM单" class="btn btn-danger" />
</div>
</form>
后端解析execl并存数据库
/**
* TM订单上传
* @Description: 功能描述
*/
@PostMapping("/TMTradeUpload")
public String TMTradeUpload(@RequestParam("fileName") MultipartFile file,Model model,HttpServletRequest request, HttpServletResponse response) {
log.info("TM订单上传开始");
//获取文件名 主要判断是否选择了文件
String fileName = file.getOriginalFilename();
if (StringUtils.isEmpty(fileName)){
model.addAttribute("TMTradeUploadRrturnCode", "execl文件名为空");
return "uploadTrades";
}
// 获取文件后缀 判断是否为execl格式的文件
String prefix=fileName.substring(fileName.lastIndexOf("."));
if (!prefix.toLowerCase().contains("xls") && !prefix.toLowerCase().contains("xlsx") ){
model.addAttribute("TMTradeUploadRrturnCode", "请选择execl格式文件");
return "uploadTrades";
}
Workbook workbook = null;
File excelFile = null;
try {
// 防止生成的临时文件重复-建议使用UUID
excelFile=File.createTempFile(System.currentTimeMillis()+"", prefix);
file.transferTo(excelFile);
//由于2003和2007的版本所使用的接口不一样,所以这里统一用Workbook做兼容
boolean isExcel2003 = prefix.toLowerCase().endsWith("xls")?true:false;
if(isExcel2003){
workbook = new HSSFWorkbook(new FileInputStream(excelFile));
}else{
workbook = new XSSFWorkbook(new FileInputStream(excelFile));
}
} catch (Exception e) {
log.info(""+e);
}
//Excel表中的内容 我们开始把数据存入队列,如果有需要你们可以改为ArrayList
Queue<t_tm_trade_new> queue = new LinkedList<t_tm_trade_new>();
Sheet sheet = workbook.getSheetAt(0);
//这里从1开始,跳过了标题,直接从第二行开始解析
try {
for(int i=1; i<sheet.getLastRowNum()+1; i++) {
Row row =sheet.getRow(i);
for(int w=0;w<3;w++) {
if(row.getCell(w)!=null){row.getCell(w).setCellType(CellType.STRING);}
}
t_tm_trade_new tTmTradeNew = new t_tm_trade_new();
//组装数据 把execl内的数据存到队列中
tTmTradeNew.setTradeid(row.getCell(0).getStringCellValue());//0 订单编号
tTmTradeNew.setTitle(row.getCell(1).getStringCellValue());//1 订单名称(例如:XX牛排)
tTmTradeNew.setPrice(row.getCell(2).getStringCellValue());//2 订单价格
queue.offer(tTmTradeNew);
}
} catch (Exception e) {
log.info("文件内容格式错误"+e);
model.addAttribute("TMTradeUploadRrturnCode", "文件内容格式错误,上传失败");
return "uploadTrades";
}
//删除临时转换的文件
if (excelFile.exists()) {
excelFile.delete();
}//开始循环队列 如果是ArrayLisy 则forEach
while(queue.peek()!=null) {
t_tm_trade_new t = queue.poll();//拿到对象
if(t.getTradeid()!=null&&!t.getTradeid().trim().equals("")) {
tTMTradeNewDao.insertTmTradeNew(t.getTradeid(), t.getTitle(), t.getPrice());//存数据库
}
}
log.info("TM订单上传完成");model.addAttribute("TMTradeUploadRrturnCode", "TM订单上传完成");
return "uploadTrades";
}