EasyPoiUtil导出工具

2023-05-16

package com.zjson.alibaba.commons.tools.utils;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.poi.hssf.usermodel.DVConstraint;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataValidation;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.ss.formula.functions.T;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddressList;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.NoSuchElementException;

public class EasyPoiUtil {


    /**
     * 获取导出数据的book
     */
    public static Workbook getExcelDataWorkbook(List<?> list, Class<?> pojoClass){
        ExportParams exportParams = new ExportParams(null, "sheet1",ExcelType.HSSF);
        //设置导出格式
        exportParams.setStyle(ExcelStyleUtil.class);
        //把数据添加到excel表格中
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        return workbook;
    }



    /**
     * excel 导出
     *
     * @param workbook         数据列表
     * @param fileName     导出时的excel名称
     * @param response
     */
    public static void defaultExport(String fileName,Workbook workbook,HttpServletResponse response) throws IOException {
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * excel下载
     *
     * @param fileName 下载时的文件名称
     * @param response
     * @param workbook excel数据
     */
    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel数据导入
     */
    public static List<T> importDataFromExcel(MultipartFile file, Class<T> classObj) throws IOException {
        List<T> importData = importExcel(file.getInputStream(), 1, classObj);
        return importData;
    }


    /**
     * excel 导入
     *
     * @param inputStream 文件输入流
     * @param sheetNum sheet页
     * @param pojoClass   pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream,int sheetNum, Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setSheetNum(sheetNum);
        params.setNeedSave(false);
        params.setHeadRows(1);
        try {
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }


    /**
     * 添加批注
     * @param workbook
     * @param excelCommentList
     */
    public static void addSheetComments(Workbook workbook,List<ExcelComment> excelCommentList){
        Sheet sheet = workbook.getSheetAt(0);
        for (ExcelComment excelComment : excelCommentList) {
            Row row = sheet.getRow(excelComment.getRow());
            Cell cell = row.getCell(excelComment.getCell());
            // 创建绘图对象
            Drawing p = sheet.createDrawingPatriarch();
            // 获取批注对象 前四个参数是坐标点,后四个参数是编辑和显示批注时的大小.
            Comment comment = p.createCellComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));
            // 输入批注信息
            comment.setString(new HSSFRichTextString(excelComment.getComment()));
            // 将批注添加到单元格对象中
            cell.setCellComment(comment);
        }
    }



    /**
     * 为表格设置数据验证
     * firstRow 开始行号(下标0开始)
     * lastRow  结束行号,最大65535
     * firstCol 区域中第一个单元格的列号 (下标0开始)
     * lastCol 区域中最后一个单元格的列号
     * dataArray 下拉内容
     * sheetHidden 影藏的sheet编号(例如1,2,3),多个下拉数据不能使用同一个
     * */
    public static void addSheetValidation(Workbook workbook, int firstRow, int lastRow, int firstCol, int lastCol, String[] dataArray, int sheetHidden){
        String hiddenName = "hidden_" + (int)((Math.random()*9+1)*100);
        Sheet sheet = workbook.getSheetAt(0);
        Sheet hidden = workbook.createSheet(hiddenName);
        Cell cell = null;
        for (int i = 0, length = dataArray.length; i < length; i++)
        {
            String name = dataArray[i];
            Row row = hidden.createRow(i);
            cell = row.createCell(0);
            cell.setCellValue(name);
        }
        Name namedCell = workbook.createName();
        namedCell.setNameName(hiddenName);
        namedCell.setRefersToFormula(hiddenName + "!$A$1:$A$" + dataArray.length);
        //加载数据,将名称为hidden的
        DVConstraint constraint = DVConstraint.createFormulaListConstraint(hiddenName);
        // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列
        CellRangeAddressList addressList = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol);
        HSSFDataValidation validation = new HSSFDataValidation(addressList, constraint);
        // 将sheet设置为隐藏
        //workbook.setSheetHidden(sheetHidden, true);
        sheet.addValidationData(validation);
    }

    /**
     *  文件流读取头字段
     * @param inp 文件流
     * @return 头字段
     */
    public static List<String> getHeaderFields(InputStream inp) {
        try {
            return  readHeader(0, 0, WorkbookFactory.create(inp));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }
    /**
     *  文件地址读取头字段
     * @param filePath 文件地址
     * @return 头字段
     */
    public static List<String> getHeaderFields(String filePath) {
        try {
            return readHeader(0, 0, WorkbookFactory.create(new File(filePath)));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return Collections.emptyList();
    }

    /**
     *  读取投文件
     * @param sheetNum sheetNum
     * @param rowNum rowNum
     * @param workbook workbook
     */
    public static List<String> readHeader(int sheetNum,int rowNum , Workbook workbook) {
        // 默认读取第一个sheet
        Sheet sheet = workbook.getSheetAt(sheetNum);
        // 默认读取第一行
        Row titleRow = sheet.getRow(rowNum);
        //有多少列
        int cellNum = titleRow.getLastCellNum();
        List<String> headerList = new ArrayList<>(cellNum);
        for (int i = 0; i < cellNum; i++) {
            //根据索引获取对应的列
            Cell cell = titleRow.getCell(i, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
            //设置列的类型是字符串
            headerList.add(cell.getStringCellValue());
        }
        return headerList;
    }

    public static void main(String[] args) throws IOException {
        String filePath = "C:\\Users\\Administrator\\Desktop\\xc.xlsx";
        List<String> headerList = getHeaderFields(filePath);
        System.out.println(headerList);
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EasyPoiUtil导出工具 的相关文章

  • ubuntu usb权限问题解决

    在 etc udev rules d 创建51 android rules SUBSYSTEM 61 61 34 usb 34 ENV DEVTYPE 61 61 34 usb device 34 MODE 61 34 0666 34 SU
  • 关于onConfigurationChanged方法及常见问题解决

    本篇文章已授权微信公众号 guolin blog xff08 郭霖 xff09 独家发布 1 public void onConfigurationChanged Configuration newConfig 方法介绍 newConfig
  • C_INCLUDES must be under the source or output directories: /securemsm/QSEEComAPI.

    高通编译报错如下 xff1a FAILED 10 57 33 build span class token operator span make span class token operator span core span class
  • 手写一个生产者--消费者模型例子

    在并发编程中 xff0c 比较经典的编程例子就是生产者和消费者模型 下面就是一个例子来诠释一下什么是生产者和消费者以及他们的特点和注意点 1 先定义一个数据对象 xff0c span class hljs keyword public sp
  • android R的一些selinux配置经验分享

    1 编译报 xff1a violated by allow avm3d service avm3d service exec file read getattr map execute open entrypoint 定位 xff1a 没有
  • 华为服务器安装Centos6.5

    1 登陆对应华为服务器 xff1a 100 100 100 206 默认ip为192 168 2 100 默认账号 xff1a root 默认密码 xff1a Huawei12 联想服务器 xff1a 默认ip为192 168 70 125
  • android系统应用之Settings

    Setting作为安卓一个比较重要的系统级应用 xff0c 为用户提供一些系统项的设置 原生android系统的源码路径 xff1a packages apps Settings 但MTK厂商的源码包中对该应用进行了重构其源码路径 xff1
  • 无人机的偏航角,滚动角,俯仰角解释

    1 偏航角 xff08 yaw xff09 简单的定义 xff1a 就是实际航向与计划航向之间的夹角 xff0c 如图所示 深刻的定义 xff1a 机轴 xff08 沿机头方向 xff09 水平投影与地轴的夹角 xff0c 如图所示 或者
  • ubuntu通过deepin-wine安装和windows一样效果微信、QQ等。

    开发中 xff0c 大家都使用ubuntu xff0c 但要用到微信 QQ等一些软件时 xff0c 很头痛 xff0c 因为腾讯不提供linux下的安装软件 xff0c 这是我们就要通过三方wine来进行安装 结果和windows中使用效果
  • 从根本解决AndroidStudio Unable to parse template "Class" Error message

    Unable to parse template 34 Class 34 Error message This template did not produce a Java class or an interface 根据template
  • android 解决BottomNavigationView+nav_host_fragment实现tab,fragment重建问题

    重建原因 xff1a 源码FragmentNavigator中对fragment的管理时通过replace实现的 xff0c 所以会导致每次切换时重建 解决思路 xff1a 继承FragmentNavigator 把replace的实现方式
  • git速查

    git速查 文章目录 git速查git init clone 仓库git config 配置git add rm mv添加 删除git commit提交git fetch remote pull push reset 远程同步git bra
  • ViewBinding的简单使用

    ViewBinding的作用就是为了避免编写findViewById xff0c 和kotlin android extensions插件类似 xff0c 项目工程模块的build gradle中加入以下配置 xff1a android b
  • 蓝牙HC05主从设置连接说明

    蓝牙HC05是主从一体的蓝牙串口模块 xff0c 简单的说 xff0c 当蓝牙设备与蓝牙设备配对连接成功后 xff0c 我们可以忽视蓝牙内部的通信协议 xff0c 直接将将蓝牙当做串口用 当建立连接 xff0c 两设备共同使用一通道也就是同
  • 英雄联盟无法开始第二局(已解决,亲测有效)

    目录 1 使用记事本打开hosts文件 xff0c 添加这一行113 250 3 73 prod rso lol qq com 编辑 2 在地址栏输入cmd xff08 个人觉得这样打开对小白方便些 xff0c 主要是打开cmd就行 xff
  • Windows下Zookeeper启动zkServer.cmd闪退问题的解决方案

    本人今天在使用RPC的过程中使用Zookeeper作为中间节点服务器 在windows中启动Zookeeper 在windows启动Zookeeper双击zkServer cmd xff08 但是需要保证安装了java环境 xff09 但是
  • (二叉树)高度平衡二叉树的判定

    题目描述 给定一个二叉树 xff0c 判断它是否是高度平衡的二叉树 本题中 xff0c 一棵高度平衡二叉树定义为 xff1a 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1 题目分析 由题意可知 xff0c 高度平衡二叉树是指树
  • 屏蔽快捷键

    屏蔽鼠标右键 function document oncontextmenu event returnValue 61 false 屏蔽F1帮助 function window onhelp return false 屏蔽其他功能键 fun
  • SpringBoot中使用防止用户重复点击,后台实现

    lt 64 Aspect需要的包 gt lt https mvnrepository com artifact aopalliance aopalliance gt lt dependency gt lt groupId gt aopall
  • Java基础-基本语法

    1 Java 语言有哪些特点 简单易学 有丰富的类库 面向对象 xff08 Java最重要的特性 xff0c 让程序耦合度更低 xff0c 内聚性更高 xff09 与平台无关性 xff08 JVM是Java跨平台使用的根本 xff09 可靠

随机推荐

  • Spring常用注解

    bean注入与装配的方式有很多种 xff0c 可以通过xml xff0c get set方式 xff0c 构造函数或者注解等 简单易用的方式就是使用Spring的注解 xff0c Spring提供了大量的注解方式 64 Required注解
  • RabbitMQ

    什么是 RabbitMQ xff1f RabbitMQ 是使用 Erlang 语言来编写的 xff0c 并且是基于 AMQP 协议 最大的特点就是 消费并不需要确保提供方存在 xff0c 实现了服务之间的高度解耦 AMQP xff1a Ad
  • word批量设置图片大小和对齐,使用宏定义

    word使用宏定义来批量设置图片大小 打开word中开发工具 xff0c 文件 选项 word选项 新建Visual Basic文件 点击 插入 模块 复制下列任意代码 xff0c 粘贴到右侧 xff08 注意可以灵活设置Myheigth或
  • postman设置不更新

    一 关闭自动更新目前有两种方案 xff1a 第一种 xff1a Hosts文件配置以下地址屏蔽连接 xff1a 1 以下配置粘贴到文件中 xff0c 文件位置 xff1a C Windows System32 drivers etc 0 0
  • ECharts多个折线图动态获取json数据

    ECharts 多个折线图动态获取json数据 效果图如下 xff1a 一 html部分 lt p id 61 34 TwoLineChart 34 style 61 34 width 100 height 400px 34 gt lt p
  • JS中setTimeout()的用法详解

    setTimeout 是属于 window 的 method 但我们都是略去 window 这顶层物件名称 这是用来设定一个时间 时间到了 就会执行一个指定的 method 1 SetTimeOut 1 1 SetTimeOut 语法例子
  • Java写个程序00001递增到99999

    NumberFormat f 61 new DecimalFormat 34 00000 34 for int i 61 1 i lt 10000 i 43 43 System out println f format i ER 00001
  • JQuery判断数组中是否包含某个元素

    inArray 34 元素字符串 34 数组名称 var arry 61 34 C 34 34 html 34 34 css 34 34 JavaScript 34 var result 61 inArray 34 C 34 arry 如果
  • JSP获得当前时间并显示

    lt 64 page import 61 34 java text SimpleDateFormat 34 gt lt 64 page import 61 34 java util 34 gt lt 64 page language 61
  • js 判断字符串是否包含另外一个字符串

    lt script type 61 34 text javascript 34 gt var str 61 34 测试一个字符串 ehtrzes 是否包含另外一个字符串 34 if str indexOf 34 ehtrzes 34 gt
  • js判断函数是否存在、判断是否为函数

    lt script type 61 34 text javascript 34 gt 判断是否为函数 try if typeof FunName 61 61 61 34 function 34 是函数 其中 FunName 为函数名称 al
  • python中的类和对象,属性和方法

    一 面向对象的概述 面向对象是一种描述业务问题 设计业务实体和实体之间关系的方法 二 类和对象 1 类和对象得区别 xff1a 类是对客观世界中事物得抽象 xff0c 而对象是类实例化后的实体 例如 xff1a 汽车模型就是一个类 xff0
  • 什么是“约瑟夫环”

    今天遇到一个关于 约瑟夫环 的问题 xff0c 于是上网查了下什么是 约瑟夫环 出自百度 xff1a 约瑟夫问题 xff08 有时也称为约瑟夫斯置换 xff0c 是一个出现在计算机科学和数学中的问题 在计算机编程的算法中 xff0c 类似问
  • 使用Fontcreator字体制作软件及字体设计学习

    fontcreator对于字体修改爱好者而言是一款极好的文字编辑工具 xff0c 门槛要求低 专业性强 集设计和修改为一体 xff0c 可用来制作 编辑 修改ttf xff0c otf xff0c ttc格式的字体文件 xff0c 非常的实
  • 远程连接centos 7 图形化桌面

    使用xrdp工具 xff0c 类似windows系统的远程桌面 xff08 rdp xff09 xff0c 需要在服务端安装远程桌面服务 如果你的服务器可以使用阿里的yum源 xff0c 可以直接使用epel仓库安装 xff0c 执行以下命
  • selinux - Android编写sepolicy

    为service编写sepolicy 由init启动的service服务要在各自的selinux domain中运行 具体flow如下 init devices rc中声明service xff0c 将在init时启动 xff1a Note
  • Spring Boot结合easyExcel实现自增序号

    有些业务功能要求能导出序号 xff0c 现在提供两种实现方式 通过mysql查询实现 xff1b 实现RowWriteHandler接口 xff0c 自定义拦截器 xff1b 一 通过mysql查询实现 通过自定义变量实现每行数据 43 1
  • Spring Boot 实体里的List集合参数验证

    Spring Boot 实体里的List集合参数验证 Spring Boot 通过Hibernate Validator 加验证大家都知道 不知道的话可以参考这篇文章SpringBoot里参数校验 参数验证 今天讲一下Spring Boot
  • 树形结构工具类,如:菜单、部门等

    1 树节点 span class token keyword package span span class token namespace com span class token punctuation span zjson span
  • EasyPoiUtil导出工具

    span class token keyword package span span class token namespace com span class token punctuation span zjson span class