excel文件导入或导出Java代码示例

news2024/11/26 9:57:53

1、excel文件导入

controller层接口内容

 service层代码

 

 serviceImpl内代码内容

 @Override
    @Transactional(rollbackFor = Exception.class)
    public void importCheckItemExcel(MultipartFile file, Long checkPkgId) throws Exception {
        if (file.isEmpty()){
            throw new IOException("请选择上传文件");
        }
        Workbook work = this.getWorkbook(file);
        if (null == work) {
            throw new HolliException(DeviceExceptionEnum.EXCEL_IS_NULL_EXCEPTION);
        }
        Iterator<Sheet> sheetIterator = work.sheetIterator();
        while (sheetIterator.hasNext()) {
            Sheet sheet = sheetIterator.next();
            if (sheet == null) {
                return;
            }
            //先获取首列标题
            Map<String, Integer> validColumns = new HashMap<>();
            List<String> headerCells = getFirstRow(sheet, 0);
            if (headerCells == null) {
                return;
            }
            for (int i = 0; i < headerCells.size(); i++) {
                Object header = headerCells.get(i);
                if (header == null) {
                    continue;
                }
                if (ObjectUtil.contains(header, "修程")) {
//                    validColumns.put("checkLevel", i);//数字
                    validColumns.put("checkLevelName", i);//含义
                }else if (ObjectUtil.contains(header, "工作项目")) {
                    validColumns.put("checkName", i);
                }else if (ObjectUtil.contains(header, "单位")) {
//                    validColumns.put("checkUnit", i);//数字
                    validColumns.put("checkUnitName", i);//含义
                }else if (ObjectUtil.contains(header, "周期")) {
                    validColumns.put("checkCycle", i);
                }else if (ObjectUtil.contains(header, "工作内容及标准")) {
                    validColumns.put("checkContent", i);
                }else if (ObjectUtil.contains(header, "ATP型号")) {
                    validColumns.put("atpModel", i);
                }
            }
//标题集合
            if (validColumns.size() == 0) {
                return;
            }
            Map<String, Object> map = new HashMap<String, Object>();
            //遍历当前sheet中的所有行
            //包涵头部,所以要小于等于最后一列数,这里也可以在初始值加上头部行数,以便跳过头部
            for (int j = 1; j <= sheet.getLastRowNum(); j++) {
                //读取一行
                List<Object> rows = getRow(sheet, j);
                if (rows == null) {
                    continue;
                }
                Set<String> keySet = validColumns.keySet();
                for (String key : keySet) {
                    int col_index = validColumns.get(key);
                    if (col_index >= rows.size()) {
                        continue;
                    }
                    Object cell = rows.get(col_index);
                    map.put(key, cell);
                }
//取出对应属性及值内容 以便存储数据库
 //业务逻辑,数据存储
                DevCheckItemVo devCheckItemVo = new DevCheckItemVo();
                BeanUtil.copyProperties(map, devCheckItemVo);
                this.insertDevCheckItem(checkPkgId, devCheckItemVo, j + 1);
            }
        }
    }


 判断excel的格式,同时兼容2003和2007


    protected final static String excel2003L = ".xls";    //2003- 版本的excel
    protected final static String excel2007U = ".xlsx";   //2007+ 版本的excel
 

/**
     * 描述:根据文件后缀,自适应上传文件的版本
     */
    public static Workbook getWorkbook(MultipartFile file) throws Exception {
        Workbook wb = null;
        InputStream is = file.getInputStream();
        String fileType = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        if (excel2003L.equals(fileType)) {
            wb = new XSSFWorkbook(is);  //2007+
//            因HSSFWorkbook报(You need to call a different part of POI to process this data (eg XSSF instead of HSSF)),故直接使用XSSFWorkbook处理
//            wb = new HSSFWorkbook(is);  //2003-
        } else if (excel2007U.equals(fileType)) {
            wb = new XSSFWorkbook(is);  //2007+
        } else {
            throw new IOException("解析的文件格式有误!");
        }
        return wb;
    }

 获取行数据

/**
     * 获取行数据
     * @param sheet
     * @param rowIndex
     * @return
     */
    public List<Object> getRow(Sheet sheet, int rowIndex) {
        List<Object> li = new ArrayList<Object>();
        if (sheet == null) {
            return null;
        }
        Row row = null;
        Cell cell = null;
        //读取一行
        row = sheet.getRow(rowIndex);
        //去掉空行和表头
        if (row == null) {
            return null;
        }
        /**为去掉空行,若第一列为空,则直接跳过该行*/
        if (ObjectUtil.isEmpty(row.getCell(0))) {
            return null;
        }
        //遍历所有的列
        for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
            cell = row.getCell(y);
            li.add(this.getCellFormatValue(cell));

        }
        return li;
    }

 //获取excel列表内的对应数据格式


