要求做一个从网页上导入excel

要求做一个从网页上导入excel,,开始着手去实现它。

思路很简单:

1、做一个jsp页面,页面包括浏览文件,提交文件

2、将excel文件上传到服务器

3、  服务器对该excel文件进行读出

4、  将excel文件内容显示到页面上

 

环境搭建:

需要准备的包:commons-fileupload-1.2.1.jar & commons-io-1.3.2.jar 这两个包是上传用的

jxl.jar 这个包是读取excel用的 下载地址 :http://sourceforge.net/projects/jexcelapi/  建议不要用新版本,因为新版本会出现与jdk版本兼容问题,如果运行程序出现问题的时候请切换旧版本。

 

一、Jsp页面

注意:1、在jsp页面的form要使用html本身的<form>标记,而不要使用第三方视图开源框架的form标记,例如不要使用strut的<htm:form>。

   2、在<form>的属性里必须加上  ENCTYPE="multipart/form-data"

1   <h1>导入Excel</h1>
2 <hr>
3 <form action="importExcel" method="post" enctype="multipart/form-data">
4 <input type="file" name="importExcel" id="importExcel">
5 <input type="submit" value="导入">
6 </form>

二、上传excel的Servlet

注意:1、导入的excel最好用后缀为.xls,如果用.xlsx可能会导不进去。

2、在调用FileItem的write方法前必须保证文件的存放路径存在否则出现异常。commons fileupload不会自动为你建立不存在的目录。

3、上传后会对文件进行重命名,以时间为文件名进行命名

  1  public class Import ExcelServlet extends HttpServlet {
2 //缓冲区域
3 File tempPathFile;
4 //默认路径
5 String uploadTo ="D:\\";
6 // 支持的文件类型
7 String[] errorType = { ".xls" };
8 //格式化日期
9 SimpleDateFormat format =new SimpleDateFormat("yyyyMMddHHmmssSSS");
10 @Override
11 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
12 throws ServletException, IOException
13 {
14 req.setCharacterEncoding("utf-8");
15 resp.setCharacterEncoding("utf-8");
16 //取得服务器真实路径
17 uploadTo = req.getSession().getServletContext().getRealPath("\\") +"upload\\";
18 // Create a factory for disk-based file items
19 DiskFileItemFactory factory =new DiskFileItemFactory();
20 // 设置缓冲区大小,这里是4kb
21 factory.setSizeThreshold(4096);
22 // 设置缓冲区目录
23 factory.setRepository(tempPathFile);
24 // Create a new file upload handler
25 ServletFileUpload upload =new ServletFileUpload(factory);
26 // Set overall request size constraint
27 // 设置最大文件尺寸,这里是4MB
28 upload.setSizeMax(4*1024*1024);
29 // 开始读取上传信息
30 List fileItems =new ArrayList();
31 try
32 {
33 fileItems = upload.parseRequest(req);
34 }
35 catch (FileUploadException e1)
36 {
37 e1.printStackTrace();
38 }
39 // 依次处理每个上传的文件
40 Iterator iter = fileItems.iterator();
41 System.out.println("fileItems的大小是"+ fileItems.size());
42 // 正则匹配,过滤路径取文件名
43 String regExp =".+\\\\(.+)$";
44 Pattern p = Pattern.compile(regExp);
45 while (iter.hasNext())
46 {
47 FileItem item = (FileItem) iter.next();
48 // 忽略其他不是文件域的所有表单信息
49 System.out.println("正在处理"+ item.getFieldName());
50 if (!item.isFormField())
51 {
52 String name = item.getName();
53 long size = item.getSize();
54 if ((name ==null|| name.equals("")) && size ==0)
55 continue;
56 Matcher m = p.matcher(name);
57 boolean result = m.find();
58 if (result)
59 {
60 boolean flag =false;
61 for (int temp =0; temp < errorType.length; temp++)
62 {
63 if(m.group(1).endsWith(errorType[temp]))
64 {
65 flag =true;
66 }
67 }
68 if(!flag)
69 {
70 System.out.println("上传了不支持的文件类型");
71 thrownew IOException(name +": wrong type");
72 }
73 try {
74 String fileName = uploadTo + format.format(new Date()) + m.group(1).substring(m.group(1).indexOf("."));
75 item.write(new File(fileName));
76 //调用ReadExcel类进行读出excel
77 ReadExcel.readExcel(fileName, resp.getWriter());
78 System.out.println(name +"\t\t"+ size);
79 }
80 catch (Exception e)
81 {
82 e.printStackTrace();
83 }
84 }
85 }
86 else
87 {
88 // 这里添加对不是上传文件表单项的处理
89 System.out.println("这是一个表单项");
90 }
91 }
92 }
93 @Override
94 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
95 {
96 doGet(req, resp);
97 }
98 @Override
99 public void init() throws ServletException
100 {
101 tempPathFile =new File("d:\\temp\\buffer\\");
102 if (!tempPathFile.exists())
103 {
104 tempPathFile.mkdirs();
105 }
106 }
107 }

