excel文件解析生成实例

在实际的项目过程中获取数据的路径很多 可以通过用户输入 扫描器等等方式  今天要总结的是通过上传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

优点:

  1. Jxl对中文支持非常好,操作简单,方法看名知意。
  2. Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
  3. 支持Excel 95-2000的所有版本(网上说目前可以支持Excel2007了,还没有尝试过)
  4. 生成Excel 2000标准格式
  5. 支持字体、数字、日期操作
  6. 能够修饰单元格属性
  7. 支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。

缺点:效率低,图片支持不完善,对格式的支持不如POI强大

二、POI

优点:

  1. 效率高(数据来源:http://blog.csdn.net/jarvis_java/article/details/4924099
  2. 支持公式,宏,一些企业应用上会非常实用
  3. 能够修饰单元格属性
  4. 支持字体、数字、日期操作

缺点:不成熟,代码不能跨平台,貌似不少同行在使用工程中还碰到让人郁闷的BUG(最近的项目中也是遇到了一些bug,不过目前没有查出来是代码的问题还是POI的问题,总之问题很诡异,数据替代参数总有失败的。关于不能跨平台这一说,我也没有试验过,不过Java不是跨平台吗?POI是JAVA的一个组件,怎么就不能跨平台了呢,总之这些问题还需要在以后的项目中多多实践,才能比较出区别之处。)

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页