新手学习中,记录一下excel导出功能实现的整个流程。使用框架ssm。

control层 importExcel+parseDataItem:

  1. @RequestMapping("importExcel.do")
  2. public String importExcel(@RequestParam MultipartFile uploadfile,
  3. HttpServletRequest request, HttpServletResponse response) {
  4. String fileName = uploadfile.getOriginalFilename();
  5. if (StringUtils.isEmpty(fileName)) {
  6. System.out.println("未上传文件名为空");
  7. }
  8. String tempPath = request.getSession().getServletContext().getRealPath("/")
  9. + "upload";
  10. File dir = new File(tempPath);
  11. if (!tempPath.endsWith(File.separator)) {
  12. tempPath = tempPath + File.separator;
  13. }
  14. if (!dir.exists()) {
  15. dir.mkdirs();
  16. }
  17. System.out.println(tempPath);
  18. //制作路径
  19. String newFile = tempPath + fileName;
  20. File file = new File(newFile);
  21. try {
  22. FileCopyUtils.copy(uploadfile.getBytes(), file);
  23. //导入excel中的内容
  24. this.<span style="color:#ff0000;">parseDataItem</span>(newFile);
  25. System.out.println("成功导入");
  26. } catch (IOException e) {
  27. e.printStackTrace();
  28. } finally {
  29. try {
  30. FileUtils.forceDelete(file);
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. return "uploadfail";
  34. }
  35. }
  36. return "uploadsuccess";
  37. }
  38. public final boolean <span style="color:#ff0000;">parseDataItem</span>(String file){
  39. return ysdwAnimalService.<span style="color:#ff0000;">importExcel</span>(file);
  40. }

ysdwAnimalService层 import 调用底层通用方法readExcel:

  1. @Transactional
  2. public boolean importExcel(String file) {
  3. final int rowStart = 2;
  4. final int cellStrart = 0;
  5. List<YsdwAnimal> list = new LinkedList<YsdwAnimal>();
  6. YsdwAnimal ysdwAnimal = null;
  7. try {
  8. List<Object> dataList = ReadExcleUtils.<span style="color:#ff0000;">readExcel</span>(file, new YsdwAnimalExcel(), rowStart, cellStrart);
  9. for (Object object : dataList) {
  10. YsdwAnimalExcel excel = (YsdwAnimalExcel) object;
  11. ysdwAnimal = new YsdwAnimal();
  12. String uuid = CommonUtils.getUuid();
  13. ysdwAnimal.setId(uuid);
  14. ysdwAnimal.setAnimalname(excel.getAnimalname());
  15. ysdwAnimal.setAnimalnumber(excel.getAnimalnumber());
  16. ysdwAnimal.setAnimaltypes(excel.getAnimaltypes());
  17. ysdwAnimal.setVegetationtypes(excel.getVegetationtypes());
  18. ysdwAnimal.setJingdu(excel.getJingdu());
  19. ysdwAnimal.setWeidu(excel.getWeidu());
  20. ysdwAnimal.setPodu(excel.getPodu());
  21. ysdwAnimal.setPowei(excel.getPowei());
  22. ysdwAnimal.setPoxiang(excel.getPoxiang());
  23. ysdwAnimal.setZuobiao(excel.getZuobiao());
  24. ysdwAnimal.setHaiba(excel.getHaiba());
  25. ysdwAnimal.setTianqi(excel.getTianqi());
  26. ysdwAnimal.setJilusj(excel.getJilusj());
  27. ysdwAnimal.setQita(excel.getQita());
  28. ysdwAnimal.setDid(excel.getDid());
  29. ysdwAnimal.setBaohdj(excel.getBaohdj());
  30. list.add(ysdwAnimal);
  31. }
  32. //存库
  33. for (YsdwAnimal YsdwAnimal : list) {
  34. YsdwAnimalMapper.saveOrUpdate(YsdwAnimal);
  35. System.out.println("存库");
  36. }
  37. } catch (IOException e) {
  38. e.printStackTrace();
  39. return false;
  40. }
  41. return true;
  42. }

