做完了一个报表导入数据库 功能 遇到几个问题:一 、Poi解析excel 的两种格式 xls xlsx. 二、form表单上传使用ajax
三、excel 单元格中有公式存在普通的读取方式读到的是公式不是数据
1.[代码]先从上传文件开始,最开始是套用项目中一直在用的validform
$(function() {
//ajax初始化 Validform 表单按钮
$("#formobj").Validform({
tiptype : 4,
btnSubmit : "#btn_sub",
btnReset : "#btn_reset",
ajaxPost : false,//ajaxpost 是true的时候死活不能提交到后台去
//为了实现功能只能,只能将就一下 但是问题也很严重,这里返回的值是
// 当前form的对象,所以不管我后台是什么情况前台都会提示 上传成功
callback: function (data){
var win = frameElement.api.opener;
if (data) {
win.tip("上传成功!");
frameElement.api.hide();
//win.reloadTable(data);
}
win.parentLoad();
}
});
});
具体的validform可以百度下看看它的说明文档
2.[代码]ajax上传
//上面说到 validform ajaxPost为false时form表单才能提交相对的 返回的数据是form的对象,实际上不能满足我//的要求。所以功能实现之后 改!
//想到 html5 是有 FormData 的 于是
文件名称:
选择文件:
function ajsave(){
var formData = new FormData($( "#ajform" )[0]);
$.ajax({
url: path+"reportForUrlController/saveOrUpdata" ,
type: 'POST',
data:formData,
async: false,
cache: false,
contentType: false,
processData: false,
success: function (data) {
var win = frameElement.api.opener;
if(data.success==true){
win.tip(data.msg);
frameElement.api.close();
win.parentLoad();
}else{
$.messager.alert('提示',data.msg);
}
}
});
}
//到了这里想着后台处理基本什么情况前台都能告诉用户上传的状态并且能正常上传了。
//实际上确实能满足业务需求了
//测试发现问题了!IE10以下还是不能提交表单 FormData 不支持IE10以下的版本!
3.[代码]ajaxFileUpload
//这很烦啊,本人一般都用火狐 谷歌之类的很少用到ie但是用户不一定就不用ie啊
//于是 继续改!
//引入 js
function ajsave(){
$("#ajform").ajaxSubmit({
dataType: 'json',
contentType: "application/json; charset=utf-8",
success : function (data, status){
var win = frameElement.api.opener;
if(data.success){
win.tip(data.msg);
frameElement.api.close();
win.parentLoad();
}else{
$.messager.alert('提示',data.msg);
}
}
});
}
//测试之后发现都可以了
//于是皆大欢喜 前台搞定之后 该搞后台了
//这种形式传输的file 是 multipart/form-data 记得在 form 中添加属性
4.[代码]poi解析(包括解析单元格公式)
//在代码之前我一直在考虑怎么得到路径然后 通过路径去解析(本人对与上传功能并不熟悉)
//后来才发现我传到后台的file 它本身就是一个流... 于是皆大欢喜......
@RequestMapping(value = "/addorupdate" ,method = RequestMethod.POST)
@ResponseBody
public AjaxJson addorupdate(HttpServletRequest req,
@RequestParam(value = "file", required = false) MultipartFile file,
@RequestParam(value = "fileName", required = true) String FileName )
throws Exception {
AjaxJson j = new AjaxJson();
InputStream is = file.getInputStream();
String isName = file.getOriginalFilename();
//直接将excel 按后缀不同转成workbook格式的数据
String type = isName.substring(isName.lastIndexOf(".")+1);
Workbook book =null;
if(type.equals("xls")){
book = new HSSFWorkbook(is);
}else if(type.equals("xlsx")){
book = new XSSFWorkbook(is);
}
Sheet sheet = book.getSheetAt(0);
Row row = null;
for (int i = 1; sheet.getRow(i)!=null; i++) {
row = sheet.getRow(i);
for (int j = 0;row.getCell(j)!=null; j++) {
........
}
}
}
//之后的解析就不详细介绍了
//最后在excel的单元格是公式的情况下 使用 //String.valueOf(row.getCell(j).getNumericCellValue());
//就能获取到值了,
以上 form提交excel poi解析并存库完成