在我的代码里面有很多注解,大家如果有不明白的地方可以根据注解来理清思路,如果还是不明白那就@我
下面是index.jsp 页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>index.jsp</title>
<script type="text/javascript" src="js/jquery-1.12.4.js"></script>
</head>
<body>
<!--只要是涉及到上传文件 enctype="multipart/form-data" -->
<script type="text/javascript">
$(function(){
$("#button").click(function(){
/* var file=$('#fName').val(); */
//js提供上传的东西
var formData=new FormData();
formData.append("fName",$('#fName')[0].files[0]);
$.ajax({
url:"UploadServlet",
data:formData,
type:"POST",
//如果没有下面的三个处理方式程序会报错
contentType:false,//不对发送出去的格式进行处理
processData:false,//不对发送出去的数据进行处理
cache:false,//缓存
//我们使用ajax提交文件的时候不能修改请求头
dataType:"json",
success:function(data){
var list=eval(data);//转成JS的字符串
for(var i=0;i<list.length;i++){
$('table').append("<tr>"+
"<td>"+list[i].序号+"</td>"+
"<td>"+list[i].名字+"</td>")
}
$("table").attr("border","2")
}
});
});
});
</script>
<form action="UploadServlet" method="post" enctype="multipart/form-data">
<input type="file" name="fName" id="fName">
<input type="button" value="上传" id="button">
</form>
<!-- 使用下面的table显示数据 -->
<table>
</table>
</body>
</html>
下面是实现servlet的类:
package cn.jnti.servlet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.alibaba.fastjson.JSONObject;
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public UploadServlet() {
super();
}
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//创建一个集合专门保存所有的json对象
List<JSONObject> jsonlist=new ArrayList<JSONObject>();
//上传文件
//一般都会保存到项目里面去
String pathString=this.getServletContext().getRealPath("/Upload");
//判断路径是否存在
File file=new File(pathString);
if (!file.exists()&& !file.isDirectory()) {
//如果目录不存则创建
System.out.println("创建路径");
file.mkdir();
}
//接下来就是servlet控制台的区别
//1、创建文件上传的工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//2、创建文件解析的工具
ServletFileUpload upload=new ServletFileUpload(factory);
//解决中文乱码的问题
upload.setHeaderEncoding("UTF-8");//设置好请求头部的字符编码
//3、判断提交上传的数据是否是上传表单的数据
//通过jar判断请求的request对象是否为上传表单
/* if (!ServletFileUpload.isMultipartContent(request)) {
return;//如果不是则直接return 不往下面走
}*/
//4、使用文件工具对象, 去解析表单 使用工具解析我们上传的所有数据
try {
List<FileItem> list= upload.parseRequest(request);
//把整个表单的数据解析, 然后封装成list的集合
for (FileItem fileItem : list) {
//要区分是普通的文本框还是文件筐
if (fileItem.isFormField()) {//普通的
String nameString=fileItem.getFieldName();//拿到属性名
String valueString=fileItem.getString("UTF-8");
System.out.println(nameString+valueString);
}else{//文件的
String fileNameString=fileItem.getName();
System.out.println(fileNameString);
//5、创建输入流和输出流
InputStream inputStream=fileItem.getInputStream();
//先把上传的文件转成变成Excel对象
Workbook Workbook=jxl.Workbook.getWorkbook(inputStream);
//一个表格可能由很多数据
//有两种方法获取sheet表格1、通过sheet名称,2、通过下标访问
Sheet sheet=Workbook.getSheet(0);
//拿到操作那张表的对象,我们可以尝试拿到表的数据
int shCols=sheet.getColumns();
int shRows=sheet.getRows();
//首先先拿到我们的列名 本质就是拿到第一行的数据 第一行单元格
Cell[] cells= sheet.getRow(0);
List<String> listCols=new ArrayList<String>();
for (Cell cell : cells) {
//保存所有的列名的集合
listCols.add(cell.getContents());
}
System.out.println(shCols+"...."+shRows);
//输出单元格里面的数据
for (int i = 0; i < shRows; i++) {//外层循环控制行数
//专门保存每一行的数据
List<String> dataList=new ArrayList<String>();
for (int j = 0; j < shCols; j++) {//内层循环控制每行打印的行数
//需要拿到每个单元格的内容
Cell cell=sheet.getCell(j, i);
//输出单元格的数据内容
System.out.println(cell.getContents());
dataList.add(cell.getContents());
}
//把每行保存起来数据封装成json对象
JSONObject object=new JSONObject();
for (int j = 0; j < dataList.size(); j++) {
object.put(listCols.get(j), dataList.get(j));
System.out.println(object);
}
jsonlist.add(object);//把json对象添加到集合里面去
System.out.println();
}
FileOutputStream outputStream=new FileOutputStream(pathString+"\\"+fileNameString);
byte[] bytes=new byte[1024];
int i=0;
//下载功能
//循环将输入到数组里面如果大于0说明还有数据
while ((i=inputStream.read(bytes))>0) {
outputStream.write(bytes,0,i);
}
//关闭资源
inputStream.close();
outputStream.close();
response.setCharacterEncoding("utf-8");
response.getWriter().print(jsonlist);
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (BiffException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
// Put your code here
}
}
测试的文件需要自己编辑也就是几个数据而已,Excel表格的文件名后缀是xls:
架包的导入图如下:
效果图如下: