需求描述

前台需要上传excel表格,提交到后台,后台解析并返回给前台,展示在前台页面上!

前台部分代码与界面

<th style="padding: 7px 1px;width:150px;height: 43px;">excel导入推送人:</th>
<td>
<input id="file01" type="file" class="width_250" name="file"> <button class="button button-highlight button-pill button-large" onclick="fileUpload()">确定导入<i
class="fa fa-plus"></i></button>
</td>
//文件上传事件
function fileUpload(){
var fileName = $("#file01").val();
if(isEmpty(fileName)){
showTips("请选择文件");
$("#file01").focus();
return false;
}
if(fileName.lastIndexOf(".")!=-1){
var fileType = (fileName.substring(fileName.lastIndexOf(".")+1,fileName.length)).toLowerCase();
var suppotFile = new Array();
suppotFile[0] = "xls";
suppotFile[1] = "xlsx";
if($.inArray(fileType, suppotFile)<0){
showTips("不支持文件类型"+fileType);
return false;
}
}else{
showTips("文件只支持xls,xlsx");
return false;
}
console.log('xxxxxxxx')
showLoading(); $.ajaxFileUpload({
url : getRootPath()+'/addUserPush/fileupload.do', //用于文件上传的服务器端请求地址
secureuri : false, //是否启用安全提交,默认为false。
fileElementId : 'file01', //需要上传的文件域的ID,即<input type="file">的ID
dataType : 'text', //服务器返回的数据类型。可以为xml,script,json,html。如果不填写,jQuery会自动判断。
//data:param, //自定义参数。
success : function(data) {
console.log(data);
//提交成功后自动执行的处理函数,参数data就是服务器返回的数据。
closeLoading();
console.log(data.result);
//var userList = eval('('+data.result+')'); 此方法无法转成 json
var userList = $.parseJSON(data).result; if(typeof userList=='string') {//userList instanceof Array ---> 拦不住
showTips(userList);
return;
}else {
//遍历 userList
//多次导入
var len = $('#userInfo tr').length-1;
for(var i = 0; i < userList.length; i++){
//赋值给页面下方
userList[i].no = len+ i+1; addTr2('userInfo', -1,userList[i]);
}
}
},
error : function(data) { //提交失败自动执行的处理函数。
closeLoading();
console.log(data);
showTips("系统繁忙!"); $("#confirm").bind('click',function(){
validate();
});
return;
} }); return false; //用于避免重复提交
}

界面大概张这样

后端接收此excel并解析,返回json格式数据给前台!代码如下:

public class ReadExcel4UPUtils {

