导入Excel文件后进行批量修改数据

1、jar包
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.8-beta5</version>
</dependency>

2、html代码

<input type="file" id="file1" name="myfiles"  /> 
<input type="button" id="import" value="导入EXCEL" />
3、js代码
<script type="text/javascript" src="/resources/js/jquery-1.7.min.js"></script>
<script type="text/javascript" src="/resources/js/ajaxfileupload.js"></script>
<script type="text/javascript">
jQuery(function () {
		$("#import").click(function () {
	    	if ($("#file1").val().length > 0) {
	            ajaxFileUpload();
	        }
	        else {
	            alert("请选择需要导入的Excel文件!");
	        }
		 })
	})
	function ajaxFileUpload(){
			$("#import").attr("value","处理中...");
			$.ajaxFileUpload({
		       url: 'import', //用于文件上传的服务器端请求地址
		       secureuri: false, //是否需要安全协议,一般设置为false
		       fileElementId: 'file1', //文件上传域的ID
		       dataType: 'json', //返回值类型 一般设置为json
		       success: function (data, status)  //服务器成功响应处理函数
		       {	
		    	   $("#import").attr("disabled",false);
		    	   $("#import").attr("value","导入EXCEL");
		    	   if(data == 2){
					   alert("上传成功");
		    	   }else{
		    		   alert("上传失败");
		    	   }
		       },
		       error: function (data, status, e)//服务器响应失败处理函数
		       {
		    	   alert("服务器繁忙");
		       }
		    });
		}
</script>

4、后台代码

(1)、Controller层

import java.io.File;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.wenfeng.bean.User;
import com.wenfeng.service.PoiService;
import com.wenfeng.service.UserService;

@Controller
public class PoiController {
	
	@Autowired
	private UserService userservice;			//用户
	
	@Autowired
	private PoiService<Object> poiService;		//poi
	
	
	/**
	 * 导入
	 */
	@RequestMapping("resources/poi/import")
	public void importList(@RequestParam MultipartFile[] myfiles, HttpServletRequest request, HttpServletResponse response)
			throws Exception{
		response.setContentType("text/plain; charset=UTF-8");
		PrintWriter out = null;
		try {
			 out = response.getWriter();
			
			 //文件存放地址
			String realPath =request.getSession().getServletContext().getRealPath("/resources/uploadFile/");
			
			//上传文件的原名(即上传前的文件名字)
			String originalFilename = null;
			for(MultipartFile myfile : myfiles){
				 if(myfile.isEmpty()){
					 throw new Exception("请选择需要导入的Excel文件后上传");
              	}else{
                   originalFilename = myfile.getOriginalFilename();
                   System.out.println("文件原名: " + originalFilename);
                   System.out.println("文件名称: " + myfile.getName());
                   System.out.println("文件长度: " + myfile.getSize());
                   System.out.println("文件类型: " + myfile.getContentType());
                   System.out.println("========================================");
              	}
				try{
					//保存文件
					FileUtils.copyInputStreamToFile(myfile.getInputStream(), new File(realPath, originalFilename));
				}catch(Exception e){
					throw new Exception("文件上传失败,请重试!");
				}
				//解析excel文件到 List
				List<Object> list = poiService.getListFromExcel(myfile, User.class);
				
				if(list!=null&&list.size()>0){
					List<User> imporDatas=new ArrayList<User>();
					User data=null;
					for(Object o : list) {
						data=new User();
						if(o!=null){
							data=(User)o;
							imporDatas.add(data);
						}
					}
					//批量更新
					if(imporDatas.size() > 0) {
						for(User u:imporDatas){
							long id = Long.parseLong(u.getUserid()+"");
							
							User user = userservice.findById(id);
							if(null != user && !"".equals(user)){
								
								user.setPassword(u.getPassword());
								//根据用户id修改密码
								userservice.updateUser(user, id);
							}
						}
					}
				}
			 }
		} catch (Exception e) {
			out.write("1");
			e.printStackTrace();
		}
		out.write("2");
	}
}

(2)、dao层(用户service层就省略了)

        /**
	  * 根据用户id修改密码
	 */
	public void updateUser(User user, long id) throws Exception {
		
		Map<String,Object> updateParam = new HashMap<String,Object>();
		if(StringUtils.isNotEmpty(user.getPassword())){
			updateParam.put("pw", user.getPassword());
		}
		udao.updateUser(updateParam,id);
	}
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.wenfeng.bean.User;

public interface UserDao {
	/**
	 * 根据用户id查询信息
	 * @param id
	 * @return
	 * @throws Exception
	 */
	User findById(@Param("id")long id) throws Exception;
	/**
	 * 根据用户id修改密码
	 * @param updateParam
	 * @param id
	 * @return
	 */
	void updateUser(@Param("updateParam")Map<String, Object> updateParam, @Param("id")long id) throws Exception;
}

