您的位置:首页 > 编程语言 > Java开发

struts导入Excel进行解析

2016-05-22 00:00 561 查看
struts导入Excel进行POI解析,源码地址:http://download.csdn.net/detail/bq1073100909/7887635

非常感谢http://blog.csdn.net/cherishme1988/article/details/8068339,我是在他的博客上学习的,成功实现。

新建一个web项目test,添加struts框架,我使用的工具是myeclipse。

添加如下jar包:poi-3.0-rc4-20070503.jar;poi-contrib-3.0-rc4-20070503.jar;poi-ooxml-schemas-3.7-beta3.jar;poi-scratchpad-3.0-rc4-20070503.jar

在源码中已经添加,在WebRoot下WEB-INF下的lib中。

Excel表中的数据格式如下图:



新建Person类:不过多解释直接代码上:

package bean;

public class Person {
private Integer id;
private String name;
private int age;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String toString(){
return this.id+"   "+this.name+"    "+this.age;
}
}


修改index.jsp,使之可以上传Excel文件:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>excel导入测试</title>

</head>

<body>
<s:form theme="simple"  action="uploadaction!upload" enctype="multipart/form-data" method="post">
选择文件:  <s:file name="ufile"  accept="excel/*" id="ufilename" /> <br>
<s:submit value="提交"></s:submit>
</s:form>
</body>
</html>


struts.xml的配置文件,简单易懂,不多解释:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="exceltest" namespace="/" extends="struts-default">
<action name="uploadaction" class="org.action.ExcelAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>


下面进入正题,action中的Excel导入,首先进行文件的上传,在WebRoot下面建文件夹upload,将上传的文件保存在这里。

package org.action;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import org.myutil.ExcelUtil;

import bean.Person;

import com.opensymphony.xwork2.ActionSupport;

public class ExcelAction extends ActionSupport {

private String ufileFileName;
private File ufile;

public String upload(){
String directory = "/upload";//定义文件路径
String targetFileName = ufileFileName;
String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);
//生成上传对象
File target	= new File(targetDirectory,targetFileName);
//如果出存在就覆盖
if(target.exists()){
target.delete();
System.out.println("文件已经存在,将要覆盖");
}

try {
FileUtils.copyFile(ufile, target);
} catch (IOException e) {
e.printStackTrace();
}
List<Person> list = ExcelUtil.importExcel(ufileFileName);
int size = 0;
System.out.println(size = list.size());
for(int i=0;i<size;i++){
System.out.println(list.get(i).toString());
}
return "success";
}

public String getUfileFileName() {
return ufileFileName;
}

public void setUfileFileName(String ufileFileName) {
this.ufileFileName = ufileFileName;
}

public File getUfile() {
return ufile;
}

public void setUfile(File ufile) {
this.ufile = ufile;
}

}


ExcelUtil.importExcel(ufileFileName);就是对Excel进行解析,传入文件的名字,我单独写了一个类定义一个静态方法对Excel进行操作。

ExcelUtil.java代码:

package org.myutil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;

import bean.Person;

public class ExcelUtil {
public static List<Person> importExcel(String ufileFileName){
String directory = "/upload";
String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);
File target = new File(targetDirectory,ufileFileName);
//读取上传的文件
List<Person> list = new ArrayList<Person>();
//读取上传的文件
try {
FileInputStream fis = new FileInputStream(target);
//初始化一个工作簿
HSSFWorkbook wb = new HSSFWorkbook(fis);
//第一张表单
HSSFSheet sheet = wb.getSheetAt(0);
int rowNum = sheet.getLastRowNum()+1;  //row行初始行数位0;
System.out.println("sheet表行数为:"+rowNum);   //打印总行数

//上传的Excel表带有表头,所以从第二行开始,索引为1 ;
for(int i=1;i<rowNum;i++){
Person person = new Person();   //new一个project实例
HSSFRow row = sheet.getRow(i);
int cellNum = row.getLastCellNum();
for(short j=0;j<cellNum;j++){   //
HSSFCell cell = row.getCell(j);
String cellValue = null ;
//类型转换;
if(cell.getCellType() == HSSFCell.CELL_TYPE_STRING){
cellValue = cell.getStringCellValue();
}else if(HSSFCell.CELL_TYPE_NUMERIC ==cell.getCellType() ) {     //对数字的处理
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date d = cell.getDateCellValue();    //对日期处理
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd hh:mm");
cellValue = formater.format(d);
} else {// 其余按照数字处理
cellValue = String.valueOf((int)cell.getNumericCellValue()) ;
}
}

switch(j){
case 0:person.setId(Integer.parseInt(cellValue.trim()));
break;
case 1:person.setName(cellValue.trim());
break;
case 2:person.setAge(Integer.parseInt(cellValue.trim()));
break;
}

}
list.add(person);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return list;
}
}


这样就可以把Excel中的数据封装到Person类实例化的实体中并保存到list进行返回,如果进行ssh开发,建议把id去掉,因为保存数据是不需要id,这个是自动增长,在switch中从1开始就可以了,然后进行save(entity)存储到数据库。我做的这个例子主要是学习解析的原理。如果有其他的字段请自己添加。(其中对数据类型进行转换的时候要注意哦)

运行如下:



结果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: