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文件并导入数据库的更多相关文章

  1. 使用ocupload和POI一键上传Excel并解析导入数据库

    使用的工具如下:  JQuery ocupload jquery.ocupload-1.1.2.js Apache POI poi-3.9.jar 如果是Maven项目添加依赖如下: <depe ...

  2. 使用postman上传excel文件测试导入excel

    今日思语:城市的生活很快,有时学会让自己慢下来,慢慢来 对于做一些文件上传操作时,一般我们是直接在前端页面加入类型为file的input标签,也可以使用postman来进行文件的上传测试,如下: po ...

  3. 最近开发的项目,遇到用户上传excel文件并导入数据到系统这个需求,而有excel中有的单元格是日期格式,本文介绍怎么从excel中读取日期格式的数据。

    可以先判断单元格的类型,有的日期是字符串存储的,有的是按日期存储的(单元格按数字解析),代码如下: Cell cell = row.getCell(); Date date = null; if (c ...

  4. java上传excel文件及解析

      java上传excel文件及解析 CreateTime--2018年3月5日16:25:14 Author:Marydon 一.准备工作 1.1 文件上传插件:swfupload: 1.2 文件上 ...

  5. Django框架(上传Excel文件并读取)

    博主今天整理下Django框架中上传Excel文件并读取 博主是要在管理平台中新增用例的维护功能,想着通过上传Excel文件来展示用例,下面是项目的路径图: 首先先建数据库模型 model.py 可以 ...

  6. 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的路由方案,与原来的方案在使用上差别不 ...

  7. js上传Excel文件

    一.问题 需要在项目里添加一个上传excel文件的功能,因为其他同样的后台里面有上传文件的功能,第一反应就是想着直接用.了解了一下发现它是利用bootstrap的fileinput实现的,但是我怎么都 ...

  8. 基于Spring MVC实现基于form表单上传Excel文件,批量导入数据

    在pom.xml中引入: <!--处理2003 excel--> <dependency> <groupId>org.apache.poi</groupId& ...

  9. php读取excel文件并导入数据库(表头任意设定)

    最近收到一个很奇葩的需求,要求上传excel员工工资表,表格表头不固定,导入后字段名为表头的拼音,每月导入一次,当月重复导入则覆盖现有的当月表头,并且可以按照在界面上按照月份筛选显示,我写的代码主要包 ...

随机推荐

  1. Java学习资源

    Java技术路线图 指路明灯 一位资深程序员大牛给予Java初学者的学习路线建议 Java源码阅读的真实体会 概要 JDK发展历程 Java项目经验 基于java平台的常用资源 官方文档 Java™ ...

  2. 在HTML中如何把块的边框做成圆角

    adius,就是半径的意思.用这个属性可以很容易做出圆角效果,当然,也可以做出圆形效果.原理很简单,“正方形的内切圆的半径等于正方形边长的一半”.下面就做一个红色的圆. 工具/原料 Adobe Dre ...

  3. PHP 开发 APP 接口 学习笔记与总结 - JSON 结合 XML 方式封装通信接口

    要求: 1.在一个类中封装多种数据通信方法(JSON,XML),并且只通过一个入口选择需要的数据通信格式 2.客户端开发工程师可以自行选择数据传输格式(GET 方式) response.php < ...

  4. PHP中数组合并的两种方法及区别介绍

    PHP数组合并两种方法及区别 如果是关联数组,如下: 复制代码代码如下: $a = array( 'where' => 'uid=1', 'order' => 'uid', ); $b = ...

  5. Java正常关闭资源的方式

    在实际开发中,经常需要在程序中打开一些物理资源,如数据库连接.网络连接.磁盘文件等,打开这些物理资源之后必须显式关闭,否则将会引起资源泄漏. JVM的垃圾回收机制不会回收这些资源,垃圾回收机制属于Ja ...

  6. 【转】 使用Redis的Pub/Sub来实现类似于JMS的消息持久化

    http://blog.csdn.net/canot/article/details/52040415 关于个人对Redis提供的Pub/Sub机制的认识在上一篇博客中涉及到了,也提到了关于如何避免R ...

  7. GZip压缩的js文件IE6下面不能包含<script>标签

    IE6下面,GZip压缩的js文件,如果js中包含<script>标签,一遇到这样的标签,后面的内容居然都截断了,狂晕! 花了我一个晚上来找原因.. 需要将字符串'<script&g ...

  8. .NET同页面内用户控件与父页面以及控件之间方法调用

    用户控件调用父页面的方法: //获得父页面 Page p =this.Parent.Page; Type pageType = p.GetType(); //父页面的方法名 MethodInfo mi ...

  9. library not found for -lPods 的解决办法

    在老项目工程中使用cocoapods,可能会报这个错误:library not found for -lPods . 导致这个错误可能有两个原因,这两个原因在编译过程中都是有蛛丝马迹可循的. 原因1: ...

  10. C# 判断字符串是否为日期格式

    判断字符串内容是否为日期格式,并返回一个日期变量 string str; DateTime dtTime; if (DateTime.TryParse(str, out dtTime)) { //st ...