首先先记录下碰到的问题:
原先想直接传要上传的文件路径到后端,然后后端绝对定位到相应文件进行数据的解析,后面发现浏览器这边为了安全问题,是不能获得文件的真实路径的,只能获得一个虚假的路径,然后这种做法就行不通了,我的解决方法是先把文件上传的到后端相关目录,解析完数据后在将对应的文件删除
下面贴代码:
传输文件 form表单要加上
enctype="multipart/form-data"
这个属性,
JS中AJAX上传文件的格式:
function excelData(){
var monitordocpath=$("#monitordocpath").text();
if(monitordocpath!=null && monitordocpath!=""){
var form = new FormData(document.getElementById("monitordocform"));
$.ajax({
url: "monitor/excelData",
type: 'POST',
data: form,
processData: false,
contentType : false,
success:function(data){
alert(data);
if(data=="true" || data==true){
$("#monitorspotgrid").mtable("reload");
closeMonitorUploadWin();
$.mal({
text : '导入成功',
type : 'success'
});
}else{
$.mal({
text : '导入失败',
type : 'error'
});
}
},
error:function(e){
}
})
}else{
$.mal({
text : '请先选择文件',
type : 'warning'
});
}
}
JAVA后台代码的处理方法:
@ResponseBody
@RequestMapping(value="excelData",method = RequestMethod.POST)
public String excelData(HttpServletRequest request,HttpServletResponse response,@RequestParam("monitordoc")MultipartFile monitordoc){
// 上传文件路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
System.out.println(path);
// 上传文件名
String fileName = monitordoc.getOriginalFilename();
if(fileName.endsWith("xls") || fileName.endsWith("xlsx")){
File file=new File(path+File.separator+fileName);
ShardedJedisProvider jedis=JedisManager.getShardedJedis("redis"); //根据需要获取相关数据
String sessionId = GetSessionID(request, response);
String tenantId = jedis.hget("userkey:"+sessionId, "tenantId");
try {
monitordoc.transferTo(file);//先将上传的文件保存
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Listlist=paseExcel(file,tenantId,fileName);//解析上传的Excel数据
Integer result=pdaOneMapMonitorSpotService.batchInsert(list);
if (result>0) {
return "true";
}else {
return "false";
}
}else {
return "false";
}
}
解析Excel数据的方法
public List paseExcel(File f,String tenantId,String fileName){
String path=f.getPath();
Listlist=new ArrayList();
FileInputStream fis =null;
Mapmap=new HashMap();
Workbook wookbook = null;
//XSSFWorkbook ss=null;
int flag = 0;
try{
//获取一个绝对地址的流
fis = new FileInputStream(f);
}
catch(Exception e){
deleteExcel(path);
e.printStackTrace();
}
try {
if(fileName.endsWith("xls")){
//2003版本的excel,用.xls结尾
wookbook = new HSSFWorkbook(fis);//得到工作簿
}else {
//2007版本的excel,用.xlsx结尾
wookbook = new XSSFWorkbook(fis);//得到工作簿
}
} catch (Exception ex) {
ex.printStackTrace();
deleteExcel(path);
}
//得到一个工作表
Sheet sheet = wookbook.getSheetAt(0);
//获得表头
Row rowHead = sheet.getRow(0);
//根据不同的data放置不同的表头
Map
解析成功或者出现异常的情况下都将上传的文件删除,调用deleteExcel方法
/**
* 删除指定路径下的Excel
* @param path
* @return
*/
public String deleteExcel(String path){
try {
//目录路径
File target=new File(path);
//删文件
target.delete();
} catch (Exception e) {
return "false";
}
return "true";
}
返回单元格数据类型的函数:
/**
*
* @param cell 一个单元格的对象
* @return 返回该单元格相应的类型的值
*/
public static Object getRightTypeCell(Cell cell){
Object object = null;
switch(cell.getCellType())
{
case Cell.CELL_TYPE_STRING :
{
object=cell.getStringCellValue();
break;
}
case Cell.CELL_TYPE_NUMERIC :
{
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
object=cell.getNumericCellValue();
break;
}
case Cell.CELL_TYPE_FORMULA :
{
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
object=cell.getNumericCellValue();
break;
}
case Cell.CELL_TYPE_BLANK :
{
cell.setCellType(Cell.CELL_TYPE_BLANK);
object=cell.getStringCellValue();
break;
}
}
return object;
}
暂时就这样解决,如果有能够不用保存先保存文件到服务器就能够解析要上传文件的数据的方法的话,欢迎大神指教!