底层通用方法readExcel

  1. /**
  2. * 读取EXCLE2007的方法
  3. * @param filePath 文件名
  4. * @param obj 对象名
  5. * @param rowStart 起点行(从0开始)
  6. * @param cellStrart 起点列(从0开始)
  7. * @return 对象集合
  8. * @throws IOException
  9. */
  10. @SuppressWarnings("rawtypes")
  11. public static List<Object> readExcel(final String filePath, final Object obj, final int rowStart, final int cellStrart) throws IOException {
  12. List<Object> aList = null;
  13. final String extension = filePath.substring(filePath.lastIndexOf(".")+1, filePath.length());//截取文件扩展名
  14. final Class c = obj.getClass();//获得类对象
  15. <span style="color:#cc0000;">final Field[] filds = c.getDeclaredFields();//获得该类中所有的属性</span>
  16. final File excelFile = new File(filePath);
  17. final InputStream is = new FileInputStream(excelFile);// 获取文件输入流
  18. if ("xlsx".equals(extension)) {//解析2007
  19. aList = ReadExcleUtils.<span style="color:#ff0000;">analyExcle2007</span>(c, is, filds, rowStart, cellStrart);
  20. } else if ("xls".equals(extension)) {
  21. aList = ReadExcleUtils.<span style="color:#ff0000;">analyExcle2003</span>(c, is, filds, rowStart, cellStrart);
  22. } else {
  23. System.out.println("上传文件不正确");
  24. }
  25. return aList;
  26. }
  27. @SuppressWarnings("rawtypes")
  28. private static List<Object> analyExcle2007(final Class c, final InputStream is, final Field[] filds, final int rowStart, final int cellStrart) throws IOException {
  29. Object objs = null;
  30. Map<String,Object> mapAtt = null;
  31. final List<Object> aList = new ArrayList<Object>();
  32. final XSSFWorkbook workbook2007 = new XSSFWorkbook(is);// 创建Excel2007文件对象
  33. final XSSFSheet sheet = workbook2007.getSheetAt(0);// 取出第一个工作表,索引是0
  34. final XSSFFormulaEvaluator evaluator=new XSSFFormulaEvaluator(workbook2007);
  35. for (int i = rowStart; i <= sheet.getLastRowNum(); i++) {
  36. String cellStr = null;// 单元格,最终按字符串处理
  37. final XSSFRow row = sheet.getRow(i);// 获取行对象
  38. if (row == null) {// 如果为空,不处理
  39. continue;
  40. }else {
  41. mapAtt = new HashMap<String,Object>();
  42. for (int j = 0; j < filds.length; j++) {
  43. final XSSFCell cell = row.getCell(j+cellStrart);
  44. //判断单元格的数据类型
  45. if (cell != null) {
  46. //对时间的特殊处理
  47. int dataFormat = cell.getCellStyle().getDataFormat();
  48. if (dataFormat == 14 || dataFormat == 176 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {
  49. cellStr = ReadExcleUtils.getDateValue2007(cell);
  50. } else{
  51. switch (cell.getCellType()) {
  52. case HSSFCell.CELL_TYPE_NUMERIC://数值
  53. BigDecimal db = new BigDecimal(cell.getNumericCellValue());
  54. if (db.toString().indexOf(".") != -1) {
  55. java.text.DecimalFormat dfomat = new java.text.DecimalFormat("0.000000");
  56. cellStr = dfomat.format(db);
  57. }else {
  58. cellStr = db.toPlainString();
  59. }
  60. //                              cellStr = db.toPlainString();
  61. //                              cellStr = String.valueOf(cell.getNumericCellValue());
  62. break;
  63. case HSSFCell.CELL_TYPE_STRING://字符串
  64. cellStr = cell.getStringCellValue();
  65. break;
  66. case HSSFCell.CELL_TYPE_BOOLEAN://布尔
  67. cellStr = String.valueOf(cell.getBooleanCellValue());
  68. break;
  69. case HSSFCell.CELL_TYPE_FORMULA://公式
  70. cellStr = String.valueOf(evaluator.evaluate(cell).getNumberValue());
  71. break;
  72. case HSSFCell.CELL_TYPE_BLANK://空值
  73. cellStr =  "";
  74. break;
  75. default:
  76. cellStr = cell.getStringCellValue();
  77. break;
  78. }
  79. }
  80. } else {
  81. cellStr = null;
  82. }
  83. //讲单元格中的数据放入集合中
  84. mapAtt.put(filds[j].getName(), cellStr);
  85. }
  86. }
  87. try {
  88. objs = c.newInstance();
  89. ReadExcleUtils.invokeMethod(c, objs, mapAtt);
  90. aList.add(objs);
  91. } catch (InstantiationException e) {
  92. // TODO Auto-generated catch block
  93. e.printStackTrace();
  94. } catch (IllegalAccessException e) {
  95. // TODO Auto-generated catch block
  96. e.printStackTrace();
  97. }
  98. }
  99. return aList;
  100. }
  101. @SuppressWarnings("rawtypes")
  102. private static List<Object> analyExcle2003(final Class c, final InputStream is, final Field[] filds, final int rowStart, final int cellStrart) throws IOException {
  103. Object objs = null;
  104. Map<String,Object> mapAtt = null;
  105. final List<Object> aList = new ArrayList<Object>();
  106. final HSSFWorkbook workbook2003 = new HSSFWorkbook(is);// 创建Excel2003文件对象
  107. final HSSFSheet sheet = workbook2003.getSheetAt(0);// 取出第一个工作表,索引是0
  108. final HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook2003);
  109. for (int i = rowStart; i <= sheet.getLastRowNum(); i++) {
  110. final HSSFRow row = sheet.getRow(i);// 获取行对象
  111. if (row == null) {// 如果为空,不处理
  112. continue;
  113. }else {
  114. mapAtt = new HashMap<String,Object>();
  115. for (int j = 0; j < filds.length; j++) {
  116. String cellStr = null;// 单元格,最终按字符串处理
  117. final HSSFCell cell = row.getCell(j+cellStrart);
  118. //判断单元格的数据类型
  119. if (cell != null) {
  120. //对时间的特殊处理
  121. int dataFormat = cell.getCellStyle().getDataFormat();
  122. //                      if (dataFormat == 14 || dataFormat == 178 || dataFormat == 180 || dataFormat == 181 || dataFormat == 182) {
  123. if (dataFormat == 14 || dataFormat == 31 || dataFormat == 57 || dataFormat == 58) {
  124. cellStr = ReadExcleUtils.getDateValue2003(cell);
  125. } else{
  126. switch (cell.getCellType()) {
  127. case HSSFCell.CELL_TYPE_NUMERIC://数值
  128. BigDecimal db = new BigDecimal(cell.getNumericCellValue());
  129. if (db.toString().indexOf(".") != -1) {
  130. java.text.DecimalFormat dfomat = new java.text.DecimalFormat("0.000000");
  131. cellStr = dfomat.format(db);
  132. }else {
  133. cellStr = db.toPlainString();
  134. }
  135. break;
  136. case HSSFCell.CELL_TYPE_STRING://字符串
  137. cellStr = cell.getStringCellValue();
  138. break;
  139. case HSSFCell.CELL_TYPE_BOOLEAN://布尔
  140. cellStr = String.valueOf(cell.getBooleanCellValue());
  141. break;
  142. case HSSFCell.CELL_TYPE_FORMULA://公式
  143. cellStr = String.valueOf(evaluator.evaluate(cell).getNumberValue());
  144. break;
  145. case HSSFCell.CELL_TYPE_BLANK://空值
  146. cellStr =  "";
  147. break;
  148. default:
  149. cellStr = cell.getStringCellValue();
  150. break;
  151. }
  152. }
  153. } else {
  154. cellStr = null;
  155. }
  156. //讲单元格中的数据放入集合中
  157. mapAtt.put(filds[j].getName(), cellStr);
  158. }
  159. }
  160. try {
  161. objs = c.newInstance();
  162. ReadExcleUtils.invokeMethod(c, objs, mapAtt);
  163. aList.add(objs);
  164. } catch (InstantiationException e) {
  165. // TODO Auto-generated catch block
  166. e.printStackTrace();
  167. } catch (IllegalAccessException e) {
  168. // TODO Auto-generated catch block
  169. e.printStackTrace();
  170. }
  171. }
  172. return aList;
  173. }

