使用ajax上传Excel表格的数据再保存到json里面再页面输出。。。(笔记)

在我的代码里面有很多注解,大家如果有不明白的地方可以根据注解来理清思路,如果还是不明白那就@我
下面是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:
在这里插入图片描述
架包的导入图如下:
在这里插入图片描述

效果图如下:
在这里插入图片描述

发布了152 篇原创文章 · 获赞 141 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/qq_44739706/article/details/104992422