(3)、mapper层

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wenfeng.dao.UserDao">
	
	<sql id="Base_Column_List">
		user_id as userid,user_name as username,user_password as password,user_email as useremail 
	</sql>
	
	<!-- 根据用户id查询信息 -->
	<select id="findById" resultType="com.wenfeng.bean.User" parameterType="Integer">
		SELECT <include refid="Base_Column_List"/> FROM t_user
		<if test="null != id">
			<where>
			    AND user_id =${id}
			</where>
		</if>
	</select>
	
	<!-- 根据用户id修改密码 -->
	<select id="updateUser">
		UPDATE t_user SET 
		<if test="updateParam.pw != null and updateParam.pw != '' ">
			 user_password ='${updateParam.pw}'
		</if>
		<if test="null != id">
			WHERE user_id =${id}
		</if>
	</select>
</mapper>

(4)、service层(导出)

import java.util.List;
import org.springframework.web.multipart.MultipartFile;
import com.wenfeng.bean.User;
public interface PoiService<T> {
	/**
	 * 解析excel到 List
	 * @param excel 被解析的excel文件对象
	 * @param clazz 对象类型
	 * @return
	 * @throws Exception
	 */
	public List<Object> getListFromExcel(MultipartFile excel, Class<User> clazz) throws Exception;
}
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

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.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.wenfeng.bean.User;
import com.wenfeng.service.PoiService;

@Service
public class PoiServiceImpl implements PoiService<Object> {
	
