Springboot Excle导入导出

导入操作:Excle批量导入

导出操作:下载模版

开发笔记


pom.xml

        <!-- Excle相关jar -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

工具类

ExcleUtils:

package com.wechat.cwbt.util;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 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.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile; /**
*
*
* @Package: com.wechat.cwbt.util
* @ClassName: ExcleUtils
* @Description:Excle相关工具
* @author: zk
* @date: 2019年8月30日 下午4:29:22
*/
public final class ExcleUtils {
/**
*
* @description Excle导入
* @author zk
* @date 2019年8月30日
* @param file
* @return 返回数据对象格式为: 表头->数据
*/
public static Map<String, Object> getDataList(MultipartFile file){
Map<String, Object> result = new HashMap<String, Object>();
// System.out.println(file.getName()+"\t"+file.getOriginalFilename());
List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>(); //判断Excel文件是否有内容
boolean notNull=false;
String filename=file.getOriginalFilename();
if (!filename.matches("^.+\\.(?i)(xls)$") && !filename.matches("^.+\\.(?i)(xlsx)$")) {
result.put("msg","上传文件格式不正确!");
result.put("SUCCESS", false);
return result;
}
//判断Excel文件的版本
boolean isExcel2003=true;
if (filename.matches("^.+\\.(?i)(xlsx)$")) {
isExcel2003 = false;
}
Workbook wb = null;
try {
InputStream fis=file.getInputStream();
if (isExcel2003) {
wb = new HSSFWorkbook(fis);
} else {
wb = new XSSFWorkbook(fis);
}
} catch (Exception e) {
e.printStackTrace();
} // 总共有多少张sheet表
int sheetnum = wb.getNumberOfSheets();
//判断有无数据
if(sheetnum == 1) {
Sheet sheet = wb.getSheetAt(0);
// 第一行数据数据
int rowNum = sheet.getPhysicalNumberOfRows();
if(rowNum==1){
result.put("msg","无数据");
result.put("SUCCESS", false);
return result;
}
}
//获取数据
for (int i = 0; i < sheetnum; i++) {
Sheet sheet = wb.getSheetAt(i);
// 表头数据
Row namerow = sheet.getRow(0); // 第一行数据
Row headrow = sheet.getRow(1); if (null != headrow) { // 总行数
int rowNum = sheet.getPhysicalNumberOfRows();
// int rowNum = sheet.getLastRowNum();
// System.out.println(file.getName() + "共:" + rowNum + " 行!"); // 总列数
int colNum = headrow.getPhysicalNumberOfCells(); // 判断工作表是否为空
if (rowNum == 0) {
continue;
} // 循环行
for (int j = 1; j <= rowNum; j++) {
Row row = sheet.getRow(j);
if (null != row) { Map<String, Object> rowmap = new HashMap<String, Object>();
for(int h=0;h<colNum;h++) {
String str1 = namerow.getCell(h).getStringCellValue();
row.getCell(h).setCellType(Cell.CELL_TYPE_STRING);//设置Cell的类型,按照String取出数据
String str2 = row.getCell(h).getStringCellValue();
rowmap.put(str1,str2);
}
dataList.add(rowmap); //continue;
}
}
}
}
result.put("data", dataList);
result.put("SUCCESS", true);
return result;
} /**
*
* @description Excle导出
* @author zk
* @date 2019年8月30日
* @param filename 文件名称
* @param namearr 表头
* @param datalist 数据
* @return
*/
public static Workbook exportDailyBill(String filename,String[] namearr,List<Map<String, Object>> datalist){
// 创建excel工作簿
Workbook workbook = new XSSFWorkbook();
// 创建第一个sheet(页),并命名
Sheet sheet = workbook.createSheet(filename);
//设置首行标题标题
Row row = sheet.createRow(0);
for(int i=0;i<namearr.length;i++) {
row.createCell(i).setCellValue(namearr[i]);
}
if(datalist!=null) {
//新增数据行,并且设置单元格数据
int rowNum = 1;
for(Map<String, Object> data : datalist)
{
row = sheet.createRow(rowNum);
for(int i=0;i<namearr.length;i++) {
row.createCell(i).setCellValue((String)data.get(namearr[i]));
}
rowNum++;
}
}
return workbook;
}
}

调用:

controller:

   /**
*
* @description 下载模版
* @author zk
* @date 2019年9月9日
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping("/downloadExcle")
public void downloadExcle(HttpServletRequest request, HttpServletResponse response)throws Exception{
String fileName = "按键录入表";//文件名
String[] namearr = {"按键类型","按键名称","按键编码"};//标题
List<Map<String, Object>> datalist = null;//数据
Workbook workbook = ExcleUtils.exportDailyBill(fileName, namearr, datalist);
String name = new String(fileName.getBytes("utf-8"), "ISO-8859-1");//处理文件名称
response.setContentType("application/octet-stream;charset=ISO8859-1");
response.setHeader("Content-disposition", "attachment;filename=" + name + ".xlsx");
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
OutputStream out = response.getOutputStream();
workbook.write(response.getOutputStream());
out.flush();
out.close();
}     /**
     *
     * @description 批量导入Excle
     * @author 左坤
     * @date 2019年9月10日
     * @param file
     * @param request
     * @param response
     * @return
     * @throws Exception
     */
    @Transactional
    @RequestMapping("/importExcle")
    @ResponseBody
    public Map<String, Object> importExcle(MultipartFile file,HttpServletRequest request, HttpServletResponse response){
        Map<String, Object> result = new HashMap<String, Object>();
        Map<String, Object> resmap = ExcleUtils.getDataList(file);
        if((boolean)resmap.get("SUCCESS")) {//有数据
            List<Map<String, Object>> list = (List<Map<String, Object>>) resmap.get("data");
            List<Keyboard> keyboardlist = new ArrayList<Keyboard>();
            if(list!=null) {
                for(int i=0;i<list.size();i++) {
                    Map<String, Object> mapstr = list.get(i);
                    Keyboard keyboard = new Keyboard();
                    keyboard.setName((String)mapstr.get("按键名称"));
                    keyboard.setKeycode(Integer.parseInt((String)mapstr.get("按键编码")));
                    keyboard.setTypeid((String)mapstr.get("按键类型"));
                    keyboard.setCreatetime(new Date());
                    keyboard.setUpdatetime(new Date());
                    keyboard.setIsshow("0");
                    keyboard.setIsdel("0");
                    keyboardlist.add(keyboard);
                }
                int count = keyboardService.insertlist(keyboardlist);//成功条数
                if(count<keyboardlist.size()) {//成功条数小于插入条数
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手动回滚
                    result.put("SUCCESS", false);
                    result.put("msg", "Excle第"+(count+2)+"行存在问题");
                    return result;
                }
                result.put("SUCCESS", true);
                result.put("msg", "操作成功");
            }
        }else {//无数据
            result.put("SUCCESS", false);
            result.put("msg", "Excle无数据");
        }
        return result;
    }

结束

Springboot Excle导入导出的更多相关文章

  1. SpringBoot之导入导出Excel

    1.添加springBoot支持 <dependency> <groupId>org.apache.poi</groupId> <artifactId> ...

  2. POI实现大数据EXCLE导入导出,解决内存溢出问题

    使用POI能够导出大数据保证内存不溢出的一个重要原因是SXSSFWorkbook生成的EXCEL为2007版本,修改EXCEL2007文件后缀为ZIP打开可以看到,每一个Sheet都是一个xml文件, ...

  3. ssm中实现excle导入导出

    1 pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-oox ...

  4. SpringBoot Excel导入导出

    一.引入pom.xml依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  5. org.apache.poi3.1.7 Excle并发批量导入导出

    org.apache.poi3.1.7 升级,需要修改设置方式: 1.org.apache.poi3.1.4 的设置单元格: XSSFCellStyle cellStyle = wb.createCe ...

  6. SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

    有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+ ...

  7. 使用Layui、Axios、Springboot(Java) 实现EasyExcel的导入导出(浏览器下载)

    实现EasyExcel的导入导出(浏览器下载) 实现三个按钮的功能,但是却花费了一天的时间包括总结. 使用到的技术:springboot layui axios EasyExcel mybatis-p ...

  8. SpringBoot 实现 excel 全自由导入导出,性能强的离谱,用起来还特优雅

    一.简介 在实际的业务系统开发过程中,操作 Excel 实现数据的导入导出基本上是个非常常见的需求. 之前,我们有介绍一款非常好用的工具:EasyPoi,有读者提出在数据量大的情况下,EasyPoi ...

  9. 使用VUE+SpringBoot+EasyExcel 整合导入导出数据

    使用VUE+SpringBoot+EasyExcel 整合导入导出数据 创建一个普通的maven项目即可 项目目录结构 1 前端 存放在resources/static 下 index.html &l ...

随机推荐

  1. SQL Join连接

    SQL 连接(Joins) SQL join 用于把来自两个或多个表的行结合起来. SQL JOIN SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 J ...

  2. while循环语句基础

    while循环语句基础 一while循环语句介绍 循环语句命令常用于重复执行一条指令或一组指令,直到条件不再满足时停止,   Shell脚本语言的循环语句常见的有while, until, for及s ...

  3. UNP学习 高级I/O函数

    首先为一个I/O函数设置超时,这有三种方法.然后是三个read和write函数的变体: recv和send,他们可以把含有标志的第四个参数从进程传给内核: readv和writev这两个函数可以指定一 ...

  4. Linux中grep命令,用或的关系查询多个字符串,正则表达式基础说明

    请尊重版权:原文:https://blog.csdn.net/lkforce/article/details/52862193 使用 grep 'word1|word2' 文件名  这样的命令是不对的 ...

  5. 21. Blog接口开发

    一般的系统由登录.增删改查所组成.我们的Blog同样如此.我们会开发登录.创建博客.删除博客.修改博客.查询博客等功能.话不多说,我们直接展开实践吧. 思路分析 创建项目.既然我们要创建一个blog, ...

  6. 打开myeclipse出现这个错是为什么

  7. ABTest介绍及abtest流量切换实现

    本文为学习abtest切流方案方便以后查看大部分内容转载自原文 https://blog.csdn.net/tanweii163/article/details/80543083 互联网公司的业务发展 ...

  8. spark复习总结02

    1.spark执行原理图 spark程序启动后创建sparkContext作为程序的入口,sparkContext可以与不同类的集群资源管理器(Cluster Manager)进行通信,从而获得程序运 ...

  9. su 和 su - 命令有何不同

    su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出 ...

  10. 配置ssh免密登录问题

    有小伙伴的系统需要做免密登录.配置比较简单,ssh-keygen然后生成authorized_keys 文件即可. 但是配置好之后,修改相应用户的家目录权限后,则免密登录就失效了. 经过试验,发现家目 ...