java struts2 excel上传_文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术...

文件上传方法,使用Struts2,实现Excel文件读取并写入数据库技术

如题:文件信息的批量导入……

项目中经常会遇到客户的一些单表信息的数据批量导入,也就是提供定制Excel表,再把Excel表中的数据提取到数据库的操作,其实实现起来很简单。以下是小菜鸟我的实现思路:

1、JSP页面+Struts2实现文件上传,把定制Excel上传到服务器指定目录下,以供读取;

2、POI读取Excel表格,把数据封装为持久化实体List

3、批量导入数据库

这是TT的开发环境:

Struts2.1.6 + Spring2.5.6 + Hibernate3.3.1 + MyEclipse8.5 + tomcat5.5 + Oracle11g

需要的Jar包:SSH的就不需要说了

主要就是一个POI的包:

我这里是 poi-3.7-beta-20100620.jar,这一个jar包可以去apach的官网上下载

还有一个就是struts的IO包:

commons-io-1.3.2.jar,顾名思义:IO工具类

第一步:文件上传

这一步,网上有很多的例子:

JSP页面:

文件上传

Struts.xml配置文件:这里可以定制Filter,指定文件类型和最大长度,就不列举了

/page/role/roleallinput.jsp

/page/role/roleallinput.jsp

对应的applicationContext.xml配置

scope=”prototype”>

class=”com.adtec.datacenter.dao.manager.FileLoadDaoImpl”>

RoleFileUploadAction实现

这里有几个点需要注意:

上传文件的文件如果为uploadFile,那么文件名一定要为uploadFileFileName,也就是在文件后加入FileName,不然不能识别

package com.adtec.datacenter.action.manager;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.struts2.ServletActionContext;

import com.adtec.datacenter.dao.manager.FileLoadDao;

import com.adtec.datacenter.dao.manager.RoleDao;

import com.adtec.datacenter.entity.manager.PtRoleInfo;

import com.adtec.datacenter.vo.manager.RoleInfo;

import com.opensymphony.xwork2.ActionSupport;

public class RoleFileUploadAction extends ActionSupport{

private File uploadFile;

private String uploadFileFileName;

private FileLoadDao fileLoadDao;

private RoleDao roleDao;

public File getUploadFile() {

return uploadFile;

}

public void setUploadFile(File uploadFile) {

this.uploadFile = uploadFile;

}

public String getUploadFileFileName() {

return uploadFileFileName;

}

public void setUploadFileFileName(String uploadFileFileName) {

this.uploadFileFileName = uploadFileFileName;

}

public FileLoadDao getFileLoadDao() {

return fileLoadDao;

}

public void setFileLoadDao(FileLoadDao fileLoadDao) {

this.fileLoadDao = fileLoadDao;

}

public RoleDao getRoleDao() {

return roleDao;

}

public void setRoleDao(RoleDao roleDao) {

this.roleDao = roleDao;

}

@Override

public void validate() {

super.validate();

}

public String loadRoleFile(){

String directory = “/upload/role”;

String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);

//生成上传的文件对象

File target = new File(targetDirectory,uploadFileFileName);

//如果文件已经存在,则删除原有文件

if(target.exists()){

target.delete();

}

//复制file对象,实现上传

try {

FileUtils.copyFile(uploadFile, target);

//out = response.getWriter();

//out.print(“文件上传成功!”);

} catch (IOException e) {

e.printStackTrace();

}

loadRoleInfo(uploadFileFileName);

return SUCCESS;

}

/**

* 把Excele表读出的数据,组装成一个List,统一导入数据库

* @param uploadFileFileName

*/

public void loadRoleInfo(String uploadFileFileName){

String directory = “/upload/role”;

String targetDirectory = ServletActionContext.getServletContext().getRealPath(directory);

File target = new File(targetDirectory,uploadFileFileName);

List roleList = new ArrayList();

try{

FileInputStream fi = new FileInputStream(target);

Workbook wb = new HSSFWorkbook(fi);

Sheet sheet = wb.getSheetAt(0);

int rowNum = sheet.getLastRowNum()+1;

for(int i=1;i

PtRoleInfo ptRoleInfo = new PtRoleInfo();

Row row = sheet.getRow(i);

int cellNum = row.getLastCellNum();

for(int j=0;j

Cell cell = row.getCell(j);

String cellValue = null;

switch(cell.getCellType()){ //判断excel单元格内容的格式,并对其进行转换,以便插入数据库

case 0 : cellValue = String.valueOf((int)cell.getNumericCellValue()); break;

case 1 : cellValue = cell.getStringCellValue(); break;

case 2 : cellValue = String.valueOf(cell.getDateCellValue()); break;

case 3 : cellValue = “”; break;

case 4 : cellValue = String.valueOf(cell.getBooleanCellValue()); break;

case 5 : cellValue = String.valueOf(cell.getErrorCellValue()); break;

}

switch(j){//通过列数来判断对应插如的字段

case 0 : ptRoleInfo.setRoleId(cellValue);break;

case 1 : ptRoleInfo.setRoleName(cellValue);break;

case 2 : ptRoleInfo.setDeil(cellValue);break;

}

}

roleList.add(ptRoleInfo);

}

fileLoadDao.roleInfotoDB(roleList);

}catch(IOException e){

e.printStackTrace();

}

}

}