三、读出excel文件内容的类

 1   public class ReadExcel 
2 {
3 public staticvoid readExcel(String pathname, PrintWriter out)
4 {
5 try {
6 //打开文件
7 Workbook book = Workbook.getWorkbook(new File(pathname)) ;
8 //取得第一个sheet
9 Sheet sheet = book.getSheet(0);
10 //取得行数
11 int rows = sheet.getRows();
12 for(int i =0; i < rows; i++)
13 {
14 Cell [] cell = sheet.getRow(i);
15 for(int j=0; j<cell.length; j++)
16 {
17 //getCell(列,行)
18 System.out.print(sheet.getCell(j, i).getContents());
19 System.out.print("&nbsp;");
20 }
21 System.out.println("<br/>");
22 }
23 //关闭文件
24 book.close();
25 }
26 catch (BiffException e)
27 {
28 e.printStackTrace();
29 }
30 catch (IOException e)
31 {
32 e.printStackTrace();
33 }
34 }







转载于:https://www.cnblogs.com/ayan/archive/2011/12/30/2308042.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576688.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决git@github.com: Permission denied (publickey). Could not read from remote repository

原因分析 Permission denied (publickey) 没有权限的publickey &#xff0c;出现这错误一般是以下两种原因 客户端与服务端未生成 ssh key客户端与服务端的ssh key不匹配 找到问题的原因了&#xff0c;解决办法也就有了&#xff0c;重新生成一次ssh key &#xff0c;服务端也…

经典Sql大全--转

一、基础 1、说明&#xff1a;创建数据库CREATE DATABASE database-name2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开…

springcloud config服务端配置(二)

接着上一篇把把本地仓库yml文件推送到github之后&#xff0c;下面我们就是实战了&#xff0c;各个微服务如何读取到远程仓库的的yml文件配置 一&#xff0c;新建一个Module模块microservicecloud-config-3344 它即为Cloud配置中心模块 二&#xff0c;pom文件添加依赖 <?xm…

电脑很卡~~~~为什么???

问题&#xff1a;最近电脑不知道为什么&#xff0c;只要连接USB下载或是用QQ视频聊天&#xff0c;电脑就很卡&#xff0c;速度超级慢&#xff0c;连千千静听播放的速度都很慢&#xff0c;唱的歌都是断断续续的&#xff01; 用杀毒软件又查不到毒&#xff0c;漏洞全补好了&#…

循环队列CircleQueue的使用

循环队列CircleQueue 的使用 循环队列是实际编写应用中比较重要的一种数据结构&#xff0c;下面介绍在实际项目中用到的循环队列CircleQueue。它是用C编写的&#xff0c;具体源代码见 https://github.com/duankai/CircleQueue template<typenameAnyData> struct DATA_NOD…

C4996    'fopen': This function or variable may be unsafe

C4996 fopen: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 在工程文件处右击&#xff0c;选择属性->配置属性->C/C->预处理器 加入一个_CR…

atmega8 例程:USART串口通信

/***************************************************************** * 函数库说明&#xff1a;ATMEGA8 串口通信 * 版本&#xff1a; v1.0 * 修改&#xff1a; 庞辉 芜湖联大飞思卡尔工作室 …

排序二叉树 SortBinaryTree

排序二叉树 SortBinaryTree 排序二叉树是比较基本但是重要的算法,它在许多实际编码中都不可缺少&#xff0c;还有不少算法和数据结构都基于此。比如&#xff0c;二叉查找树&#xff0c;平衡二叉树&#xff0c;红黑树等等。 SortBinaryTree的源代码见: https://github.com/…

使用postman操作ElasticSearch

下载安装好postman之后 添加索引blog1&#xff08;因为ElasticSearch是restful请求所以我们用postman发送http请求给ElasticSearch&#xff09; { "mappings":{ "article":{ "properties":{ "i…

图像处理基本算法-形态学

形态学一般是使用二值图像&#xff0c;进行边界提取&#xff0c;骨架提取&#xff0c;孔洞填充&#xff0c;角点提取&#xff0c;图像重建。基本的算法:膨胀腐蚀&#xff0c;开操作&#xff0c;闭操作&#xff0c;击中击不中变换 几种算法进行组合&#xff0c;就可以实现一些非…

定时器Timer的实现

定时器Timer的实现 定时器在实际项目中会用的比较平凡。因此&#xff0c;本文首先介绍定时器Timer的windows版本&#xff0c;跨平台的定时器将在下一篇文章中介绍。它们的源代码均用C编写。源代码详见&#xff1a;https://github.com/duankai/Timer。 1. 定时器结构体类型…

使用kibana客户端工具操作ElasticSearch(增删改查一)

&#xff08;因为ElasticSearch是restful请求所以 get post put delete这四种常见的请求&#xff09; put添加数据 get获取数据 #创建索引库lib 并且对索引库做了分片和备份&#xff08;由于这里是单机的ElasticSearch备份0&#xff09; PUT /lib/ {"settings"…

[恢]hdu 1040

2011-12-15 23:42:25 地址&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1040 题意&#xff1a;给n个数&#xff0c;排序后输出。 代码&#xff1a; # include <stdio.h># include <stdlib.h>int a[1010] ;int cmp(const void *a, const void *b){return…

C++发送邮件

C 发送邮件 在许多应用程序中&#xff0c;都会或多或少地用到邮件发送程序。本文首先介绍发送邮件必须用到的协议SMTP&#xff0c;然后给出用C写的一个邮件发送类。 邮件发送要用到邮件服务器和一个邮箱账户&#xff0c;这样你就可以用本文的demo程序进行邮件发送了。 邮件发送…

kibana客户端工具操作ElasticSearch(增删改查二)

#不指定id情况下 ElasticSearch自动生成id PUT /lib/user/ {"first_name":"Douglas","last_name":"Fir","age":23,"about":"I like to build cabinets","interests":["forestry"] …

机器学习笔记(一) : 线性建模——最小二乘法

讨论这个方法之前&#xff0c;先说些题外话。首先&#xff0c;我感觉机器学习是一门值得我们去了解和学习的一门技术&#xff0c;它不仅仅应用于我们的生活&#xff0c;而且不断地在改变着我们的方方面面。虽然很早就已经接触它&#xff0c;并开始学习&#xff0c;但是总体感觉…

昨天、今天、明天

三天&#xff1a;昨天、今天、明天。人的一生&#xff0c;用这简单的6个字概括&#xff0c;形成了人生的一条“经”线&#xff0c;富有哲理&#xff0c;令人遐思。 今天处于昨天与明天的交接点上&#xff0c;我们每一天都在告别昨天&#xff0c;每一天又都在迎接明天。如果…

ElasticSearch快速入门(一)介绍

Devops运维 ● Node(节点):单个的装有Elasticsearch服务并且提供故障转移和扩展的服务 器。 ●Cluster (集群) :一-个集群就是由一个或多个node组织在一 起&#xff0c;共同工作&#xff0c; 共同分享整个数据具有负载均衡功能的集群。 ● Document (文档) : -一个文档是-一个可…

flash遨游缓存问题

来源&#xff1a;http://leftice.iteye.com/blog/806605 Flash需要和JS交互,但是在ie外壳浏览器下,有时候缓存会导致页面刷新后flash无法工作. 会报出SecurityError. 这是因为Flash并没有完全准备好,就尝试和JS交互导致的问题. 解决的问题方式有几种: 1.在页面上设置不缓存,网上…

机器学习笔记(二)——多变量最小二乘法

在上一节中&#xff0c;我们介绍了最简单的学习算法——最小二乘法去预测奥运会男子100米时间。但是可以发现&#xff0c;它的自变量只有一个&#xff1a;年份。通常&#xff0c;我们所面对的数据集往往不是单个特征&#xff0c;而是有成千上万个特征组成。那么我们就引入特征的…