您的位置:首页 > 其它

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文件配置

<?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的一个组件,怎么就不能跨平台了呢,总之这些问题还需要在以后的项目中多多实践,才能比较出区别之处。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poi jxl excel解析