WEB下的excel批量导入功能
新手学习中,记录一下excel导出功能实现的整个流程。使用框架ssm。
control层 importExcel+parseDataItem:
- @RequestMapping("importExcel.do")
 - public String importExcel(@RequestParam MultipartFile uploadfile,
 - HttpServletRequest request, HttpServletResponse response) {
 - String fileName = uploadfile.getOriginalFilename();
 - if (StringUtils.isEmpty(fileName)) {
 - System.out.println("未上传文件名为空");
 - }
 - String tempPath = request.getSession().getServletContext().getRealPath("/")
 - + "upload";
 - File dir = new File(tempPath);
 - if (!tempPath.endsWith(File.separator)) {
 - tempPath = tempPath + File.separator;
 - }
 - if (!dir.exists()) {
 - dir.mkdirs();
 - }
 - System.out.println(tempPath);
 - //制作路径
 - String newFile = tempPath + fileName;
 - File file = new File(newFile);
 - try {
 - FileCopyUtils.copy(uploadfile.getBytes(), file);
 - //导入excel中的内容
 - this.<span style="color:#ff0000;">parseDataItem</span>(newFile);
 - System.out.println("成功导入");
 - } catch (IOException e) {
 - e.printStackTrace();
 - } finally {
 - try {
 - FileUtils.forceDelete(file);
 - } catch (IOException e) {
 - e.printStackTrace();
 - return "uploadfail";
 - }
 - }
 - return "uploadsuccess";
 - }
 - public final boolean <span style="color:#ff0000;">parseDataItem</span>(String file){
 - return ysdwAnimalService.<span style="color:#ff0000;">importExcel</span>(file);
 - }
 
ysdwAnimalService层 import 调用底层通用方法readExcel:
- @Transactional
 - public boolean importExcel(String file) {
 - final int rowStart = 2;
 - final int cellStrart = 0;
 - List<YsdwAnimal> list = new LinkedList<YsdwAnimal>();
 - YsdwAnimal ysdwAnimal = null;
 - try {
 - List<Object> dataList = ReadExcleUtils.<span style="color:#ff0000;">readExcel</span>(file, new YsdwAnimalExcel(), rowStart, cellStrart);
 - for (Object object : dataList) {
 - YsdwAnimalExcel excel = (YsdwAnimalExcel) object;
 - ysdwAnimal = new YsdwAnimal();
 - String uuid = CommonUtils.getUuid();
 - ysdwAnimal.setId(uuid);
 - ysdwAnimal.setAnimalname(excel.getAnimalname());
 - ysdwAnimal.setAnimalnumber(excel.getAnimalnumber());
 - ysdwAnimal.setAnimaltypes(excel.getAnimaltypes());
 - ysdwAnimal.setVegetationtypes(excel.getVegetationtypes());
 - ysdwAnimal.setJingdu(excel.getJingdu());
 - ysdwAnimal.setWeidu(excel.getWeidu());
 - ysdwAnimal.setPodu(excel.getPodu());
 - ysdwAnimal.setPowei(excel.getPowei());
 - ysdwAnimal.setPoxiang(excel.getPoxiang());
 - ysdwAnimal.setZuobiao(excel.getZuobiao());
 - ysdwAnimal.setHaiba(excel.getHaiba());
 - ysdwAnimal.setTianqi(excel.getTianqi());
 - ysdwAnimal.setJilusj(excel.getJilusj());
 - ysdwAnimal.setQita(excel.getQita());
 - ysdwAnimal.setDid(excel.getDid());
 - ysdwAnimal.setBaohdj(excel.getBaohdj());
 - list.add(ysdwAnimal);
 - }
 - //存库
 - for (YsdwAnimal YsdwAnimal : list) {
 - YsdwAnimalMapper.saveOrUpdate(YsdwAnimal);
 - System.out.println("存库");
 - }
 - } catch (IOException e) {
 - e.printStackTrace();
 - return false;
 - }
 - return true;
 - }
 
底层通用方法readExcel
- /**
 - * 读取EXCLE2007的方法
 - * @param filePath 文件名
 - * @param obj 对象名
 - * @param rowStart 起点行(从0开始)
 - * @param cellStrart 起点列(从0开始)
 - * @return 对象集合
 - * @throws IOException
 - */
 - @SuppressWarnings("rawtypes")
 - public static List<Object> readExcel(final String filePath, final Object obj, final int rowStart, final int cellStrart) throws IOException {
 - List<Object> aList = null;
 - final String extension = filePath.substring(filePath.lastIndexOf(".")+1, filePath.length());//截取文件扩展名
 - final Class c = obj.getClass();//获得类对象
 - <span style="color:#cc0000;">final Field[] filds = c.getDeclaredFields();//获得该类中所有的属性</span>
 - final File excelFile = new File(filePath);
 - final InputStream is = new FileInputStream(excelFile);// 获取文件输入流
 - if ("xlsx".equals(extension)) {//解析2007
 - aList = ReadExcleUtils.<span style="color:#ff0000;">analyExcle2007</span>(c, is, filds, rowStart, cellStrart);
 - } else if ("xls".equals(extension)) {
 - aList = ReadExcleUtils.<span style="color:#ff0000;">analyExcle2003</span>(c, is, filds, rowStart, cellStrart);
 - } else {
 - System.out.println("上传文件不正确");
 - }
 - return aList;
 - }
 - @SuppressWarnings("rawtypes")
 - private static List<Object> analyExcle2007(final Class c, final InputStream is, final Field[] filds, final int rowStart, final int cellStrart) throws IOException {
 - Object objs = null;
 - Map<String,Object> mapAtt = null;
 - final List<Object> aList = new ArrayList<Object>();
 - final XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 创建Excel2007文件对象
 - final XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一个工作表,索引是0
 - final XSSFFormulaEvaluator evaluator=new XSSFFormulaEvaluator(workbook2007);
 - for (int i = rowStart; i <= sheet.getLastRowNum(); i++) {
 - String cellStr = null;// 单元格,最终按字符串处理
 - final XSSFRow row = sheet.getRow(i);// 获取行对象
 - if (row == null) {// 如果为空,不处理
 - continue;
 - }else {
 - mapAtt = new HashMap<String,Object>();
 - for (int j = 0; j < filds.length; j++) {
 - final XSSFCell cell = row.getCell(j+cellStrart);
 - //判断单元格的数据类型
 - if (cell != null) {
 - //对时间的特殊处理
 - int dataFormat = cell.getCellStyle().getDataFormat();
 - if (dataFormat == 14 || dataFormat == 176 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {
 - cellStr = ReadExcleUtils.getDateValue2007(cell);
 - } else{
 - switch (cell.getCellType()) {
 - case HSSFCell.CELL_TYPE_NUMERIC://数值
 - BigDecimal db = new BigDecimal(cell.getNumericCellValue());
 - if (db.toString().indexOf(".") != -1) {
 - java.text.DecimalFormat dfomat = new java.text.DecimalFormat("0.000000");
 - cellStr = dfomat.format(db);
 - }else {
 - cellStr = db.toPlainString();
 - }
 - // cellStr = db.toPlainString();
 - // cellStr = String.valueOf(cell.getNumericCellValue());
 - break;
 - case HSSFCell.CELL_TYPE_STRING://字符串
 - cellStr = cell.getStringCellValue();
 - break;
 - case HSSFCell.CELL_TYPE_BOOLEAN://布尔
 - cellStr = String.valueOf(cell.getBooleanCellValue());
 - break;
 - case HSSFCell.CELL_TYPE_FORMULA://公式
 - cellStr = String.valueOf(evaluator.evaluate(cell).getNumberValue());
 - break;
 - case HSSFCell.CELL_TYPE_BLANK://空值
 - cellStr = "";
 - break;
 - default:
 - cellStr = cell.getStringCellValue();
 - break;
 - }
 - }
 - } else {
 - cellStr = null;
 - }
 - //讲单元格中的数据放入集合中
 - mapAtt.put(filds[j].getName(), cellStr);
 - }
 - }
 - try {
 - objs = c.newInstance();
 - ReadExcleUtils.invokeMethod(c, objs, mapAtt);
 - aList.add(objs);
 - } catch (InstantiationException e) {
 - // TODO Auto-generated catch block
 - e.printStackTrace();
 - } catch (IllegalAccessException e) {
 - // TODO Auto-generated catch block
 - e.printStackTrace();
 - }
 - }
 - return aList;
 - }
 - @SuppressWarnings("rawtypes")
 - private static List<Object> analyExcle2003(final Class c, final InputStream is, final Field[] filds, final int rowStart, final int cellStrart) throws IOException {
 - Object objs = null;
 - Map<String,Object> mapAtt = null;
 - final List<Object> aList = new ArrayList<Object>();
 - final HSSFWorkbook workbook2003 = new HSSFWorkbook(is);// 创建Excel2003文件对象
 - final HSSFSheet sheet = workbook2003.getSheetAt(0);// 取出第一个工作表,索引是0
 - final HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook2003);
 - for (int i = rowStart; i <= sheet.getLastRowNum(); i++) {
 - final HSSFRow row = sheet.getRow(i);// 获取行对象
 - if (row == null) {// 如果为空,不处理
 - continue;
 - }else {
 - mapAtt = new HashMap<String,Object>();
 - for (int j = 0; j < filds.length; j++) {
 - String cellStr = null;// 单元格,最终按字符串处理
 - final HSSFCell cell = row.getCell(j+cellStrart);
 - //判断单元格的数据类型
 - if (cell != null) {
 - //对时间的特殊处理
 - int dataFormat = cell.getCellStyle().getDataFormat();
 - // if (dataFormat == 14 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {
 - if (dataFormat == 14 || dataFormat == 31 || dataFormat == 57 || dataFormat == 58) {
 - cellStr = ReadExcleUtils.getDateValue2003(cell);
 - } else{
 - switch (cell.getCellType()) {
 - case HSSFCell.CELL_TYPE_NUMERIC://数值
 - BigDecimal db = new BigDecimal(cell.getNumericCellValue());
 - if (db.toString().indexOf(".") != -1) {
 - java.text.DecimalFormat dfomat = new java.text.DecimalFormat("0.000000");
 - cellStr = dfomat.format(db);
 - }else {
 - cellStr = db.toPlainString();
 - }
 - break;
 - case HSSFCell.CELL_TYPE_STRING://字符串
 - cellStr = cell.getStringCellValue();
 - break;
 - case HSSFCell.CELL_TYPE_BOOLEAN://布尔
 - cellStr = String.valueOf(cell.getBooleanCellValue());
 - break;
 - case HSSFCell.CELL_TYPE_FORMULA://公式
 - cellStr = String.valueOf(evaluator.evaluate(cell).getNumberValue());
 - break;
 - case HSSFCell.CELL_TYPE_BLANK://空值
 - cellStr = "";
 - break;
 - default:
 - cellStr = cell.getStringCellValue();
 - break;
 - }
 - }
 - } else {
 - cellStr = null;
 - }
 - //讲单元格中的数据放入集合中
 - mapAtt.put(filds[j].getName(), cellStr);
 - }
 - }
 - try {
 - objs = c.newInstance();
 - ReadExcleUtils.invokeMethod(c, objs, mapAtt);
 - aList.add(objs);
 - } catch (InstantiationException e) {
 - // TODO Auto-generated catch block
 - e.printStackTrace();
 - } catch (IllegalAccessException e) {
 - // TODO Auto-generated catch block
 - e.printStackTrace();
 - }
 - }
 - return aList;
 - }
 
注意!!在底层方法种完成对excel表格字段顺序的控制,具体控制语句为:final Field[] filds = c.getDeclaredFields();//获得该类中所有的属性
这就是从底层开始导入excel的完整过程
WEB下的excel批量导入功能的更多相关文章
- java使用POI实现Excel批量导入数据
		
1.准备工作 1.1 创建模板表头与数据库表字段一一对应,示例如下 1.2将模板放入项目中,如下图所示: 2.前端页面 2.1 使用超链接提供模板下载地址 <html lang="zh ...
 - 订餐系统之Excel批量导入
		
批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...
 - zabbix3.4用Python脚本Excel批量导入主机
		
1.安装xlrd读取Excel文件 1.1. 下载setuptools-38.2.4.zip,上传至zabbix服务器解压安装,下载地址:https://pypi.python.org/package ...
 - 使用 EPPlus 封装的 excel 表格导入功能 (.net core c#)
		
使用 EPPlus 封装的 excel 表格导入功能 前言 最近做系统的时候有很多 excel导入 的功能,以前我前后端都做的时候是在前端解析,然后再做个批量插入的接口 我觉着这样挺好的,后端部分可以 ...
 - 使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神
		
使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神 前言 接上一篇 使用 EPPlus 封装的 excel 表格导入功能 (一) 前一篇的是大概能用但是 ...
 - Excel批量导入商品,遇到导入失败记录到另一个Excel中供下载查看
		
/// <summary> /// EXCEL批量导入 /// </summary> /// <param name="filePath">文件 ...
 - .Net之Nopi Excel数据导出和批量导入功能
		
一.介绍NPOI和编写demo的原因 1.Npoi是什么: 它是一个专门用于读写Microsoft Office二进制和OOXML文件格式的.NET库,我们使用它能够轻松的实现对应数据的导入,导出功能 ...
 - JAVA实现Excel批量导入
		
一.模板下载: 先将模板放在项目WebRoot下的download文件夹下: /** * @Title: downloadFile * @Description: 模板下载 (网络地址) * @par ...
 - 从零开始实现放置游戏(六)——实现后台管理系统(4)Excel批量导入
		
前面我们已经实现了在后台管理系统中,对配置数据的增删查改.但每次添加只能添加一条数据,实际生产中,大量数据通过手工一条一条添加不太现实.本章我们就实现通过Excel导入配置数据的功能.这里我们还是以地 ...
 
随机推荐
- HBase使用教程
			
1 基本介绍 1.1 前言 HBase – Hadoop Database.是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigta ...
 - Oracle - 数据更新 - 增删改
			
/* 数据的更新 增加 删除 修改 */ -----------------------------------增加(一次只能插入一条数据) --自定义插入数据列的顺序 ,,); --按照数据库默认的 ...
 - C# mouse keyboard monitor
			
/*********************************************************************************** * C# mouse keyb ...
 - BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树
			
BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...
 - 洛谷P1527 矩阵乘法——二维树状数组+整体二分
			
题目:https://www.luogu.org/problemnew/show/P1527 整体二分,先把所有询问都存下来: 然后二分一个值,小于它的加到二维树状数组的前缀和里,判断一遍所有询问,就 ...
 - ContextLoaderListener与RequestContextListener配置问题
			
转自:https://blog.csdn.net/yyqhwr/article/details/83381447 SSH2.SSM等web应用开发框架的配置过程中,因为都要用到spring,所以,往往 ...
 - asp.net MVC 枚举类型的处理的几种方式
			
枚举类型本质上是int类型,整型,这是非常重要的一点. 可以使用(int)将它强制转换为 整形.如果要使用MVC5提供的新辅助方法@Html.EnumDropDownListFor()方法,就必须将枚 ...
 - 关于ArcGis for javascrept查询ArcGis server图层信息的方式
			
方式一: queryTask方式: 该方式用于单个图层的条件查询(不能跨图层查询) 1. 创建query对象 query = new esri.tasks.Query(); 2. 给query对象设置 ...
 - Pascal输出星星
			
program Project2; {$APPTYPE CONSOLE} uses SysUtils; var i,j:integer; begin { TODO -oUser -cConsole M ...
 - UVa 12712 && UVaLive 6653 Pattern Locker (排列组合)
			
题意:给定 一个n * n 的宫格,就是图案解锁,然后问你在区间 [l, r] 内的所有的个数进行组合,有多少种. 析:本来以为是数位DP,后来仔细一想是排列组合,因为怎么组合都行,不用考虑实际要考虑 ...