	/**
	 * 导入
	 */
	public List<Object> getListFromExcel(MultipartFile excel, Class<User> clazz) throws Exception {
		if ( null == excel || 
				!(excel.getOriginalFilename().toLowerCase().endsWith(".xls") 
						|| excel.getOriginalFilename().toLowerCase().endsWith(".xlsx")) ) {
			return null;
		}
		InputStream is = excel.getInputStream();	//直接获取文件数据流
		HSSFWorkbook wb = new HSSFWorkbook(is);
		Object obj = null;
		String setMethodName = "";
		Method setMethod = null;
		Field field = null;
		List<Object> objs = new ArrayList<Object>();
		for (int i = 0; i < wb.getNumberOfSheets(); i ++) {
			HSSFSheet sheet = wb.getSheetAt(i);   //得到excel中的sheet
			if (null == sheet) {
				continue;
			}
			for (int j = 1; j <= sheet.getLastRowNum(); j ++) {
				HSSFRow row = sheet.getRow(j);		//得到一行数据
				if (null == row) {
					continue;
				}
				obj =  clazz.newInstance();
				for (int k = 0; k < clazz.getDeclaredFields().length; k++) {
					if (null == row.getCell(k)) {
						continue;
					}
					field = clazz.getDeclaredFields()[k];
//					if (field.getName().equalsIgnoreCase("id")) {
//						continue;
//					}
					setMethodName = "set"+field.getName().substring(0,1).toUpperCase()+field.getName().substring(1);	//setter方法
					//System.out.println(setMethodName);
					if (field.getType().getName().equalsIgnoreCase("java.lang.String")) {	//如果字段类型为字符串
						 
						setMethod = clazz.getMethod(setMethodName,String.class);	//到setter方法
						if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
							setMethod.invoke(obj, String.valueOf(row.getCell(k).getNumericCellValue()));	//得到单元格数据
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, row.getCell(k).getStringCellValue());
						}
					} else if (field.getType().getName().equalsIgnoreCase("java.lang.Integer")) {
						setMethod = clazz.getMethod(setMethodName,Integer.class);
						if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
							setMethod.invoke(obj, (int)row.getCell(k).getNumericCellValue());
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, Integer.valueOf(row.getCell(k).getStringCellValue()));
						}
						
					} else if (field.getType().getName().equalsIgnoreCase("int")) {
						setMethod = clazz.getMethod(setMethodName,int.class);
						if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
							setMethod.invoke(obj, (int)row.getCell(k).getNumericCellValue());
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, Integer.valueOf(row.getCell(k).getStringCellValue()));
							
						}
						
					} else if (field.getType().getName().equalsIgnoreCase("long")) {
						setMethod = clazz.getMethod(setMethodName,long.class);
						if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
							setMethod.invoke(obj, (long)row.getCell(k).getNumericCellValue());
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, Long.valueOf(row.getCell(k).getStringCellValue()));
						}
						
					} else if (field.getType().getName().equalsIgnoreCase("float")) {
						
						setMethod = clazz.getMethod(setMethodName,float.class);
						if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
							setMethod.invoke(obj, (float)row.getCell(k).getNumericCellValue());
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, Float.valueOf(row.getCell(k).getStringCellValue()));
						}
						
					} else if (field.getType().getName().equalsIgnoreCase("double")) {
						setMethod = clazz.getMethod(setMethodName,double.class);
						if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
							setMethod.invoke(obj, row.getCell(k).getNumericCellValue());
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, Double.valueOf(row.getCell(k).getStringCellValue()));
						}
						
					} else if (field.getType().getName().equalsIgnoreCase("boolean")) {
						setMethod = clazz.getMethod(setMethodName,boolean.class);
						if (row.getCell(k).getCellType() == 4) {
							setMethod.invoke(obj, row.getCell(k).getBooleanCellValue());
						} else if (row.getCell(k).getCellType() == HSSFCell.CELL_TYPE_STRING) {
							setMethod.invoke(obj, Boolean.valueOf(row.getCell(k).getStringCellValue()));
						}
						
					} else if (field.getType().getName().equalsIgnoreCase("java.util.Date")) {
						setMethod = clazz.getMethod(setMethodName,java.util.Date.class);
						setMethod.invoke(obj, row.getCell(k).getDateCellValue());
					}
				}
				objs.add(obj);
			}
		}
		if(objs.size() > 0) {
			return objs;
		} else {
			return null;
		}
	}

}
使用说明 : 1、本程序可以作什么? 本程序功能分为两个部分: 一部分是:批量查找指定路径下的文件中的内容中,是否包含要查询的项目。并把查询出的内容分文件存储。 一部分是:将文本文件导入EXCEL中,可以将上一步查找的结果导入,也可以自己选择文件导入(支持多选)。 2、如何使用他? a、批量查找: 首先,在“读入位置”按钮处设置你所要读取的文件的存放位置,此时程序会自动读入此文件夹下所有文件,以供选择;其次,用“>>”或“>”将要读取的文件选入读取队列,当然如果选错了可以用“<<”或“<”删除队列,或者鼠标双击选中项删除;再次,点击“+”按钮,添加查找项目到查找项目列表,一次只可以添加一条,如需添加多条则需要重复添加操作;如果添加错误可以双击选中项删除或选中后点击“-”按钮。最后,点击“开始查找”,程序将会把查找结果输出保存到指定路径下面的output文件夹下面,你可以选择是否打开目录查看。如果需要查询的文件文件头,可以选择“保留文件首行”。 b、EXCEL导入: 首先,选择导入方式,导入方式分为“查询结果导入”和“新选文件导入”两种;当选择“查询结果导入”时,本程序将把“读入位置”处“output”文件夹下文件批量导入EXCEL。当选择“新选文件导入”时,本程序在点击“开始导入”时将弹出窗口,您可以自己选择需要导入文件(支持多选),导入EXCEL。其次,设置导入文件时的分割符,默认为“|”,本程序只支持按照分隔符导入。最后,点击“开始导入”按钮开始导入。 3、本程序不判断所查找的文件类型 由于本程序在读入文件时,并没有校验文件的内容和文件类型,因此本程序会读取用户所选择的任意文件,即使此文件是二进制格式的。不论是查询或者是导入功能都是这样。本程序将按行读取所选择的文件(或者有换行符的),在读取完文件后,无论是否找到,都会创建和源文件相同类型的文件,即使是.exe或.rar(一般是打不开的),文件名存储为“output”+原文件名。即使没有找到任何相匹配的内容,本程序也会创建文件,这时后文件大小是0字节,可以按照大小排列看到。 4、请使用“清除文件”按钮及时清除查询结果 程序在查询和创建文件的过程中,不会判断是否已经执行过查询操作。如果已经执行过查询操作,“output”文件夹下就会存在查询出的文件,当再次执行查询时,本程序会在已存在的文件后追加查询结果。这样就会出现重复的记录或内容。因此,当需要多次查询时,每次查询前需要点击“清空文件”按钮删除output文件夹,才能保证查找的准确。 5、本程序不会判断运行的环境,因此在运行过程中可能会有些未知的错误 本程序在win7环境,vs2012,Netframe4.0下编译通过。本程序支持winxp及以上操作系统。执行EXCEL导入的时候,需要安装Office。Office的版本在2003以上就可以。但是不同我Office版本对导入性能,有一定的影响。Excel2003,最多256列,即2的8次方,最多65536行,即2放入16次方; Excel2007及以上版本,最多16384列,即2的14次方,最多1048576行,即2的20次方。因此如果需要导入的单个文件的行数或者列数,超过了所安装Office版本的最多行列数,程序将会报错!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值