roleDao接口实现

这里接口类就不贴出来了,直接贴实现类,把持久化实体List循环写入数据库

package com.adtec.datacenter.dao.manager;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Iterator;

import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.Cell;

import org.apache.poi.ss.usermodel.Row;

import org.apache.poi.ss.usermodel.Sheet;

import org.apache.poi.ss.usermodel.Workbook;

import org.apache.struts2.ServletActionContext;

import org.hibernate.HibernateException;

import org.hibernate.Session;

import org.hibernate.Transaction;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.adtec.datacenter.entity.manager.PtRoleInfo;

import com.adtec.datacenter.vo.manager.RoleInfo;

/**

* 文件工具类

* @author Tony

*

*/

public class FileLoadDaoImpl extends HibernateDaoSupport implements FileLoadDao {

/**

* 把从excel表读出的数据写入到数据库

*/

public void roleInfotoDB(List roleList){

Session session = this.getHibernateTemplate().getSessionFactory().openSession();

Transaction tx = null;

try{

tx = session.beginTransaction();

if(roleList.size() > 0){

int roleNum = roleList.size();

for(int i=0;i

session.save(roleList.get(i));

}

/*for(Iterator iterator = roleList.iterator();iterator.hasNext();){

session.save(iterator.next());

}*/

}

tx.commit();

}catch(HibernateException e){

e.printStackTrace();

tx.rollback();

}finally{

session.close();

}

//this.getHibernateTemplate().saveOrUpdateAll(roleList);

return;

}

}

http://www.kaizea.com/?post=276

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter创建高级测试计划

如果应用程序使用重写地址而不是使用cookie存储信息,需要做一些额外的工作去测试程序 为了正确的响应重写地址,jmeter 需要解析 从服务器获取html 并且检索会话ID, 1 合理利用pre-processors-http url rewriting modifier 来完成,简单的输入s…

从这开始

今天正式加入博客园! 今后跟大家分享有关IoT软件方面的知识,包括WIFI 、蓝牙、Zigbee、 Sub-1G 、NB-IoT、GPRS/GPS和单片机等。 有疑问欢迎留言联系!转载于:https://www.cnblogs.com/crepse/p/9502342.html

单元测试技巧:创建描述性测试

您的单元测试应尽可能具有描述性。 他们给您的反馈应该非常清楚,您甚至不需要启动调试器并一步一步地检查代码来检查局部变量。 为什么? 因为那需要时间,而且我们很懒,对吗? 为此,您需要创建描述性测试。 有…

Div前台显示自动换行和不自动换行的问题

1、无法自动换行* 问题:如果 div 输入的是英文字母且没有空格,会导致英文字母不换行直接在同一行输出,导致 div 的宽度远远超出设定的大小。* 原因:因为在 div 中,英文字母之间没有空格的话,默认为一个英文…

java 自定义taglib_java – 非常简单的自定义taglib函数无法正常工作

