写在前面:

  项目环境:jdk1.4+weblogic

  需求:能上传excel2003+2007

  由于项目不仅需要上传excel2003,还要上传excel2007,故我们抛弃了jxl(只能上传excel2003),选择了poi,在选poi的jar包的版本的时候,是真心的不容易呀,连找个jar都找了一两天,因为不仅要支持jdk1.4(丫丫的,无fuck说),还要能读取excel2007的。最后还是在csdn上花了6积分下载的....jar包(貌似只有这个才是支持jdk1.4的):dom4j-1.6.1.jar,geronimo-stax-api_1.0_spec-1.0.jar,ooxml-schemas-1.0.jar,poi-3.7-jdk1.4-20110508-rc2.jar,poi-3.7-jdk1.4-ooxml-20110508-rc2.jar,poi-3.7-jdk1.4-scratchpad-20110508-rc2.jar,xbean.jar,xmlbeans-qname.jar 然后如果我们要从服务器上读取excel文件的话 ,我们首先要上传文件到服务器,这里有很多方法,为了方便,保留了项目中jspsmart的上传文件的方法,很好用,因为excel2003跟2007都可以上传啦。故全部的jar包如图:

功能:在index.jsp点击上传excel文件,文件上传到服务器,然后并在index2.jsp页面中显示出excel文件中内容

1.导入jar包(poi+jspsmart)

2.编写index.jsp

3.编写index2.jsp,代码如图(这是在jsp中的代码):

注意注意在jsp中一定要导入用到的相关类的class路径

  <body>
<%
//利用jspsmart将文件上传到服务器
SmartUpload su = new SmartUpload();
su.initialize(pageContext);
su.setMaxFileSize(200000); //2m
su.setTotalMaxFileSize(200000);
//设置允许上传的文件类型
su.setAllowedFilesList("xls,txt,xlsx");// allow upload
su.upload();
//获取上传的文件的名
com.jspsmart.upload.File myFile = su.getFiles().getFile(0);
String my_file_name = myFile.getFileName();
boolean go_update = true;
if (go_update) {
//将文件上传到项目的excelupload文件夹下 这里注意要现在项目根创建这个文件
if(my_file_name.endsWith(".xls")){
//excel2003 后缀名.xls
myFile.saveAs("/excelupload/" + my_file_name);
}else if(my_file_name.endsWith(".xlsx")){
//excel2007 后缀名.xlsx
myFile.saveAs("/excelupload/" + my_file_name);
} } //利用poi 读取内容
Workbook workbook = null;
Sheet sheet = null;
try { String filePath = application.getRealPath("/") + "\\excelupload\\" + my_file_name;
FileInputStream fis = new FileInputStream(filePath); //做判断
if(my_file_name.endsWith(".xls")){
workbook = new HSSFWorkbook(fis);
}else if(my_file_name.endsWith(".xlsx")){
workbook = new XSSFWorkbook(fis);
} sheet = workbook.getSheetAt(0);
//excel中行数
int rowCount = sheet.getLastRowNum() + 1;
int columnCount;
//out.println("rowCount:==="+rowCount); for(int i=0;i<rowCount;i++){
Row row = sheet.getRow(i);
//每行中的列数
columnCount = row.getLastCellNum();
//out.println("columnCount:==="+columnCount);
%>
<br>
<%
//在页面中遍历打印出excel每一行的内容
for(int j=0;j<columnCount;j++){
Cell cell = row.getCell(j);
//这里读取cell中内容时,要对内容进行转换为对应的类型,故这里封装了一个类,专门用来转换类型
out.print(FormatUtil.getCellStringValue(cell)+"\r\n\r\n");
}
%>
<br>
<%
}
} catch (Exception e) {
out.println(e);
}
%>
</body>

