poi&&jxl用于excel文件解析生成实例
2017-10-24 09:57
766 查看
在实际的项目过程中获取数据的路径很多 可以通过用户输入 扫描器等等方式 今天要总结的是通过上传excel文件 然后解析文件来进行数据录入
或者生成模板以及将数据以excel文件的方式导出。
我们要使用到第三方jar 我这里以前上传了poi的jar包(http://download.csdn.net/download/docuxu/9896366)今天网站资源出问题了 不能上传资源所以jxl的jar包我会后续上传。
项目实例以Struts2上传文件解析为例(使用jxl jar简单) 关于模板生成下载的问题大家可以评论下问
准备除了struts2基础jar包外 还需要commons-fileupload-1.2.1.jar 后面上传jar给链接
web.xml文件配置
上传文件jsp
回显文件jsp
struts.xml
User类
excel内容
console 打印效果
User [id=1001, money=50000000, name=docuxu, phone=12345678901]
由打印结果可知 我们将上传的excel用户信息传递给了User对象 之后对数据的使用就由各位随意了
下面列出两者的区别
jxl与POI的区别
一、jxl
优点:
Jxl对中文支持非常好,操作简单,方法看名知意。
Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
支持Excel 95-2000的所有版本(网上说目前可以支持Excel2007了,还没有尝试过)
生成Excel 2000标准格式
支持字体、数字、日期操作
能够修饰单元格属性
支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
缺点:效率低,图片支持不完善,对格式的支持不如POI强大
二、POI
优点:
效率高(数据来源:http://blog.csdn.net/jarvis_java/article/details/4924099)
支持公式,宏,一些企业应用上会非常实用
能够修饰单元格属性
支持字体、数字、日期操作
缺点:不成熟,代码不能跨平台,貌似不少同行在使用工程中还碰到让人郁闷的BUG(最近的项目中也是遇到了一些bug,不过目前没有查出来是代码的问题还是POI的问题,总之问题很诡异,数据替代参数总有失败的。关于不能跨平台这一说,我也没有试验过,不过Java不是跨平台吗?POI是JAVA的一个组件,怎么就不能跨平台了呢,总之这些问题还需要在以后的项目中多多实践,才能比较出区别之处。)
或者生成模板以及将数据以excel文件的方式导出。
我们要使用到第三方jar 我这里以前上传了poi的jar包(http://download.csdn.net/download/docuxu/9896366)今天网站资源出问题了 不能上传资源所以jxl的jar包我会后续上传。
项目实例以Struts2上传文件解析为例(使用jxl jar简单) 关于模板生成下载的问题大家可以评论下问
准备除了struts2基础jar包外 还需要commons-fileupload-1.2.1.jar 后面上传jar给链接
web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
上传文件jsp
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title>Insert title here</title> </head> <body> <h1>上传文件</h1> <form action="upload" method="post" enctype="multipart/form-data"> <input type="file" name="some"> <input type="submit" value="提交"> </form> </body> </html>
回显文件jsp
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf8"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title>Insert title here</title> </head> <body> <h1>上传成功</h1> </body> </html>BaseAction
import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.interceptor.SessionAware; import org.apache.struts2.util.ServletContextAware; public class BaseAction implements SessionAware, ServletContextAware, ServletRequestAware, ServletResponseAware { protected Map<String,Object> session; protected HttpServletRequest request; protected HttpServletResponse response; protected ServletContext context; public void setSession(Map<String, Object> arg0) { // TODO Auto-generated method stub this.session=arg0; } public void setServletContext(ServletContext arg0) { // TODO Auto-generated method stub this.context=arg0; } public void setServletRequest(HttpServletRequest arg0) { // TODO Auto-generated method stub this.request=arg0; } public void setServletResponse(HttpServletResponse arg0) { // TODO Auto-generated method stub this.response=arg0; } public String toRealPath(String path){ return context.getRealPath(path); } }UploadExcelAction
import java.io.FileInputStream; import java.io.InputStream; import jxl.Sheet; import jxl.Workbook; public class UploadExcelAction extends BaseAction{ private String some;//someImage private String someFileName;//**FileName private String someContentType;//**ContentType public String getSomeFileName() { return someFileName; } public void setSomeFileName(String someFileName) { this.someFileName = someFileName; } public String getSomeContentType() { return someContentType; } public void setSomeContentType(String someContentType) { this.someContentType = someContentType; } //拦截器在调用fileUpload在Struts2调用UploadAction的execute方法 //之前进行了拦截 将上传过的文件放入缓存区 然后从缓存区里 //读取文件位置 文件长度 文件名等扥数据 在execute()方法执行之后又进行拦截 将缓存区里的数据清空 public String execute() throws Exception{ System.out.println(someFileName); InputStream is = null; String msg = ""; Workbook rwb = null; is=new FileInputStream(some); rwb=Workbook.getWorkbook(is); Sheet sheet = rwb.getSheet(0); int rows = sheet.getRows();// 行数 int columns = sheet.getColumns();// 列数 boolean isModel = false; //! 确认添加标识 //! 校验Excel模板 if (!checkExcel(rwb)) { //throw new Exception("excel模板不正确"); isModel=true; System.out.println(isModel); }else{ if(rows>1){// 文件中的记录大于1 for(int i=1;i<rows;i++){ String id=sheet.getCell(0, i).getContents().trim(); String name = sheet.getCell(1, i).getContents().trim(); String phone = sheet.getCell(2, i).getContents().trim(); String money = sheet.getCell(3, i).getContents().trim(); try { User user=new User(); user.setId(id); user.setName(name); user.setPhone(phone); user.setMoney(money); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } } } } if (rwb != null) { rwb.close(); } return "success"; } public String getSome() { return some; } public void setSome(String some) { this.some = some; } private boolean checkExcel(Workbook rwb) { Sheet sheet = rwb.getSheet(0); int rows = sheet.getRows();// 行数 int columns = sheet.getColumns();// 列数 String[] heads = new String[] {"用户编号","用户姓名","手机号码","注册资金"}; if (rows > 1 && columns == heads.length) { for (int i = 0; i < columns; i++) { String contents = sheet.getCell(i, 0).getContents(); if (contents == null || !contents.equals(heads[i])) { return false; } } return true; } else { return false; } } }注意:因为用于测试解析效果所以很多异常没有处理
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <package name="upload" namespace="/" extends="struts-default"> <!-- 返回上传界面 --> <action name="uploadform"> <interceptor-ref name="basicStack"></interceptor-ref> <result name="success">/WEB-INF/uploadform.jsp</result> </action> <!-- 发送上传请求 --> <action name="upload" class="com.xms.action.UploadExcelAction"> <interceptor-ref name="fileUpload"></interceptor-ref> <interceptor-ref name="basicStack"></interceptor-ref> <result name="success">/WEB-INF/uploadImage.jsp</result> </action> </package> </struts>
User类
import java.io.Serializable; public class User implements Serializable{ private String id; private String name; private String phone; private String money; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getMoney() { return money; } public void setMoney(String money) { this.money = money; } @Override public String toString() { return "User [id=" + id + ", money=" + money + ", name=" + name + ", phone=" + phone + "]"; } }
excel内容
console 打印效果
User [id=1001, money=50000000, name=docuxu, phone=12345678901]
由打印结果可知 我们将上传的excel用户信息传递给了User对象 之后对数据的使用就由各位随意了
下面列出两者的区别
jxl与POI的区别
一、jxl
优点:
Jxl对中文支持非常好,操作简单,方法看名知意。
Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
支持Excel 95-2000的所有版本(网上说目前可以支持Excel2007了,还没有尝试过)
生成Excel 2000标准格式
支持字体、数字、日期操作
能够修饰单元格属性
支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
缺点:效率低,图片支持不完善,对格式的支持不如POI强大
二、POI
优点:
效率高(数据来源:http://blog.csdn.net/jarvis_java/article/details/4924099)
支持公式,宏,一些企业应用上会非常实用
能够修饰单元格属性
支持字体、数字、日期操作
缺点:不成熟,代码不能跨平台,貌似不少同行在使用工程中还碰到让人郁闷的BUG(最近的项目中也是遇到了一些bug,不过目前没有查出来是代码的问题还是POI的问题,总之问题很诡异,数据替代参数总有失败的。关于不能跨平台这一说,我也没有试验过,不过Java不是跨平台吗?POI是JAVA的一个组件,怎么就不能跨平台了呢,总之这些问题还需要在以后的项目中多多实践,才能比较出区别之处。)
相关文章推荐
- Java基础系列19:使用JXL或者POI生成和解析Excel文件
- Excel解析与数据生成(撑持JXL,POI)
- Java生成excel导出文件(使用poi+JXL)
- poi 生成excel文件.xls或者.xls实例,包括日期写入处理
- Excel解析与数据生成(撑持JXL,POI)
- 实现poi方式生成excel文件和web类根据路径生成java实例的反射技术的springmvc方法的方法
- 使用ITEXT生成pdf文件,使用POI、jxl对excel文件进行读取
- Android解析及生成Excel文件(JXL)(xls格式)
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解
- JXL包大解析;Java程序生成excel文件和解析excel文件内容
- 使用POI和dom4j来解析Excel生成Xml
- Java用POI解析excel并获取所有单元格数据的实例
- poi jxl 生成EXCEL 报表
- PHP-ExcelReader:用于解析excel文件的PHP类库
- (二) POI 解析Excel 之 生成Excel文档
- poi如何解析xlsx,xls的Excel文件
- 使用Aspose.Cells组件生成Excel文件实例
- JXL 生成EXCEL文件格式说明