java上传excel文件及解析
java上传excel文件及解析
CreateTime--2018年3月5日16:25:14
Author:Marydon
一、准备工作
1.1 文件上传插件:swfupload;
1.2 文件上传所需jar包:commons-fileupload-1.3.1.jar和commons-io-2.2.jar;
1.3 解析excel所需jar包:dom4j-1.6.1.jar,poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar,poi-ooxml-schemas-3.8-20120326.jar和xmlbeans-2.3.0.jar
1.4目录结构

二、代码展示
2.1 客户端代码设计
JSP部分
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>excel导入演示</title>
<%@ include file="commons/jsp/include.jsp" %>
<script type="text/javascript" src="<c:url value="/commons/js/swfupload/swfupload.js" />"></script>
<script type="text/javascript" src="index.js"></script>
</head>
<body>
<table>
<tbody>
<tr>
<td align="right">导入排班信息</td>
<td>
<input id="FILENAME" maxlength="256" type="text" class="" readonly/>
<input id="saveFileName" type="hidden"/>
</td>
<td>
<span id="ButtonPlaceholder"></span>
<input onclick="readExcel();" type="button" value="导入"/>
</td>
</tr>
</tbody>
</table>
</body>
</html>
js文件
var uploadItem;
// 页面加载
$(function() {
// 必须是页面加载完毕后,再实例化该对象
uploadItem = new UploadItem();
}); /**
* 导入Excel
* @returns
*/
function readExcel() {
var FILENAME = $("#saveFileName").val();// 上传文件
if(FILENAME == ""){
Dialog.Alert('消息提示',"请点击浏览按钮选择EXCEL文件!",null,null,100);
return;
} var param = "FILENAME=" + FILENAME;//文件名字
$.ajax({
type : 'POST',
url : baseUrl + "/readExcel.do",
data : param,
success : function(result) {
var result = eval("(" + result + ")");
$get('FILENAME').value = "";
$get('saveFileName').value = "";
// 返回执行结果
var returnMsg = result.msg;
if ("数据导入成功!" != result.msg) {
returnMsg = result.expMsg;
}
alert(returnMsg);
}
});
}
/*
* SWFUpload 浏览按钮:上传文件到文件夹
*/
function UploadItem() {
var object = this; this.settings_object = {
flash_url : baseUrl + "/commons/js/swfupload/swfupload.swf",
upload_url : baseUrl + "/uploadExcel.do",
file_post_name : "uploadFile",
post_params:{"test":"测试参数传递"},
file_size_limit : "20 MB",
file_types : "*.xls;*.xlsx",
file_types_description : "excel File",
file_upload_limit : "0", file_queued_handler : fileQueued,// 指定文件上传事件
upload_error_handler : uploadError,// 指定上传异常处理事件
file_queue_error_handler : fileQueueError,//文件上传校验事件异常处理
upload_success_handler : uploadSuccess,// 指定上传成功事件 button_image_url : baseUrl + "/commons/images/browser.gif",
button_placeholder_id : "ButtonPlaceholder",// 根据ID绑定浏览按钮及事件
button_width : 69,
button_height : 21, debug : false
}; this.swfu = new SWFUpload(object.settings_object); /**
* 开始上传
*/
this.startUpload = function () {
object.swfu.startUpload();
}; } function fileQueued(file) {
uploadItem.startUpload();
}; /**
* 上传成功
* @param file
* @param serverData
* @returns
*/
function uploadSuccess(file, result) {
var result = eval("(" + result + ")");
$get("FILENAME").value = result.oldFileName;
$get("saveFileName").value = result.saveFileName;
} function fileQueueError(file, errorCode, message) {
switch (errorCode) {
case -100:
message = "您上传的文件过大!";// QUEUE_LIMIT_EXCEEDED
break;
case -110:
message = "您上传的文件过大!";// FILE_EXCEEDS_SIZE_LIMIT
break;
case -120:
message = "您上传的文件类型不正确!";// ZERO_BYTE_FILE
break;
case -130:
message = "您上传的文件类型格式错误!";// INVALID_FILETYPE
break;
default:
break;
} alert(result.msg);
$get('FILENAME').focus();
}; /**
* 上传失败
* @param file
* @param errorCode
* @returns
*/
function uploadError(file, errorCode) {
var result = eval("(" + errorCode + ")");
alert(result.msg);
};
2.2 服务器端代码设计
文件上传代码
package controller; import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload; /**
* Servlet implementation class UploadExcel
*/
@WebServlet("/uploadExcel.do")
public class UploadExcelController extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 指定保存路径
String fileSavePath = "/upload";
String rootPath = this.getServletContext().getRealPath("");
fileSavePath = rootPath + fileSavePath;
// 获取前台传参
String param = request.getParameter("test");
System.out.println("获取前台参数:" + param); // 上传操作
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
String saveFileName = "";
String oldFileName = "";
try {
List items = upload.parseRequest(request);
if (null != items) {
Iterator itr = items.iterator();
while (itr.hasNext()) {
FileItem item = (FileItem) itr.next();
if (!item.isFormField()) {// 文件格式
// 以当前精确到秒的日期为上传的文件的文件名
saveFileName = this.getServerSysDateAndTimeAsCode();
oldFileName = item.getName();
String fileType = oldFileName.substring(oldFileName.lastIndexOf("."));
saveFileName += fileType;
// 空文件对象路径+文件名
File savedFile = new File(fileSavePath, saveFileName);
// 写入
item.write(savedFile);
}
}
} StringBuffer sb = new StringBuffer();
// key和value两边都必须带""
sb.append("{").append("\"oldFileName\"").append(":").append("\"").append(oldFileName).append("\"")
.append(",").append("\"saveFileName\"").append(":").append("\"").append(saveFileName).append("\"").append("}");
// json字符串:文件名称及文件路径
String returnMsg = sb.toString();
System.out.println(returnMsg);
// 返回信息
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter(); // 返回页面
out.print(returnMsg); } catch (Exception e) {
e.printStackTrace();
} } /**
* 获得当前日期【long型】作为文件名称
* @return
*/
public String getServerSysDateAndTimeAsCode() {
String result = null;
long currentTimeInMilis = Calendar.getInstance().getTimeInMillis();
result = String.valueOf(currentTimeInMilis);
return result;
}
}
解析excel package controller; import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import bo.BoExcelImpl;
import bo.IBoExcel; /**
* Servlet implementation class AnalyzeExcelController
*/
@WebServlet("/readExcel.do")
public class AnalyzeExcelController extends HttpServlet {
private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
} protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String FILENAME = request.getParameter("FILENAME");
String msg = "";
String expMsg = "";
IBoExcel boExcel = new BoExcelImpl();
try {
String path = this.getServletContext().getRealPath("/upload");
// 上传excel的绝对路径
path += File.separator + FILENAME;
// 解析excel数据
boolean isSuccess = boExcel.readExcel(path); if (isSuccess) {
msg = "数据导入成功!";
} else {
msg = "数据导入失败!";
} } catch (Exception e) {
expMsg = e.getMessage();
} finally {
StringBuffer sb = new StringBuffer();
sb.append("{").append("\"msg\"").append(":").append("\"").append(msg).append("\"").append(",")
.append("\"expMsg\"").append(":").append("\"").append(expMsg).append("\"").append("}");
// json字符串:文件名称及文件路径
String returnMsg = sb.toString();
System.out.println(returnMsg); // 返回信息
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter(); // 返回页面
out.print(returnMsg);
} } }
业务层
package bo; import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import tools.ReadExcelUtils; /**
*
* @author Marydon
* @createTime 2018年3月2日下午8:01:07
* @updateTime
* @Email:Marydon20170307@163.com
* @version:1.0.0
*/
public class BoExcelImpl implements IBoExcel {
private Logger log = Logger.getLogger(this.getClass()); @Override
public boolean readExcel(String filePath) throws Exception {
try {
boolean isSuccess = false; ReadExcelUtils excelReader = new ReadExcelUtils(filePath); List<String> columnsList = new ArrayList<String>();
columnsList.add("ORG_ID");
columnsList.add("DEPENT_NAME");
columnsList.add("DOCTOR_NAME");
columnsList.add("DOCTOR_PHONE");
columnsList.add("SCHEDULE_DATE");
columnsList.add("WEEK_TXT");
columnsList.add("WB_TYPE");
columnsList.add("CLOSE_TZ");
columnsList.add("REPLACE_TZ"); // 1.对读取Excel表格内容
List<Map> scheduleList = excelReader.readExcelContent(columnsList);
System.out.println(scheduleList); isSuccess = true; // 删除该上传的文件
File excelFile = new File(filePath);
if (excelFile.exists()) {
excelFile.delete();
}
return isSuccess;
} catch (Exception e) {
log.error(e.getMessage());
throw new RuntimeException(e.getMessage(), e);
}
}
}
效果展示:
excel文件

上传成功

刷新upload目录

导入成功


注意:
1.文章中的Dialog和$get()是自定义封装的方法,无需理会;
2.其中,excel中代表数值的字段,需要改成文本格式,否则解析出来后面会带".0";
3.关于上面为什么要抛出运行时异常?
在往数据库中批量插入数据时,如果中间插入失败,需要进行回滚。
java上传excel文件及解析的更多相关文章
- java上传excel到后台解析入库
背景:最近需要做一个excel模板导入的功能,以便用户可以自己增删改查数据,当然,只有特别的用户才能有此权限,捋了捋思路,还是从前端写起 实现: 页面最后的效果如下,可以自己修改,删除,导入导出数据, ...
- koa上传excel文件并解析
1.中间键使用 koa-body npm install koa-body --save const koaBody = require('koa-body'); app.use(koaBody({ ...
- SpringMVC文件上传 Excle文件 Poi解析 验证 去重 并批量导入 MYSQL数据库
SpringMVC文件上传 Excle文件 Poi解析并批量导入 MYSQL数据库 /** * 业务需求说明: * 1 批量导入成员 并且 自主创建账号 * 2 校验数据格式 且 重复导入提示 已被 ...
- ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 try.dot.net 的正确使用姿势 .Net NPOI 根据excel模板导出excel、直接生成excel .Net NPOI 上传excel文件、提交后台获取excel里的数据
ASP.NET Core 2.2 : 十六.扒一扒新的Endpoint路由方案 ASP.NET Core 从2.2版本开始,采用了一个新的名为Endpoint的路由方案,与原来的方案在使用上差别不 ...
- js上传Excel文件
一.问题 需要在项目里添加一个上传excel文件的功能,因为其他同样的后台里面有上传文件的功能,第一反应就是想着直接用.了解了一下发现它是利用bootstrap的fileinput实现的,但是我怎么都 ...
- java上传xls文件
using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System. ...
- edtftpj让Java上传FTP文件支持断点续传
在用Java实现FTP上传文件功能时,特别是上传大文件的时候,可以需要这样的功能:程序在上传的过程中意外终止了,文件传了一大半,想从断掉了地方继续传:或者想做类似迅雷下载类似的功能,文件太大,今天传一 ...
- Django框架(上传Excel文件并读取)
博主今天整理下Django框架中上传Excel文件并读取 博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图: 首先先建数据库模型 model.py 可以 ...
- java+上传大文件
在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...
随机推荐
- 将代码库从 SVN 迁移至 Git 并保留所有 commit 记录
公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够 ...
- 初识云计算的三种服务模式 (IaaS SaaS PaaS)
近期公司在使用其它云服务的同一时候.要封装自己的云服务,以下作为开发产品前的热身.来了解云计算中的三种服务模式,笔者也是从网络上查找,进行综合总结.请拍.. 三种服务模式 依据如今最经常使用.也就是比 ...
- 算法:快速排序(Quick Sort)
算法定义 目前学习是五种排序(冒泡.插入.选择.合并.快速)中,快速排序是最让我喜欢的算法(因为我想不到),其定义如下: 随机的从数组中选择一个元素,如:item. 对数组进行分区,将小于等于 ite ...
- UITableView的headerView展开缩放动画
UITableView的headerView展开缩放动画 效果 源码 https://github.com/YouXianMing/Animations // // HeaderViewTapAnim ...
- [翻译] AnimatedPath 动画路径(持续更新)
AnimatedPath动画路径 感谢原作者分享精神,有空补上使用教程 https://github.com/twotoasters/AnimatedPath AnimatedPath explore ...
- 基于CXF框架下的SOAP Webservice服务端接口开发
最近对webservice 进行入门学习,网上也是找了很多的学习资料.总得感觉就是这了解点,那了解点.感觉不够系统,不够容易入门.差不多断断续续看了一个星期了,今天小有成果,把客户端,服务端都搞定了. ...
- json的好处-新一代数据传输利器
JSON是一种轻量级的数据交换格式!和xml一样. 为什么不XML XML的冗余太大,不过XML阅读起来比较方面,所以并没有被json完全取代,很多时候都是并存.比如sina微博的开发平台有一个JSO ...
- 第十三章 springboot + lombok
lombok作用:消除模板代码. getter.setter.构造器.toString().equals() 便捷的生成比较复杂的代码,例如一个POJO要转化成构建器模式的形式,只需要一个注解. 注意 ...
- 使用Java、Matlab画多边形闭合折线图
由于写论文要将“哈密顿回路问题(TSP)”的求解中间结果表示出来,查了一下使用程序画多边形图形.现在在总结一下,这个图是“由给定节点首尾相连的”闭合多边形. 1.使用matlab作闭合多边形图 没有找 ...
- IOS中Key-Value Coding (KVC)的使用详解
kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性.直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性. 下面介绍一下kvc ...