3.index2.jsp中用到了一个类型转换类FormatUtil中getCellStringValue()方法(自己写的,放在单独的类中),如下图:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell; public class FormatUtil { public static String getCellStringValue(Cell cell) {
String cellValue = "";
switch (cell.getCellType()) {
//字符串
case HSSFCell.CELL_TYPE_STRING:
cellValue = cell.getStringCellValue();
if(cellValue.trim().equals("")||cellValue.trim().length()<=0)
cellValue=" ";
break;
//日期格式 数字
case HSSFCell.CELL_TYPE_NUMERIC:
if(HSSFDateUtil.isCellDateFormatted(cell)){
Date d = cell.getDateCellValue();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cellValue = df.format(d);
}else{
cellValue = String.valueOf(cell.getNumericCellValue());
} break;
//公式
case HSSFCell.CELL_TYPE_FORMULA:
cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
cellValue = String.valueOf(cell.getNumericCellValue());
break;
//空值
case HSSFCell.CELL_TYPE_BLANK:
cellValue="";
break;
//boolean
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = cell.getBooleanCellValue() + "";
break;
//故障
case HSSFCell.CELL_TYPE_ERROR:
cellValue = "非法字符";
break; default:
cellValue = "未知类型";
break;
} return cellValue;
}
}

4.运行项目,选择excel,可以看到效果如下:

成功啦........嘻嘻。。。。

5.查看服务器上传文件的文件夹,里面多了自己刚上传的文件:

项目中jar包冲突问题(快速定位jar包加载路径):

  虽然在本地运行是可以的,但是其实也是走了很多路,因为当我把项目放在测试服务器weblogic上面跑的时候,就一直在报错,报错内容如

其中的内容就是说 found:org.apache.poi.hssf.usermodel.HSSFWorkbook    required:org.apache.poi.ss.usermodel.Workbook

workbook = new HSSFWorkbook(fis); 即找不到Workbook,可是我的jsp明明已经导入了Workbook的calss的相关路径啊,再说了在本地跑的时候也是正确的,这是为什么呢?唯一的原因就是jar包冲突了,因为服务器上有很多jar包,但是现在不知道是哪一个jar包冲突怎么办???啊,在网上查阅了一天的资料,终于 找到了一个办法来测试是什么jar包冲突的,代码如下:

        //Workbook与HSSFWorkbook类所在哦jar应该是一样的
//打印出poi的核心jar的路径
//打印出org.apache.poi.ss.usermodel.Workbook类所在jar包的路径
ClassLoader classloader = org.apache.poi.ss.usermodel.Workbook.class.getClassLoader();
java.net.URL res = classloader.getResource("org/apache/poi/ss/usermodel/Workbook.class");
String path = res.getPath();
System.out.println("POI Core came from "+ path);
//library-1.0I20080604_tomcat63955.jar //打印出org.apache.poi.hssf.usermodel.HSSFWorkbook类所在jar包路径
classloader = org.apache.poi.hssf.usermodel.HSSFWorkbook.class.getClassLoader();
res = classloader.getResource("org/apache/poi/hssf/usermodel/HSSFWorkbook.class");
path = res.getPath();
System.out.println("POIOOXML came from" + path);
//poi-3.7-jdk1.4-ooxml-20110508-rc263962.jar!

运行代码明显可以看出项目中加载的Wookbook类的jar是library-1.0I20080604_tomcat63955.jar,这是什么鬼,我去lib下查看,果然有这个jar包存在,mmp,终于找到了,删掉它,再次运行打印出Wookbook类的核心jar包,此次的正确 ,是我自己导入的poi的jar包。哈哈哈.....坚持,坚持,再坚持,总会成功的,耶耶耶。。。。。。。

总结:这里虽然使用的是支持jdk1.4的poi,但其实其他版本的poi的用法都相同,只不过导入的jar不同而已,开心把问题解决了。

交流群:527038646  嘻嘻嘻

