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导入配置数据的功能.这里我们还是以地 ...
随机推荐
- session与cookie的理解
噶,nation同志又给我布置任务了~~是隔壁家老王提到多次的,session和cookie的运行机制问题~~于是我真的意识到一个问题,程序猿都是一个德行! 1. cookie概述 cookie 常用 ...
- socket.io中文文档
socket.io 中文文档转载于:http://www.cnblogs.com/xiezhengcai/p/3956401.html 服务端 io.on(‘connection’,function( ...
- Java正则表达式的用法
/** * 校验时间格式,正确则返回true * @param xxx * @return */ private static boolean checkDateFormat (String xxx) ...
- Module in powershell
https://docs.microsoft.com/en-us/powershell/module/powershellget/install-module?view=powershell-6 ht ...
- YTU 2918: Shape系列-5
2919: Shape系列-5 时间限制: 1 Sec 内存限制: 128 MB 提交: 251 解决: 199 题目描述 JC和Kitty听说小亮和小华有了Rectangle和Circle并用R ...
- 如何编写linux下nand flash驱动-3
[读(read)操作过程详解] 以最简单的read操作为例,解释如何理解时序图,以及将时序图 中的要求,转化为代码. 解释时序图之前,让我们先要搞清楚,我们要做的事情:那就是,要从nand flash ...
- 小程序-demo:template
ylbtech-小程序-demo: 1.返回顶部 1.app.js 2.app.json 3.app.wxss 4.project.config.json 5.pages 6.images 7. 2. ...
- 微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出?
ylbtech-微信公众平台-文章-app:让创意变为现实,这30个小程序“凭什么”脱颖而出? 1.返回顶部 1. 让创意变为现实,这30个小程序“凭什么”脱颖而出? 微信公开课 昨天 创意1:为多种 ...
- Linux系统挂载NTFS文件系统(转载)
转自:http://hermesbox.blogbus.com/logs/47386987.html 今天尝试并成功的将一块500G的移动硬盘挂载到了RHEL5的系统上,甚感欣慰.想到也许以后自己或其 ...
- Codeforces 908F - New Year and Rainbow Roads 【脑洞】
题意:在一条数轴上有若干'R','B','G'点,连接两个点的代价是位置差,要求使用最小代价使得除去所有'R'点后剩下的所有点联通,除去所有'B'点后剩下的所有点联通. 还以为会是什么最小生成树,结果 ...