最近因工作需要上传excel表格,并将表格的数据上传到数据库,我是使用了XSSFWorkbook这个工作表进行的上传,
废话少说,直接上代码
前端html
js请求代码
function inspect(){
var fileObj = document.getElementById("loadfile").files[0];
if(fileObj == undefined){
alert('请先选择上传文件');
return false;
}
layer.msg("上传中",{time:10000});
var formData = new FormData($('#uploadForm')[0]);
$.ajax({
url:"/device/uploadDevice",
type:"post",
data:formData,
processData:false,
contentType:false,
success:function(data){
if(data.state){
alert("上传成功")
window.location.reload();
}else {
alert("上传失败")
}
}
});
后台控制层代码Controller 这里使用MultipartFile接收file文件,JsonResult是我自己定义的一个Json返回类型,接收到file文件后判断是否为空,然后执行代码,将file先转file,再将file转为XSSFWorkbook类型,这样方便获取行和列的元素,获取每一单元格的元素保存到list<对象>中的属性中,其中有时间格式的数据,excel表中的时间数据默认是使用数字保存的,所以先使用HSSFDateUtil.getJavaDate(purchaseTime.getNumericCellValue());获取excel的时间数据,然后转换为Date类型的数据,在转为指定的字符串数据,然后交给service层处理进行数据插入。
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = HSSFDateUtil.getJavaDate(purchaseTime.getNumericCellValue());
device.setPurchaseTime(sdf.format(date));
@RequestMapping(value ="/device/uploadDevice",method=RequestMethod.POST)
@ResponseBody
public JsonResult uploadDevice(@RequestParam("file") MultipartFile file,HttpServletRequest request, HttpServletResponse response)throws Exception{
JsonResult j=new JsonResult();
//List
因为接收的代码是MultipartFile类型的文件,需要转为File类型的文件,这里转换一下
public static File MultipartFileToFile(MultipartFile multiFile) {
// 获取文件名
String fileName = multiFile.getOriginalFilename();
// 获取文件后缀
String prefix = fileName.substring(fileName.lastIndexOf("."));
// 用当前时间作为文件名,防止生成的临时文件重复
try {
File file = File.createTempFile(System.currentTimeMillis() + "", prefix);
multiFile.transferTo(file);
return file;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
service层数据处理,service的接口
//将excel表中的数据保存到数据库中
public int insertExcelDevice(List list) throws Exception;
接口实现层,serviceImpl,我这使用的是oracle数据库,使用的是foreach循环进行的插入:因为在excel保存的 是分组和部门名称,所以在保存之前,查询对应的分组和部门id保存到数据库总。
//将excel表中的数据保存到数据库
@Override
@Transactional
public int insertExcelDevice(List list) throws Exception {
//第一步,使用遍历list进行插入,值插入之前先deviceNo
int index=0;
for (Device device : list) {
//第二步,在插入之前查询数据库是否存在该对象 通过deviceNo
// List listDevice=deviceMapper.selectDeviceByDeviceNO(device.getDeviceNo());
// if(listDevice.size()>0){
// //代表数据库中有该数据,结束这个循环
// continue;
// }
//生成数据二位码
Device de=chengDevice(device);
//根据设备分组名称查询设备分组id
List groupList=deviceGroupMapper.selectDeviceGroupbyName(device.getDeviceGroupId());
if(groupList.size()>0){
de.setDeviceGroupId(groupList.get(0).getDeviceGroupId());
}
List departsList=departMapper.selectDepartBydepartName(device.getDepartId());
if(departsList.size()>0){
de.setDepartId(departsList.get(0).getDepartId());
}
//进行数据插入
index+=deviceMapper.insertDevice(device);
}
return index;
}
因为每个对象都要根据id生成一个二维码来标记,所以我又单独写了一个方法进行生成对象的id和二维码图片
public Device chengDevice(Device device) throws Exception{
// 新增设备 要根据设备id生成一个设备二维码图片
String deviceId=UUIDGenerator.getUUID();
//产生4位长度的随机码(由字母和数字组成)
String randomStr = StringDUtil.generateRandomCodeForLength(4);
String name = DateDUtil.DateToStr(DateDUtil.yyyyMMddHHmmss, new Date()) + randomStr+".png";
//生成二维码路径地址
String fileName = StatusDefine.fileCodePath+name;//二维码存放路径
//调用方法生成二维码图片地址
QRCodeUtil.createQrCode(fileName,deviceId,device.getDeviceName());
device.setDeviceId(deviceId);
device.setQrCodePath(fileName);
return device;
}
后面的插入和查询的sql语句就展示了,都是正常的插入和查询语句,希望这个文章对大家有所帮助。