//获取excel列表内的对应数据格式
    protected Object getCellFormatValue(Cell cell) {
        Object val = "";
        if (null != cell) {
            if (cell.getCellType() == CellType.NUMERIC || cell.getCellType() == CellType.FORMULA)
            {
                val = cell.getNumericCellValue();
                if (DateUtil.isCellDateFormatted(cell))
                {
                    val = DateUtil.getJavaDate((Double) val); // POI Excel 日期格式转换
                }
                else
                {
                    if ((Double) val % 1 != 0)
                    {
                        val = new BigDecimal(val.toString());
                    }
                    else
                    {
                        val = new DecimalFormat("0").format(val);
                    }
                }
            }
            else if (cell.getCellType() == CellType.STRING)
            {
                val = cell.getStringCellValue();
            }
            else if (cell.getCellType() == CellType.BOOLEAN)
            {
                val = cell.getBooleanCellValue();
            }
            else if (cell.getCellType() == CellType.ERROR)
            {
                val = cell.getErrorCellValue();
            }
        } else {
            val = "";
        }
        return val;
    }

 2、excel导出

controller层接口内容

  service层代码

  serviceImpl内代码内容

 @Override
    public void exportCheckItemExcel(String strIds, HttpServletResponse response) throws Exception {
        List<DevCheckItem> devCheckItemList = new ArrayList<>();
        long[] itemIdArray = StrUtil.splitToLong(strIds,",");
        //查询检修项id
        for (int i = 0; i< itemIdArray.length; i++){
            DevCheckItem devCheckItem = this.getById(itemIdArray[i]);
            if (ObjectUtil.isNotEmpty(devCheckItem)){
                devCheckItemList.add(devCheckItem);
            }
        }
        if (ObjectUtil.isNotEmpty(devCheckItemList) && devCheckItemList.size() > 0){
            //导出excel
            XSSFWorkbook workbook=new XSSFWorkbook();
            //获得名字为sheet的工作本对象,这个是看你的模板工作表的名字
            XSSFSheet sheet = workbook.createSheet("sheet1");
            // 序号
            int serialNo = 1;
            //行号
            int rowIndex = 1;

            //创建表头
            XSSFRow row_excel = sheet.createRow(0);

//行业务数据填充
            XSSFCell cell = row_excel.createCell(0);
            cell.setCellValue("序号");

            cell = row_excel.createCell(1);
            cell.setCellValue("ATP型号");

            cell = row_excel.createCell(2);
            cell.setCellValue("修程");

            cell = row_excel.createCell(3);
            cell.setCellValue("工作项目");

            cell = row_excel.createCell(4);
            cell.setCellValue("单位");

            cell = row_excel.createCell(5);
            cell.setCellValue("周期(小时)");

            cell = row_excel.createCell(6);
            cell.setCellValue("工作内容及标准");

            //遍历填充数据
            for (DevCheckItem devCheckItem : devCheckItemList){
                //获取当前行
                row_excel = sheet.getRow(rowIndex);
                if (row_excel == null){
                    //创建行
                    row_excel = sheet.createRow(rowIndex);
                }
                //内容填充
                if (ObjectUtil.isNotEmpty(devCheckItem)){
                    XSSFCell cellNew = row_excel.createCell(0);
                    cellNew.setCellValue(serialNo);

                    cell = row_excel.createCell(1);
                    if (ObjectUtil.isNotEmpty(devCheckItem.getAtpModel())){
                        cell.setCellValue(devCheckItem.getAtpModel());
                    }

                    cell = row_excel.createCell(2);
                    if (ObjectUtil.isNotEmpty(devCheckItem.getCheckLevel())){
                        String levelName = DevCheckLevelEnum.getLevelNameByType(devCheckItem.getCheckLevel());
                        cell.setCellValue(levelName);
                    }

                    cell = row_excel.createCell(3);
                    if (ObjectUtil.isNotEmpty(devCheckItem.getCheckName())){
                        cell.setCellValue(devCheckItem.getCheckName());
                    }

                    cell = row_excel.createCell(4);
                    if (ObjectUtil.isNotEmpty(devCheckItem.getCheckUnit())){
                        String checkUnit = this.getCheckUnitNameByNum(devCheckItem.getCheckUnit());
                        cell.setCellValue(checkUnit);
                    }

                    cell = row_excel.createCell(5);
                    if (ObjectUtil.isNotEmpty(devCheckItem.getCheckCycle())){
                        cell.setCellValue(devCheckItem.getCheckCycle());
                    }

                    cell = row_excel.createCell(6);
                    if (ObjectUtil.isNotEmpty(devCheckItem.getCheckContent())){
                        cell.setCellValue(devCheckItem.getCheckContent());
                    }
                }
                serialNo++;
                rowIndex++;
            }
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Type", "application/vnd.ms-excel");
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);

        }
    }

