该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我用的是poi3.9导入,就是利用文件流数据转换实现ajax提交文件上传,点击导入按钮,弹出模态框,然后把excel的数据转换为list集合,然后传回bsgrid显示,下面直接看代码:
页面:选择文件:
选择文件
对应的js:
function changefile(ts){
var is=$(ts).val();
$("#Sp_file").text(is);
}
$("#btn_file").click(function(){
$("#inp_file").click();
});
效果:
导入按钮:
function DaoRu(){
//获取input的val值
var fileName= $("#inp_file").val().toString();
//自定义导入文件类型的后缀名
var imgExt = new Array(".xls",".xlsx");
//获取文件的后缀名并判断是否符合
if(imgExt.contain(fileName.extension())){
//获取文件
var file = document.getElementById('inp_file').files[0];
//实例化FileReader文件对象
var reader = new FileReader();
reader.onloadend= function () {
//实现两次uri编码,如果一次的话java那边解码之后还是乱码的
// reader.result是获取reader.readAsArrayBuffer的值
tableUser.search({filterExcel:encodeURIComponent(encodeURIComponent(arrayBufferToBase64(reader.result).toString()))});
};
if (file) {
//如果是文件,则获取文件的转换为ArrayBuffer
reader.readAsArrayBuffer(file);
}
}else{
tr=false;
alert("选择的不是Excel文件!");
}
}
用到的封装的js方法:
//获取文件名后缀名
String.prototype.extension= function(){
var ext = null;
var name = this.toLowerCase();
var i = name.lastIndexOf(".");
if(i > -1){
var ext = name.substring(i);
}
return ext;
}
//判断Array中是否包含某个值
Array.prototype.contain= function(obj){
for(var i=0; i
if(this[i] === obj)
return true;
}
return false;
};
function arrayBufferToBase64(buffer) {
var binary = '';
//Uint8Array 对象8 位无符号整数值的类型化数组
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
//对buffer一个一个的转码
binary +=String.fromCharCode(bytes[i]);
}
//base-64 解码使用方法btoa
return window.btoa(binary);
}
后台:
publicstatic List decoderBase64File(String base64Code)
throws Exception {//后台java代码给searchtext赋值的时候,本身已经使用了一次解码,不过解码的结果依然不对。
// 所以我们可以在页面上进行两次编码操作,这样后台自动的那次就可以抵消掉一次,
// 然后在使用 searchtext=java.net.URLDecoder.decode(searchtext,"UTF-8");进行一次解码就好了。
/* 因为Tomcat服务器会自动帮你做一次URLDecode,所以再加上你自己在代码里面写的URLDecode,
一共就是两个Decode了,既然要两次Decode,当然就需要两次Encode了*/
// base64Code= base64Code.replace(" ","+");
//将参数字符串解码进行URl解码;
base64Code= URLDecoder.decode(base64Code, "UTF-8");
//将base64字符串转换成byte数组
byte[] buffer = new BASE64Decoder().decodeBuffer(base64Code);
// 将byte数组转换成流
ByteArrayInputStream swapStream = new ByteArrayInputStream(buffer);
//声明HSSFWorkbook
HSSFWorkbook workbook=null;
//声明list,存放Excel里面的数据
List list=null;
try {
//将流转换为Excel
workbook= new HSSFWorkbook(swapStream);
//定义一个字符串数组,该数组与Excel导入的表头一一对应
String[] strings=new String[]{"用户名称","用户账号","用户密码","用户类型","座右铭","年龄","性别"};
HSSFSheetsheet=workbook.getSheetAt(0);
//获取sheet中最前行行号
HSSFRow row=sheet.getRow(0);
//循环判断导入Excel的数据与规定的字符串数组是否一一对应,如果没有,就自定义异常
for(int j=0,l=strings.length;j
HSSFCell cell=row.getCell(j);
cell.setCellType(Cell.CELL_TYPE_STRING);//设置单元格数据类型为字符串
String value=cell.getStringCellValue().trim();
if(!strings[j].equals(value)){
int b= 4/0;
}
}
//表头对应,则实例化list数据
list=new ArrayList();
int lastRowNum=sheet.getPhysicalNumberOfRows();//获取行数
//因为有一行是表头,所有数据从1索引开始;
int firstRowNum=1;
for(int i = firstRowNum; i < lastRowNum; i++){
//获取循环的行对象
row=sheet.getRow(i);
//获取该行的列数;
int lastCellNum=row.getPhysicalNumberOfCells();//获取列数
//判断如果列数与规定的列数不一致,则自定义报错
if(lastCellNum!=strings.length){
int b= 4/0;
}
//实例化po
userPO po=new userPO();
//循环行的单元格,然后赋值给po
for(int z=0;z
//获取单元格对象
HSSFCellcell=row.getCell(z);
cell.setCellType(Cell.CELL_TYPE_STRING);//设置单元格数据类型为字符串
//获取单元格的值
Stringvalue=cell.getStringCellValue().trim();
// Integer数据类型如果字段没有赋值,json转换会报错
//判断当前单元格是多少,则1给对应的po赋值
switch(z){
case 0:{
po.setUserName(value);
break;
}
case 1:{
po.setUserCode(value);
break;
}
case 2:{
po.setPassword(value);
break;
}
case 3:{
if(value.equals("前台用户")){
po.setUserType(true);
}else{
po.setUserType(false);
}
break;
}
case 4:{
po.setMotto(value);
break;
}
case 5:{
po.setAge(Integer.valueOf(value));
break;
}
case 6:{
if(value.equals("男")){
po.setSex(true);
}else{
po.setSex(false);
}
break;
}
}
}
//循环完之后将po赋值给list
list.add(po);
}
} catch (Exception e) {
list=null;
}finally{
swapStream.close();
}
return list;
}
Excel导入:
publicvoid inExcelUser(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//获取页面传来的参数
String dd=request.getParameter("filterExcel");
List list=null;
try {
//调用方法
list=decoderBase64File(dd);
} catch (Exception e1) {
e1.printStackTrace();
}
try {
Bsgrid bsgrid=new Bsgrid();
bsgrid.setData(list);
bsgrid.setSuccess(true);
bsgrid.setCurPage(1);
bsgrid.setTotalRows(list.size());
JSONObject jsonObject=JSONObject.fromObject(bsgrid);
PrintWriter out=response.getWriter();
out.write(jsonObject.toString());
out.flush();
out.close();
return;
} catch (Exception e) {
e.printStackTrace();
}
}
效果图如下: