jsp上传excel文件并导入数据库
1,excel文件的上传
需要借助jar包:commons-fileupload-1.2.1.jar以及commons-io-1.3.2.jar
前端的html文件
<form id="file_form" action="UpdFile" enctype="multipart/form-data"
method="post">
<input type="file" name="file" id="file_input" />
<input type="submit" value="文件上传" id='upFile-btn'>
</form>
2,利用ajax提交文件
为了在本页面提交文件,利用到jquery.js以及jqurey-form.js
前端验证以及提交的javascript代码如下:
<script type="text/javascript">
$(function() { $("#file_form").submit(
function() {
//首先验证文件格式
var fileName = $('#file_input').val();
if (fileName === '') {
alert('请选择文件');
return false;
}
var fileType = (fileName.substring(fileName
.lastIndexOf(".") + , fileName.length))
.toLowerCase();
if (fileType !== 'xls' && fileType !== 'xlsx') {
alert('文件格式不正确,excel文件!');
return false;
} $("#file_form").ajaxSubmit({
dataType : "json",
success : function(data, textStatus) {
if (data['result'] === 'OK') {
console.log('上传文件成功');
} else {
console.log('文件格式错误');
}
return false;
}
});
return false;
}); });
</script>
3,后台利用poi文件对excel文件进行读取(导入数据库的过程暂略)
使用到的相关jar包有:
poi-3.5-beta5.jar; poi-contrib-3.5-beta5.jar; poi-ooxml-3.5-beta5.jar poi-scratchpad-3.5-beta5.jar
如果是97-03版本,后缀为xls的excel文件,以上jar就已足够,如果还需要读取07版本及以后,后缀为xlsx的excel,还需要借助于jar包:
xbean.jar
dom4j-1.6.1.jar
对应网站后台的servlet处理文件:
package com.bobo.servlet; import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import java.util.Random; import javax.servlet.ServletException;
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; import com.bobo.helper.ExcelHelper; public class UpdFile extends HttpServlet { /**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { process(request, response);
} /**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to
* post.
*
* @param request
* the request send by the client to the server
* @param response
* the response send by the server to the client
* @throws ServletException
* if an error occurred
* @throws IOException
* if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
process(request, response);
} private void process(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out = response.getWriter();
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding(request.getCharacterEncoding());
ExcelHelper helper = new ExcelHelper();
try {
List<FileItem> list = upload.parseRequest(request);
for (int i = ; i < list.size(); i++) {
FileItem item = list.get(i);
if (item.getName().endsWith(".xls")||item.getName().endsWith(".xlsx")) {
// 说明是文件,不过这里最好限制一下
//helper.importXls(item.getInputStream());
helper.importXlsx(item.getInputStream());
out.write("{\"result\":\"OK\"}");
} else {
// 说明文件格式不符合要求
out.write("{\"result\":\"Invalid\"}");
}
}
out.flush();
out.close(); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
4,其中helper.importXlsx(item.getInputStream())的方法如下:
// 读取单元格的值
private String getValue(Cell cell) {
String result = ""; switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
result = cell.getBooleanCellValue() + "";
break;
case Cell.CELL_TYPE_STRING:
result = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_FORMULA:
result = cell.getCellFormula();
break;
case Cell.CELL_TYPE_NUMERIC:
// 可能是普通数字,也可能是日期
if (HSSFDateUtil.isCellDateFormatted(cell)) {
result = DateUtil.getJavaDate(cell.getNumericCellValue())
.toString();
} else {
result = cell.getNumericCellValue() + "";
}
break;
}
return result;
} /***
* 这种方法支持03,和07版本的excel读取
* 但是对于合并的单元格,除了第一行第一列之外,其他部分读取的值为空
* @param is
*/
public void importXlsx(InputStream is) {
try {
Workbook wb = WorkbookFactory.create(is);
// OPCPackage pkg = OPCPackage.open(is);
// XSSFWorkbook wb = new XSSFWorkbook(pkg);
for (int i = , len = wb.getNumberOfSheets(); i < len; i++) {
Sheet sheet = wb.getSheetAt(i);
for (int j = ; j <= sheet.getLastRowNum(); j++) {
if (sheet == null) {
return;
}
Row row = sheet.getRow(j);
if(row==null){
return;
}
// 读取每一个单元格
for (int k = ; k < row.getLastCellNum(); k++) {
Cell cell = row.getCell(k);
if (cell == null) {
return;
}
System.out.print(getValue(cell)); }
System.out.println();
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
1)该方法可以读取xls文件,也可以读取xlsx文件
2)对于合并的单元格,对于xls文件有对应的方法解决,xlsx文件,还没有发现相关的解决方案,只能除了第一行第一列之外,其他都为空字符串这种方法读取了
处理合并单元格部分的代码:
/**
* 判断是否是合并的单元格,如果是的话,返回合并区域,否则返回空(仅适用于)
*
* @param sheet
* @param cellRow
* @param cellColumn
* @return
*/
private CellRangeAddress isMerged(Sheet sheet, Cell cell) { CellRangeAddress result = null;
CellRangeAddress cra = null;
int cellRow = cell.getRowIndex();
int cellColumn = cell.getColumnIndex();
int mergedNum = sheet.getNumMergedRegions();
for (int i = ; i < mergedNum; i++) {
// 如果是xlsx的格式,怎么办?
cra = ((HSSFSheet) sheet).getMergedRegion(i);
if (cellRow >= cra.getFirstRow() && cellRow <= cra.getLastRow()
&& cellColumn >= cra.getFirstColumn()
&& cellColumn <= cra.getLastColumn()) {
result = cra;
}
}
return result;
} private String getCellValue(Sheet sheet, Cell cell) {
String result = "";
// 判断是否是合并的单元格
CellRangeAddress cra = null;
if ((cra = isMerged(sheet, cell)) != null) {
Cell fcell = sheet.getRow(cra.getFirstRow()).getCell(
cra.getFirstColumn());
result = getValue(fcell);
} else {
result = getValue(cell);
}
return result;
}
jsp上传excel文件并导入数据库的更多相关文章
- 使用ocupload和POI一键上传Excel并解析导入数据库
使用的工具如下: JQuery ocupload jquery.ocupload-1.1.2.js Apache POI poi-3.9.jar 如果是Maven项目添加依赖如下: <depe ...
- 使用postman上传excel文件测试导入excel
今日思语:城市的生活很快,有时学会让自己慢下来,慢慢来 对于做一些文件上传操作时,一般我们是直接在前端页面加入类型为file的input标签,也可以使用postman来进行文件的上传测试,如下: po ...
- 最近开发的项目,遇到用户上传excel文件并导入数据到系统这个需求,而有excel中有的单元格是日期格式,本文介绍怎么从excel中读取日期格式的数据。
可以先判断单元格的类型,有的日期是字符串存储的,有的是按日期存储的(单元格按数字解析),代码如下: Cell cell = row.getCell(); Date date = null; if (c ...
- java上传excel文件及解析
java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...
- Django框架(上传Excel文件并读取)
博主今天整理下Django框架中上传Excel文件并读取 博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图: 首先先建数据库模型 model.py 可以 ...
- 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实现的,但是我怎么都 ...
- 基于Spring MVC实现基于form表单上传Excel文件,批量导入数据
在pom.xml中引入: <!--处理2003 excel--> <dependency> <groupId>org.apache.poi</groupId& ...
- php读取excel文件并导入数据库(表头任意设定)
最近收到一个很奇葩的需求,要求上传excel员工工资表,表格表头不固定,导入后字段名为表头的拼音,每月导入一次,当月重复导入则覆盖现有的当月表头,并且可以按照在界面上按照月份筛选显示,我写的代码主要包 ...
随机推荐
- Java学习资源
Java技术路线图 指路明灯 一位资深程序员大牛给予Java初学者的学习路线建议 Java源码阅读的真实体会 概要 JDK发展历程 Java项目经验 基于java平台的常用资源 官方文档 Java™ ...
- 在HTML中如何把块的边框做成圆角
adius,就是半径的意思.用这个属性可以很容易做出圆角效果,当然,也可以做出圆形效果.原理很简单,“正方形的内切圆的半径等于正方形边长的一半”.下面就做一个红色的圆. 工具/原料 Adobe Dre ...
- PHP 开发 APP 接口 学习笔记与总结 - JSON 结合 XML 方式封装通信接口
要求: 1.在一个类中封装多种数据通信方法(JSON,XML),并且只通过一个入口选择需要的数据通信格式 2.客户端开发工程师可以自行选择数据传输格式(GET 方式) response.php < ...
- PHP中数组合并的两种方法及区别介绍
PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...
- Java正常关闭资源的方式
在实际开发中,经常需要在程序中打开一些物理资源,如数据库连接.网络连接.磁盘文件等,打开这些物理资源之后必须显式关闭,否则将会引起资源泄漏. JVM的垃圾回收机制不会回收这些资源,垃圾回收机制属于Ja ...
- 【转】 使用Redis的Pub/Sub来实现类似于JMS的消息持久化
http://blog.csdn.net/canot/article/details/52040415 关于个人对Redis提供的Pub/Sub机制的认识在上一篇博客中涉及到了,也提到了关于如何避免R ...
- GZip压缩的js文件IE6下面不能包含<script>标签
IE6下面,GZip压缩的js文件,如果js中包含<script>标签,一遇到这样的标签,后面的内容居然都截断了,狂晕! 花了我一个晚上来找原因.. 需要将字符串'<script&g ...
- .NET同页面内用户控件与父页面以及控件之间方法调用
用户控件调用父页面的方法: //获得父页面 Page p =this.Parent.Page; Type pageType = p.GetType(); //父页面的方法名 MethodInfo mi ...
- library not found for -lPods 的解决办法
在老项目工程中使用cocoapods,可能会报这个错误:library not found for -lPods . 导致这个错误可能有两个原因,这两个原因在编译过程中都是有蛛丝马迹可循的. 原因1: ...
- C# 判断字符串是否为日期格式
判断字符串内容是否为日期格式,并返回一个日期变量 string str; DateTime dtTime; if (DateTime.TryParse(str, out dtTime)) { //st ...