以上已导出完成。

3、以下为可能会用到的导出实例文件,上传文件服务器的过程 

File格式转换MultipartFile格式的例子

//上传minio服务器
String fileName = "检修工作项目.xlsx";
File cacheFile = new File(fileName);
if (cacheFile.exists()) {
    cacheFile.delete();
}
  
cacheFile.createNewFile();//生成文件
OutputStream out = new FileOutputStream(cacheFile);
workbook.write(out);
---------------------------------------------------------------------------------------(上面为导出实例文件)
//下面为上传文件流格式转换的格式。
FileInputStream fileInputStream = new FileInputStream(cacheFile);
MultipartFile multipartFile = new MockMultipartFile("cacheFile", cacheFile.getName(), "text/plain", IOUtils.toByteArray(fileInputStream));

 

-------------------------------------以下无正文-----------------------------------------------------------

注:仅供学习,记录问题和参考,共勉!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/771385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS 8 GLIBC升级失败系统崩溃抢修实战

CentOS 8 GLIBC升级失败系统崩溃抢修实战 1. 恐怖的问题2. 参考解决方案3. 抢修实战3.1 准备工作3.2 抢修流程3.3 解决启动后Permission Denied3.3.1 参考方案3.3.2 解决 4. 总结 服务器为CentOS 8&#xff0c;支持glibc版本为2.28&#xff0c;但编译一个工具的glibc需求版本为…

mysql中的行格式之compact格式分析

mysql中的行格式之compact格式分析 mysql行格式 所谓行格式&#xff0c;就是指mysql一行数据的存储格式。 InnoDB 储存引擎支持有四种行储存格式&#xff1a;Compact、Redundant、Dynamic 和 Compressed。 Redundant是很古老的行格式了&#xff0c;因为占用空间最多&#x…

Small Tip: 怎么找S4HANA所有的CDS View 以及跟BW相关的CDS View

1. 网页上找 1. SAP Business Accelerator Hub 到网址&#xff1a;https://api.sap.com 2. 到Categories底下找。如果没看见CDS View就去View all categories 3. 找到CDS Views之后&#xff0c;点击进去。 4. 按Package 分类来找&#xff1a; 2. 去help.sap.com找SAP S/4HA…

物理机传输大文件到虚拟机

物理机快速传输大文件到虚拟机 测试使用Tabby传输大文件到虚拟机 1.1 准备大文件 1.2 通过Tabby上传文件到Linux 总耗时约&#xff1a;7分钟 1.3 通过EveryThing配置服务 打开EveryThing&#xff0c;点击工具—> 选项—>http服务器 启用HTTP服务器&#xff0c;配置…

【基于 GitLab 的 CI/CD 实践】05、GitLab Pipeline 实践(下)

目录 needs 并行阶段 制品下载 include local 引入本地配置 file 引入其他项目配置 template 引入官方配置 remote 引入远程配置 extends 继承作业配置 extends & include trigger 管道触发 多项目管道 父子管道 image 准备环境 services environment inh…

文心一言 VS 讯飞星火 VS chatgpt (63)-- 算法导论6.5 2题

文心一言 VS 讯飞星火 VS chatgpt &#xff08;63&#xff09;-- 算法导论6.5 2题 二、试说明 MAX-HEAP-INSERT(A&#xff0c;10)在堆A(15&#xff0c;13&#xff0c;9&#xff0c;5&#xff0c;12&#xff0c;8&#xff0c;7&#xff0c;4&#xff0c;0&#xff0c;6&#xf…

XR应用云流化,多方面提升 XR 扩展现实体验!

无论是使用户能够协作设计电动赛车&#xff0c;还是帮助观众通过数字世界与自然互动&#xff0c;越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境。 下一代沉浸式技术的应用越来越广泛&#xff0c;图形和人工智能的最新突破正在扩展XR的功能。这四种技术正在XR生态…

网络安全在2023好入行吗?