我正在敲打为什么我的自定义taglib功能不起作用.该示例使用Math.cos和Math.sin.这是班级:package foo.tags;public class Math {public java.lang.Double cos(java.lang.Double value) {return java.lang.Math.cos(value);}public java.lang.Double sin(java.lang.D…

python基础知识(二)if语句

if语句是条件判断语句 格式为: if 条件:执行语句 elif 再一个条件:执行语句 else:执行语句注意: if 与elif后不要忘记冒号 例子: #Autor:Decade value156 value2int(input(number:)) #提示用户输入一个整数型的数字 if value1>value2: …

vue.js--基础事件定义,获取数据,执行方法传值

<template><div id"app"> <h1>{{ msg }}</h1> <br> <button v-on:click"run1()"> 第一种写法</button> <br> <button clickrun2()> 第二种写法</button> <br> <button clickgetMsg(…

Spring集成–强大的拆分器聚合器

坚固是什么意思&#xff1f; 在本文的上下文中&#xff0c;健壮性是指在不立即返回到调用者的情况下管理流中的异常条件的能力。 在某些处理方案中&#xff0c; n个 m个回答足以做出结论。 通常具有这些趋势的示例处理场景是&#xff1a; 财务&#xff0c;保险和预订系统的…

CSS字体设置的一些技巧(行高,加粗,强制换行等)

文本是网页中最重要的一种内容形式&#xff0c;文本几乎可以写在任何地方&#xff0c;块级元素中可以写行内元素中也可以写。文本都是由一个个字符组成的&#xff0c;在css布局中&#xff0c;每一个字符都有一个em框&#xff0c;通常font-size设置的大小就是设置的em框的大小&a…

java memcache 队列_基于memcache的java分布式队列实现。

主要有两个类&#xff0c;一个队列类和一个job的抽象类。保证队列类中的key的唯一性&#xff0c;就可以用spring配置多个实例。水平有限&#xff0c;欢迎吐槽。上代码&#xff1a;1、队列类import net.spy.memcached.MemcachedClient;import net.spy.memcached.internal.Operat…

【题解】 [ZJOI2009]假期的宿舍 (二分图匹配)

懒得复制题面&#xff0c;戳我 Solution: 处理出床位、要留校的人&#xff08;注意来访问的人一定住校&#xff09;&#xff0c;和人与人的关系&#xff08;连边&#xff09;再接着就是二分图。注意的就是连向的人必须是有床位的还要注意的就是只用判断住校的同学二分图板子都打…

android-线程池-最顺手的写法

引子 关于线程池&#xff0c;在这里写出几种最顺手的写法&#xff0c;至于原理以及各种细节。放后面再填&#xff1b; 经过查证&#xff0c;凡是 以前new Thread&#xff08;&#xff09;的地方&#xff0c;貌似都可以用线程池来执行&#xff0c;优化内存消耗。 代码 系统提供的…

使用Java和Google GSON解析ESPN API

在我的第一篇文章中&#xff0c;我将解释如何解析ESPN API。 可以在http://developer.espn.com/docs上找到API文档。 首先&#xff0c;您需要请求一个API密钥&#xff0c;然后可以开始查询REST API以检索JSON响应。 在下面的示例中&#xff0c;我将简单地查询在英格兰英超联赛…

java string对象创建对象_Java String 创建了几个对象

我们首先来看一段代码&#xff1a;Java代码String strnew String("abc");紧接着这段代码之后的往往是这个问题&#xff0c;那就是这行代码究竟创建了几个String对象呢&#xff1f;相信大家对这道题并不陌生&#xff0c;答案也是众所周知的&#xff0c;2个。接下来我们…

js 图片不保存的回显功能/图片尺寸验证/图片大小验证 /图片类型验证

大部分转自&#xff1a;http://blog.csdn.net/qq_39200924/article/details/79198766 在项目中经常用到input标签来上传文件&#xff0c;而这些文件通常是图片文件。图片有很多格式我们只需要其中的几种&#xff0c;就需要对用户上传的文件进行验证&#xff0c;在HTML5中有一个…

sqlx使用说明

sqlx使用指南 参考链接: http://jmoiron.github.io/sqlx/ sqlx是一个go语言包&#xff0c;在内置database/sql包之上增加了很多扩展&#xff0c;简化数据库操作代码的书写 资源 如果对go语言的sql用法不熟悉&#xff0c;可以到下面网站学习:http://go-database-sql.org/ 如果对…

填充一个池需要多少个线程?

近几个月来&#xff0c;我们一直看到一小部分但持续的操作失败&#xff0c;并带有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接&#xff1b; 嵌套异常是java.sql.SQLException&#xff1a;客户端尝试检出Connection的尝试…

@font-face 用字体画图标

HTML 1 <body>2 <!-- ul.layout>li*5>a[href#]>i.icon -->3 <!-- Sublime Text 快捷拼写 -->4 <ul class"layout">5 <li><a href"#"><i class"icon">&#xe601;</…

java mapfile_基于文件的数据结构:关于MapFile

MapFile是已经排过序的SequenceFile&#xff0c;它有索引&#xff0c;所以可以按键查找1.MapFile的写操作MapFile的写操作类似于SequenceFile的写操作。新建一个MapFile.Writer实例&#xff0c;然后调用append()方法顺序写入文件内容。如果不按顺序写入&#xff0c;就抛出一个I…

linux scp 命令

scp 命令 scp 命令 意思是 secure copy 即安全拷贝&#xff0c;可以把它看做是 cp 命令的高级版&#xff0c;可以跨主机拷贝。 经常用来在局域网内不同主机之间分享文件&#xff0c;或者在本机与远程主机中分享文件。 在使用的时候就像使用cp 命令一样&#xff0c;第一个参数是…