注意!!在底层方法种完成对excel表格字段顺序的控制,具体控制语句为:final Field[] filds = c.getDeclaredFields();//获得该类中所有的属性

这就是从底层开始导入excel的完整过程

WEB下的excel批量导入功能的更多相关文章

  1. java使用POI实现Excel批量导入数据

    1.准备工作 1.1 创建模板表头与数据库表字段一一对应,示例如下 1.2将模板放入项目中,如下图所示: 2.前端页面 2.1 使用超链接提供模板下载地址 <html lang="zh ...

  2. 订餐系统之Excel批量导入

    批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀.商品呀.优惠码之类的,都少不了.毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的.这里, ...

  3. zabbix3.4用Python脚本Excel批量导入主机

    1.安装xlrd读取Excel文件 1.1. 下载setuptools-38.2.4.zip,上传至zabbix服务器解压安装,下载地址:https://pypi.python.org/package ...

  4. 使用 EPPlus 封装的 excel 表格导入功能 (.net core c#)

    使用 EPPlus 封装的 excel 表格导入功能 前言 最近做系统的时候有很多 excel导入 的功能,以前我前后端都做的时候是在前端解析,然后再做个批量插入的接口 我觉着这样挺好的,后端部分可以 ...

  5. 使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神

    使用 EPPlus 封装的 excel 表格导入功能 (二) delegate 委托 --永远滴神 前言 接上一篇 使用 EPPlus 封装的 excel 表格导入功能 (一) 前一篇的是大概能用但是 ...

  6. Excel批量导入商品,遇到导入失败记录到另一个Excel中供下载查看

    /// <summary> /// EXCEL批量导入 /// </summary> /// <param name="filePath">文件 ...

  7. .Net之Nopi Excel数据导出和批量导入功能

    一.介绍NPOI和编写demo的原因 1.Npoi是什么: 它是一个专门用于读写Microsoft Office二进制和OOXML文件格式的.NET库,我们使用它能够轻松的实现对应数据的导入,导出功能 ...

  8. JAVA实现Excel批量导入

    一.模板下载: 先将模板放在项目WebRoot下的download文件夹下: /** * @Title: downloadFile * @Description: 模板下载 (网络地址) * @par ...

  9. 从零开始实现放置游戏(六)——实现后台管理系统(4)Excel批量导入

    前面我们已经实现了在后台管理系统中,对配置数据的增删查改.但每次添加只能添加一条数据,实际生产中,大量数据通过手工一条一条添加不太现实.本章我们就实现通过Excel导入配置数据的功能.这里我们还是以地 ...

随机推荐

  1. IP达人启示录(学会经营自己:靠软件来扩大自己的IP,或者获取很大的名声)

    在家附近的一个小公园中,一个老人每天晚上都在用水练习书法,他的字写的的确很不错,不懂书法的我,看了就感觉非常的带劲--苍劲有力.今晚再次路过的时候,就有种想和这个老人聊一聊的冲动,那么多年纪了,用书法 ...

  2. SVN服务器端的使用

    SVN服务器端的使用 1.下载VirtualSVN Server,安装好后打开,右键Repository->新建->Repository创意一个版本库.默认点击下一步,输入要创建版本库的名 ...

  3. 谈谈对redux的认识

    redux是从flux演变而来,但又独立于react.简言之就是,redux是一种单纯的状态管理器.可以和react搭配,也可以和其它框架搭配. redux有三个重要的部分组成: store, act ...

  4. c语言中 %p的含义【转】

    本文转载自:http://blog.csdn.net/creat2012/article/details/44224217 今天看到了一个%p,表示没有看到过. = =.学习了. 格式控制符“%p”中 ...

  5. easyui表格格线错位

    现象:如果easyui表格中存在后渲染的linkbutton,则可能会导致表格固定列的格线与内容列的格线不一致,出现这种情况的原因是在表格的onLoadSuccess事件中渲染linkbutton时, ...

  6. openfire源码编译后部署到linux

    1.源码通过编号后,会生成target目录,直接把target目录拷贝到linux下即可: 2.启动openfire: ./openfire.sh start 3.退出直接ctr + c 问题:如果一 ...

  7. Python下的LibSVM的使用

    突然觉的笔记真的很重要,给自己省去了很多麻烦,之前在Python 3 中装过libsvm 每一步都是自己百度上面搜寻的,花费了很长时间,但是并没有记录方法.这次换了电脑,又开始重新搜寻方法,觉得太浪费 ...

  8. Oracle sql执行计划解析

    Oracle sql执行计划解析 https://blog.csdn.net/xybelieve1990/article/details/50562963 Oracle优化器 Oracle的优化器共有 ...

  9. 【TJOI 2014】 上升子序列

    [题目链接] 点击打开链接 [算法] 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i] ...

  10. mysqlnd cannot connect to MySQL 4.1+ using old authentication

    报这个错误主要是因为mysql使用了老的密码格式,而程序要求使用新的格式导致的,解决办法: SET old_passwords = 0; UPDATE mysql.user SET Password ...