jspsmart(保存文件)+poi(读取excel文件)操作excel文件的更多相关文章

  1. C# 使用自带Microsoft.Office.Interop.Excel简单操作Excel文件

    项目添加应用 Microsoft.Office.Interop.Excel.dll 文件 引用命名空间: using Excel = Microsoft.Office.Interop.Excel; 简 ...

  2. ruby中excel简单操作以及文件读取操作方法

    # -*-coding:utf-8 -*-#author:kanlijunrequire 'win32ole'require 'fileutils'class ResultAnalyse @@i=0 ...

  3. Python常用的数据文件存储的4种格式(txt/json/csv/excel)及操作Excel相关的第三方库(xlrd/xlwt/pandas/openpyxl)(2021最新版)

    序言:保存数据的方式各种各样,最简单的方式是直接保存为文本文件,如TXT.JSON.CSV等,除此之外Excel也是现在比较流行的存储格式,通过这篇文章你也将掌握通过一些第三方库(xlrd/xlwt/ ...

  4. node.js、js读取excel、操作excel、创建excel之js-xlsx.js

    node.js篇 第一步引入包 npm install xlsx -save 第二步使用 var xl =require('xlsx'); //workbook 对象,指的是整份 Excel 文档.我 ...

  5. ca75a_c++_标准IO库-利用流对象把文件内容读取到向量-操作文件

    /*ca75a_c++_标准IO库习题练习习题8.3,8.4,8.6习题8.9.8.10 ifstream inFile(fileName.c_str());1>d:\users\txwtech ...

  6. Apache poi简介及代码操作Excel

    一.简介 在我们进行企业的系统开发时,难免会遇到网页表格和Excel之间的操作问题(POI是个不错的选择) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序 ...

  7. [Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

  8. 利用poi开源jar包操作Excel时删除行内容与直接删除行的区别

    一般情况下,删除行时会面临两种情况:删除行内容但保留行位置.整行删除(删除后下方单元格上移).对应的删除方法分别是: void removeRow(Row row)//Remove a row fro ...

  9. org.apache.poi.ss.usermodel 类操作excel数据遗漏

    直接上图. 错误程序: 循环读取每一行的单元格数据部分 //for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) ...

随机推荐

  1. OpenCV探索之路(二十七):皮肤检测技术

    好久没写博客了,因为最近都忙着赶项目和打比赛==| 好吧,今天我打算写一篇关于使用opencv做皮肤检测的技术总结.那首先列一些现在主流的皮肤检测的方法都有哪些: RGB color space Yc ...

  2. 关于iOS GangSDK的使用,为App快速集成社群公会模块

    手上有一个自己开发的小游戏,想加一个家族系统活跃下游戏的氛围,想到这块儿可能会有大量的工作需要自己做,就偷了个懒去网上搜罗了一波,结果惊奇的发现居然真的有类似的服务,并且还是免费的,所以决定入坑尝试一 ...

  3. 使用Microsoft.AspNetCore.TestHost进行完整的功能测试

    简介 Microsoft.AspNetCore.TestHost是可以用于Asp.net Core 的功能测试工具.很多时候我们一个接口写好了,单元测试什么的也都ok了,需要完整调试一下,检查下单元测 ...

  4. flex布局元素操作详情

    之前布局一直用的是 position,float之类的,趁着国庆学习一下 flex 布局 父元素: flex-direction: row row-reverse column column-reve ...

  5. ZZCMS8.1|代码审计

    这周的审计任务 ZZCMS8.1是站长招商网内容管理系统.审计这个CMS的原因很多,这里就不详说了(其实是漏洞类型多点)                                         ...

  6. 阿里云VPS搭建Hexo博客

    最近买了一个阿里云服务器,准备写自己的网站,和将自己的作品放在上面:开始的时候,感觉就一个服务器应该很简单,但是从申请域名到备案,再到服务器搭建,没想到一波三折:闲话不多说,只是记录我在搭建时,最简单 ...

  7. Bootstrap 开关(switch)使用整理

    1.在JS里根据指定的 1或者0 或者其它值让按钮变成 on 或者 off (通常需要根据数据库查询的结果初始化开关的状态) (--开关插件包 bootstrap-switch.min.js) < ...

  8. 利用nginx实现负载均衡和动静分离

    1.Nginx介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器 . Nginx 是由 ...

  9. NOIP2012junior—P1—质因数分解

    NOIP2012junior-P1-质因数分解 时间: 1000ms / 空间: 131072KB [背景] NOIP2012[描述] 已知正整数n 是两个不同的质数的乘积,试求出较大的那个质数. [ ...

  10. 【luogu1220】关路灯

    https://www.luogu.org/problem/show?pid=1220 假如当前老张在a处跑去关掉b处的路灯,那么a与b之间的路灯都可以顺手关掉.因此每一时刻关掉的路灯必定是连续的. ...