    public ReadExcel4UPUtils() {
throw new IllegalAccessError("工具类不能通过构造器初始化!");
} /**
* @Description 将MultipartFile -> File
* @param file
* @return resultMap
* @author kangkai on 18/04/03
*/
public static Map<String, Object> readMultipartFile(MultipartFile file)throws IOException {
InputStream input = file.getInputStream(); String path = ApplicationPropertiesUtil.getProperty("excel.inputRoot");
File folder = new File(path);
if(!folder.exists()){
folder.mkdirs();
} String tmpFileName = path +"/_" + UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(file.getOriginalFilename());
File tmpFile = new File(tmpFileName);
FileOutputStream output = null;
try {
output = new FileOutputStream(tmpFile);
int n = 0;
try {
while((n=input.read()) != -1){
output.write(n);
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
output.close();
input.close();
}
return readFile(tmpFile);
} /**
* @Description 读取文件
* @param file
* @return resultMap
* @author kangkai on 18/04/03
*/
public static Map<String,Object> readFile(File file){
Map<String,Object> resultMap = new HashMap<String, Object>();
List<UserPushSave.UserInfo> userList = new ArrayList<UserPushSave.UserInfo>();
String error = "";
int num =0;
/**------------- 第一步 将file文件解析为对象 ---------------*/
String fileName = file.getName();
//根据表格不同结尾,不同方式获取 Workbook
Workbook wb = null;
try {
wb = fileName.endsWith("xlsx")? new XSSFWorkbook(new FileInputStream(file)):new HSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
userList = readExcel4user(wb);
num = (null != userList)? userList.size():0;
//行数
int _index;
//**------------- 第二步 逐条对数据进行校验 ---------------*//*
if (num>0) {
for (int i = 0; i < num; i++) {
String result = checkUser(userList.get(i));
_index = i +1;
if (null != result) {
error = "第"+_index+"行 "+result+" 上传失败!";
resultMap.put("result", error);
//** 保存操作信息 *//*
return resultMap;
}else {
continue;
}
}
}else {
resultMap.put("result", "导入数据不能为空!");
return resultMap;
}
resultMap.put("result",userList);
return resultMap; } /**
* @Description 解析数据
* @param wb
* @return userList
* @author kangkai on 18/04/03
*/
public static List<UserPushSave.UserInfo> readExcel4user(Workbook wb){
//返回结果list
List<UserPushSave.UserInfo> result = new ArrayList<UserPushSave.UserInfo>();
//表格数据
List<List<String>> excelData = new ArrayList<List<String>>();
Workbook workbook = wb;
//workbook //这种方式 Excel 2003/2007/2010 都是可以处理的
Sheet sheet = workbook.getSheetAt(0); //目前只处理第一个sheet
int rowCount = sheet.getPhysicalNumberOfRows(); //获取总行数
for (int r = 1; r < rowCount; r++) { //从第2行开始遍历,第一行为表头忽略掉
if (sheet.getRow(r) == null) {
continue;
}else {
Row row = sheet.getRow(r);
int cellCount = row.getPhysicalNumberOfCells(); //获取当前行总列数
//遍历每一列
List<String> tempList = new ArrayList<String>(); //存储每一行的解析数据
cellCount = 5; //由于模板中运行存在为空的字段,所以强制设为长度5
for (int c = 0; c < cellCount; c++) {
//获取第 c 列
Cell cell = row.getCell(c);
String cellValue = "";
if (cell != null) {
cell.setCellType(Cell.CELL_TYPE_STRING); //这里将每个字段都指定为string类型
cellValue = getCellValue(cell);
}else {
cellValue = "";
}
tempList.add(cellValue); //存储excel中每一行解析后的数据
}
excelData.add(tempList);
}//存储excel解析后的数据
}
//将解析后的数据封装为对象
for(List<String> dataList : excelData) {
List<String> propertyList = getPropertyName(com.cpic.ttkh.server.vo.push.UserPushSave.UserInfo.class); List<String> setList = new ArrayList<String>();
for(String s :propertyList){
setList.add(getProperty("set",s));
}
int count_property = propertyList.size();
//定义记录字段为空个数
int count_empty = 0;
UserPushSave.UserInfo user = new UserPushSave.UserInfo();
for(int i = 0;i < count_property;i++) {
count_empty = 0;
Method m = null;
try {
m = user.getClass().getDeclaredMethod(setList.get(i),String.class);
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
String column = dataList.get(i);
if("".equals(column)) {
count_empty += 1;
}else {
//去下空格
column.trim();
}
m.invoke(user,column);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
//全部字段都是空,不添加
if(count_empty != count_property) {
result.add(user);
}else {continue;}
}
return result;
}
/**
* @Title: getCellValue
* @Description: 获取excel单元格数据
* @author: huitong.xia 2016年4月12日 下午1:13:28
* @param cell
* @return String
* @throws
*/
private static String getCellValue(Cell cell){
int cellType = cell.getCellType();
String cellValue = null;
switch(cellType) {
case Cell.CELL_TYPE_STRING: //文本
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC: //数字、日期
cellValue = String.valueOf(cell.getNumericCellValue()); //数字
break;
case Cell.CELL_TYPE_BOOLEAN: //布尔型
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_BLANK: //空白
cellValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_ERROR: //错误
cellValue = "";
break;
case Cell.CELL_TYPE_FORMULA: //公式
cellValue = "";
break;
default:
cellValue = "";
}
return cellValue;
} /**
* @Description:校验各个字段非空与是否合法
* @author: kangkai
* @param user
* @return message or null
*/
private static String checkUser(UserPushSave.UserInfo user){ // 中国公民身份证格式:长度为15或18位,最后一位可以为字母
Pattern idNumPattern = Pattern.compile("(\\d{14}[0-9a-zA-Z])|(\\d{17}[0-9a-zA-Z])");
//获取所有属性
List<String> getList = new ArrayList<String>();
List<String> propertyList = getPropertyName(com.cpic.ttkh.server.vo.push.UserPushSave.UserInfo.class);
for(String s :propertyList) {
getList.add(getProperty("get",s));
}
Method m = null;
for(int i = 0,size = getList.size();i < size;i++) {
try {
m = user.getClass().getDeclaredMethod(getList.get(i));
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String column = "";
try {
column = (String)m.invoke(user);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(i == 0 && "".equals(column)) {
return "推送人姓名为空";
}
if(i == 2 && !idNumPattern.matcher(column).matches()) {
return "证件号格式不正确";
}
if(i == 4 && "".equals(column)) {
return "推送内容为空";
}
}
return null; //用户验证合法
}
/**
* Description:根据类名 获取其所有属性名
* @param clazz
* @return stringList
*/
private static List<String> getPropertyName(Class<?> clazz) {
Field[] fds = {};
fds = clazz.getDeclaredFields();
List<String> stringList = new ArrayList<String>();
for(Field f : fds) {
stringList.add(f.getName());
}
return stringList;
} /**
* Description:根据属性名 获取其get/set方法
* @param propertyName
* @return stringList
*/
private static String getProperty(String getOrSet,String propertyName) {
StringBuilder sb = new StringBuilder("");
//构造set方法:加set 属性名首字母大写
//第一个字母 大写
char[] c = propertyName.toCharArray();
if (c[0] >= 'a' && c[0] <= 'z') {
c[0] = (char) (c[0] - 32);
}else {
throw new BusinessException("属性名异常");
}
sb.append(getOrSet).append(new String(c));
String propertySet = sb.toString();
return propertySet;
}
}

关于上方代码

  • 解析MultipartFile类型,转成File;
  • readFile方法读取,获取Workbook,并且对返回的数据校验;
  • readExcel4user方法解析到了所有数据,并返回实体list;
  • 流程大概就是这个样子,具体使用应结合校验规则与表格中数据形式 进行重写;
  • 最后,代码基于jdk1.6 。

java后台读取/解析 excel表格的更多相关文章

  1. Java使用POI解析Excel表格

    概述 Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能. 常见的Excel格式有xls和xlsx.07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx ...

  2. JXL解析Excel表格内容到数据库

    java中常用的解析Excel表格的工具一种是POI一种是JXL,POI功能强大,相比JXL稍嫌复杂,对表格样式的处理非常好:而JXL解析简单方便,对中文支持比较好. 工作中解析Excel内容上传到数 ...

  3. 使用PHPExcel解析Excel表格

    安装类库 从GitHub上下载PHPExcel类库 地址:https://github.com/PHPOffice/PHPExcel 解压后将Classes文件夹移动到ThinkPHP的extend目 ...

  4. java 使用 poi 解析excel

    背景: web应用经常需要上传文件,有时候需要解析出excel中的数据,如果excel的格式没有问题,那就可以直接解析数据入库. 工具选择: 目前jxl和poi可以解析excel,jxl很早就停止维护 ...

  5. Oracle PLSQL读取(解析)Excel文档

    http://www.itpub.net/thread-1921612-1-1.html !!!https://code.google.com/p/plsql-utils/ Introduction介 ...

  6. JXL读取写入excel表格数据

    问题描述: 使用java的jxl包创建.写入excel表格数据 问题解决: (1)说明 (2)写入execel数据 注: 以上是写入数据需要调用的函数接口 注: 具体接口调用过程,如上所示 (3)读取 ...

  7. Java:JXL解析Excel文件

    项目中,有需求要使用JXL解析Excel文件. 解析Excel文件 我们先要将文件转化为数据流inputStream. 当inputStream很大的时候 会造成Java虚拟器内存不够 抛出内存溢出 ...

  8. Java通过jxl解析Excel文件入库,及日期格式处理方式 (附源代码)

    JAVA可以利用jxl简单快速的读取文件的内容,但是由于版本限制,只能读取97-03  xls格式的Excel. 本文是项目中用到的一个实例,先通过上传xls文件(包含日期),再通过jxl进行读取上传 ...

  9. Java IO 导入导出Excel表格

    1.将excel导入到内存 1. 调用工作簿Workbook的静态方法getWorkbook(),获得工作簿Workbook对象 InputStream in = new FileInputStrea ...

随机推荐

  1. Zooming

    Zooming 是一款纯 javascript 图片缩放库,主要特点有: 不依赖其他库,纯 JavaScript 实现,支持移动设备: 流畅的动画: 可缩放高清图像: 易于集成和定制. 使用方法 1. ...

  2. JSON语法2

    把 JSON 文本转换为 JavaScript 对象 JSON 最常见的用法之一,是从 web 服务器上读取 JSON 数据(作为文件或作为 HttpRequest),将 JSON 数据转换为 Jav ...

  3. js的Base64编码与解码

    js的Base64编码与解码 pc和手机app项目中,经常需要将手机自带的表情图片转换特定的编码格式与后台进行交互. Base64其实是一种简单的置换加密方式,但是BASE64的用处往往并不是为了防止 ...

  4. python练习题-写一个函数,打印所有包含copy方法的内置对象

    代码: #encoding=utf-8for i in dir(__builtins__):    #print "i:",i    try: #这里的i是个字符串,并不能直接用d ...

  5. python进程、多进程

    进程: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当 ...

  6. C++ Word Count 发布程序

    前段时间,模仿 Linux 系统下的 wc 程序,在 Windows 系统环境下使用 C/C++ 实现了一个相似的 WC 程序,只不过有针对性,针对的是 C/C++,Java 等风格的源代码文件. 此 ...

  7. SQL去重之distinct和group by的应用

    遇到一个需求,要去重查出某张表的字段一和字段二,但是查出来的结果要按照表中记录的创建时间排序. 于是,第一时间就想到了使用distinct这个去重专用语法了: select distinct col1 ...

  8. 定制django admin页面的跳转

    在django admin的 change_view,  add_view和delete_view页面,如果想让页面完成操作后跳转到我们想去的url,该怎么做 默认django admin会跳转到ch ...

  9. PHP进程及进程间通信

    一.引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元.进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好 ...

  10. 分页器的js实现代码 bootstrap Paginator.js

    参考: http://www.jb51.net/article/76093.htm 如前所述, 不要什么都想到 jquery的 脚本js, 应该首先推荐的是 css 和 元素本身的事件 函数 如: o ...