前言 023年的今天&#xff0c;慎重进入网安行业吧&#xff0c;目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多&#xff0c;还有很多高中被挖过来的大佬。 理由很简单&#xff0c;目前来说&#xff0c;信息安全的圈子人少&#xff0c;985、211院校很多都才建…

K12351 生日日期

题目描述 小科的生日是YY年MM月DD日&#xff0c;他想知道自己出生第10000天纪念的日期&#xff0c;出生日算第0天 输入格式 输入三个整数&#xff0c;分别表示YY,MM,DD,其中 1949≤YY≤2016 输出格式 输出小科身体第一万天以后的日期&#xff0c;格式为YY-MM-DD 输入输出…

Jmeter+Maven+jenkins+eclipse搭建自动化测试平台

背景&#xff1a; 首先用jmeter录制或者书写性能测试的脚本&#xff0c;用maven添加相关依赖&#xff0c;把性能测试的代码提交到github&#xff0c;在jenkins配置git下载性能测试的代码&#xff0c;配置运行脚本和测试报告&#xff0c;配置运行失败自动发邮件通知&#xff0c…

Docker 基本管理与应用

目录 一、Docker介绍 1、docker概述 2、容器优势 3、Docker与虚拟机的区别 4、Docker核心概念 二&#xff1a; 安装 Docker 1、环境准备、安装依赖包 2、 设置阿里云镜像源&#xff0c;安装 Docker-CE并设置为开机自动启动 3、信息查看 ​三&#xff1a;Docker 镜像操作…

AHB协议理解

目录 Chapter1 AHB Block Diagram Ginput signal lnput signals Output Signal Chapter3 Transfers AHB接口Overview Chapter6 Data Buses HWDATA HRDATA Chapter1 Introduction AHB: Advanced High-performance Bus ( 高级高性能总线 ) 应用场景&#xff1a;针对高效率&#…

cancal报错 config dir not found

替换classpath中间封号两边的值

这款录音转文字工具让你的录音转写更加便捷

小明&#xff1a;小李&#xff0c;最近我一直在做一个听力练习&#xff0c;但是听力材料都是录音&#xff0c;手动转写真的好慢&#xff0c;有什么办法可以提高录音转写效率吗&#xff1f; 小李&#xff1a;当然有啦&#xff01;我之前也遇到过这种情况&#xff0c;最后我是通…

边缘检测之loG算子

note // 边缘检测之loG算子&#xff1a;对高斯函数求二阶导数 // G(x,y) exp(-1 * (x*x y*y) / 2 / sigma / sigma) // loG(x,y) ((x*x y*y - 2 * sigma * sigma) / (sigma^4)) * exp(-1 * (x*x y*y) / 2 / sigma /sigma) /* [ 0,0,-1,0,0; 0,-1,-2,-1,0; -1,-2,16,-2…

『红外图像 数据增强』DDE(Digital Detail Enhancement)算法

DDE处理的细节 分离背景层和细节层&#xff1a;使用特殊的滤波器&#xff0c;将图像分成背景层和细节层。背景层通常包含低频信息&#xff0c;而细节层包含高频信息。 对背景层进行灰度增强&#xff1a;通过对背景层应用适当的灰度增强算法&#xff0c;提高背景层的对比度和视…

数据结构(王道)——数据结构之 二叉树的存储结构

一、顺序存储 静态顺序存储 顺序存储的二叉树结构特性&#xff1a; 顺序存储的非完全二叉树特性 不完全二叉树的可能会浪费大量空间&#xff0c;所以一般顺序存储二叉树比较少用。 图示为什么很少用顺序存储来存二叉树 顺序存储的二叉树总结&#xff1a; 二、链式存储 二叉链表…

MYSQL数据库-数据库的学习

MYSQL数据库-数据库的学习 MYSQL数据库一、数据库的基本概念二、常见的数据库三、MySQL数据库四、SQL操作五、SQL高级操作六、SQL函数&#xff08;SQL 拥有很多可用于计数和计算的内建函数) MYSQL数据库 一、数据库的基本概念 1、数据库的英文单词:DataBase 简称 : DB 2、什么…

浙大数据结构第四周之04-树6 Complete Binary Search Tree

题目详情&#xff1a; A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the nodes key.The right subtree of a node contains only nodes w…

2023软件测试八股文,拿下满意的offer就靠这了

前言 2023年软件测试行业就业越来越严峻&#xff0c;金三银四也成了铜三铁四&#xff0c;内卷成为了软件测试领域的代名词。 深圳&#xff0c;我的一个HR朋友告诉我&#xff0c;软件测试由于门槛低&#xff0c;现在普通测试岗&#xff08;偏功能&#xff09;的投递太多了&…