apache poi 和EasyExcel 的使用

2023-05-16

文章目录

  • apache poi
    • 隐藏sheet做下拉列表
  • EasyExcel
    • 超链接跳转sheet页
    • 自定义类型转换
    • 隐藏sheet做下拉列表

apache poi

官方文档:https://poi.apache.org/components/spreadsheet/index.html

隐藏sheet做下拉列表

XSSFSheet hiddenSheet = (XSSFSheet) wb.createSheet(hiddenSheetName);
Row hidRow0 = hiddenSheet.createRow(0);
wb.setSheetHidden(wb.getSheetIndex(hiddenSheet), true);
// 添加名称管理器
Name name = wb.createName();
//官方实例说可以不要,不能用时放开
//String nname = "name" + IdUtil.nextIdStr();
//name.setNameName(nname);
String indexToStr = excelColIndexToStr(1 + hidColIndex);
String formula = hiddenSheetName + "!$" + indexToStr + "$2:$" + indexToStr + "$" + (fieldInfo.getKeyIds().size() + 1);
//name.setRefersToFormula(formula);

//创建数据验证助手
XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(reportNameSheet);
//创建公式列表约束
DataValidationConstraint dataValidationConstraint = dvHelper.createFormulaListConstraint(formula);

//应用下拉框的区域边界(行列范围)
CellRangeAddressList addressList = new CellRangeAddressList(2, 1000, repColIndex, repColIndex);
//下拉列表值验证
DataValidation dataValidation = dvHelper.createValidation(dataValidationConstraint, addressList);
dataValidation.setShowErrorBox(true);
dataValidation.setSuppressDropDownArrow(true);
dataValidation.createErrorBox("输入值有误", "请从下拉框选择");
reportNameSheet.addValidationData(dataValidation);
/**
 * 获取excel中的列标题
 *
 * @param columnIndex 列序号
 * @return
 * @author lijiewei
 * @date 2021/4/16 10:38
 */
private String excelColIndexToStr(int columnIndex) {
    if (columnIndex <= 0) {
        return null;
    }
    String columnStr = "";
    columnIndex--;
    do {
        if (columnStr.length() > 0) {
            columnIndex--;
        }
        columnStr = ((char) (columnIndex % 26 + (int) 'A')) + columnStr;
        columnIndex = ((columnIndex - columnIndex % 26) / 26);
    } while (columnIndex > 0);
    return columnStr;
}

EasyExcel

官方文档:https://www.yuque.com/easyexcel/doc/read

超链接跳转sheet页

注册writeHandler写处理器

EasyExcel.writerSheet(0,"清单").registerWriteHandler(new InventoryCellWriteHandler()).head(Inventory.class).registerConverter(new LocalDateTimeConverter()).build();

InventoryCellWriteHandler 处理单元格,添加超链接

public class InventoryCellWriteHandler implements CellWriteHandler {
	...
	
	//在单元上的所有操作完成后调用
	@Override
	public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
	    // 对“校验对象中文名称”列加超链接,跳转到对应sheet页
	    if (!isHead && cell.getColumnIndex() == 0) {
	        CreationHelper createHelper = writeSheetHolder.getSheet().getWorkbook().getCreationHelper();
	        Hyperlink hyperlink = createHelper.createHyperlink(HyperlinkType.DOCUMENT);
	        int index = cell.getRowIndex() - 1;
	        String cellValue = cell.getStringCellValue();
	        //设置超链接,有下划线_,所以加'
	        hyperlink.setAddress("#'"+index+"_"+cellValue+"'!A1");
	        cell.setHyperlink(hyperlink);
	
	        //设置连接样式
	        Workbook workbook = writeSheetHolder.getParentWriteWorkbookHolder().getWorkbook();
	        CellStyle cellStyle = workbook.createCellStyle();
	        XSSFFont font = (XSSFFont) workbook.createFont();
	        font.setColor(new XSSFColor(new java.awt.Color(0, 0, 204)));
	        cellStyle.setFont(font);
	        cell.setCellStyle(cellStyle);
	    }
	}
}


自定义类型转换

EasyExcel.writerSheet(0,"清单").registerWriteHandler(new InventoryCellWriteHandler()).head(Inventory.class).registerConverter(new LocalDateTimeConverter()).build();

LocalDateTimeConverter 自定义的类型转换

public class LocalDateTimeConverter implements Converter<LocalDateTime> {
    @Override
    public Class supportJavaTypeKey() {
        return LocalDateTime.class;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return CellDataTypeEnum.STRING;
    }

    @Override
    public LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty contentProperty,
                                  GlobalConfiguration globalConfiguration) throws ParseException {
        if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
            return LocalDateTime.parse(cellData.getStringValue(),DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        } else {
            return LocalDateTime.parse(cellData.getStringValue(),
                    DateTimeFormatter.ofPattern(contentProperty.getDateTimeFormatProperty().getFormat()));
        }
    }

    @Override
    public CellData convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty,
                                       GlobalConfiguration globalConfiguration) {
        if (contentProperty == null || contentProperty.getDateTimeFormatProperty() == null) {
            return new CellData(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(value));
        } else {
            return new CellData(DateTimeFormatter.ofPattern(contentProperty.getDateTimeFormatProperty().getFormat()).format(value));
        }
    }
}

隐藏sheet做下拉列表

 //创建数据验证助手
DataValidationHelper helper = sheet.getDataValidationHelper();
String columnName = toExcelColumn(columnIndex);
//创建公式列表约束
DataValidationConstraint constraint = helper.createFormulaListConstraint(SHEETNAME_HIDDEN_DROPDOWN + "!$" + columnName + "$1:$" + columnName + "$" + values.length);
//应用下拉框的区域边界(行列范围)
CellRangeAddressList regions = new CellRangeAddressList(startRow, endRow, startColumn, endColumn);
DataValidation dataValidation = helper.createValidation(constraint, regions);
//设置验证错误显示
dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);
dataValidation.setShowErrorBox(false);
dataValidation.setSuppressDropDownArrow(true);
sheet.addValidationData(dataValidation);
//获取excel中的列标题
String toExcelColumn(int columnIndex) {
   String left = "";
   if (columnIndex >= 26) {
       left = toExcelColumn(columnIndex / 26 - 1);
   }
   columnIndex %= 26;
   return left + (char) (columnIndex + 65);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

apache poi 和EasyExcel 的使用 的相关文章

  • 一个文件夹中的多个 htaccess 文件,还是条件 AuthType Basic?

    我在本地服务器和实时服务器上使用相同的 htaccess 文件 并希望在测试服务器上使用相同的文件 以使代码管理更容易 目前 虽然我必须有一个不同的文件 因为我的测试服务器具有 htaccess 密码访问权限 AuthType Basic
  • 无法将 Laravel 应用程序部署到 EC2

    我的 Laravel 项目全部在我的本地主机上运行 我将其部署到 EC2 但没有任何反应 我在开发控制台中看到的只是内部错误 500 我缺少什么 在部署到 AWS 之前我需要更改哪些内容 这是网址 http ec2 52 88 99 75
  • 将子域重定向到 CakePHP 操作

    背景 我有一个 CakePHP 应用程序 位于 m 我想写一个根级别的 htaccess文件 它将重定向网站的 子域 作为操作的参数 例如 我想编写一个重写规则 这将导致像这样的重定向 http mysite myserver com ht
  • 保存到服务器后,隐藏字符“\u0”添加到文件中

    我正在使用 Apache 服务器为 Web 开发网站提供服务 这样我就可以不断保存和编辑文件 我使用 Gulp for Sass 来连接和丑化 css 和 js 文件 一个月前 我的 js 和 css 文件遇到问题 似乎在文件下面添加了随机
  • PHP:如何访问根目录之外的下载文件夹? [复制]

    这个问题在这里已经有答案了 我如何创建一个 PHP 脚本 页面 允许会员 买家下载存储在根目录之外的下载文件夹中的压缩文件 产品 我正在使用 Apache 服务器 请帮忙 谢谢 保罗 G 您可能会在 soac 提供的链接中找到一些更好的信息
  • 请求标头与响应标头

    我正在尝试将图像缓存在网站上 该图像由 PHP 提供服务 其中我使用适当的值设置缓存控制的响应标头 但这不是缓存图像 我认为这可能与具有无缓存缓存控制的请求标头有关 标题如下 响应头 Access Control Allow Origin
  • 在 htaccess 文件中使用 RewriteMap

    如何在 htaccess 文件中使用 RewriteMap 指令 当我把它放在那里时 我收到 此处不允许 RewriteMap 错误 我知道当将其放入 httpd conf 或虚拟主机配置文件中时 此错误将会消失 但我想知道是否可以将其放入
  • PHP 强制 Apache 错误

    感谢这个论坛 我了解到 PHP header 函数实际上并不将 header 发送到 Apache 服务器 而只发送到客户端 我想要做的是生成错误 500 并让 Apache 显示其相应的页面 有办法强制吗 提前致谢 还有 Allez le
  • Apache mod_speling 不区分大小写的 URL 问题

    我想要使 用 Apache 的不区分大小写的 URLmod speling模块 但这会产生不需要的 多个选项 列表 而 Apache 文档说 设置后 该指令将拼写更正的操作限制为小写 大写更改 不执行其他可能的更正 我正在全新安装的 Apa
  • 将代码从 htaccess 重写为 nginx 配置?

    我在将 htaccess 文件中的重写代码实现到 nginx 配置中时遇到问题 我已经尝试过生成器 http winnginx com htaccess http winginx com htaccess用于生成我的重写 代码 我的ngin
  • 如何找到 httpd.conf 文件所在的位置?

    如何找到 apache PHP 上 httpd conf 文件的路径 我不知道我的脚本是否会在Windows apache或Linux中运行 我需要知道在哪里可以找到这个文件 以便从那里找到参数 谢谢 我认为它没有接触 PHP 跑步http
  • proc_open() 失败并显示“权限被拒绝”

    我正在尝试使用proc open 执行程序并打印结果 但是 我不断收到 许可被拒绝 的消息 已将脚本和可执行文件的 chmod 设置为 0777 但无济于事 ini get safe mode 是假的 可能出什么问题了 我正在使用 Cent
  • 使用 Java 的 Apache Http 摘要身份验证

    我目前正在开发一个 Java 项目 但无法使 http 摘要身份验证正常工作 我尝试使用 Apache 网站 但没有帮助 我有一个需要 HTTP 摘要身份验证的网站 DefaultHttpClient httpclient new Defa
  • 为什么我的 PHP 脚本无法对其创建的文件进行 chmod?

    我有一个 php 创建一个需要可执行的文件 它是一个需要由系统运行的批处理文件 由于某种原因 即使该文件归 apache 所有并且 php 作为 apache 运行 并且创建了该文件 该脚本还是在 chmod 行处终止 我需要进行哪些不同配
  • Capistrano 和 XSendFile 配置

    我正在尝试使用 Apache 2 2 Passenger 4 0 59 和 XSendFile 0 12 配置 Rails 生产服务器 应用程序通过 Capistrano 部署 部署的应用程序生成 可能很大 PDF Rails root t
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 从子目录文件夹中删除尾部斜杠 Apache 1.3.42 DirectorySlash Off .htaccess

    我正在尝试从 Apache 1 3 42 中的子目录文件夹中删除尾部斜杠 但是命令DirectorySlash Off当我尝试将规则添加到我的 Apache 版本时 不支持 htaccess file 目前我的链接行为如下 www exam
  • 让 Rails 生产在端口 80 上运行

    我正在尝试让我的 Rails 应用程序在生产模式下运行 但遇到了一些困难 我正在使用 Passenger 和 apache 并运行 Ubuntu 12 04 我已经配置和创建了生产数据库 并设置了乘客 状态如下 rvmsudo passen
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Apache 未发送 304 响应(如果启用了 mod_deflate 和 AddOutputFilterByType)

    我在 Apache httpd conf 中添加了以下行 AddOutputFilterByType DEFLATE text html text css application javascript application x javas

随机推荐

  • PyTorch入门二:LSTM实现MNIST手写数字识别

    参考博客 xff1a https blog csdn net winycg article details 88937583 LSTM Long Short Term Memory xff0c 长短时记忆网络 xff0c 主要用于传统RNN
  • Python之Networkx详解

    文章目录 1 安装Networkx2 Networkx的基本使用2 1 导入networkx2 2 创建Graph2 3 给Graph添加边2 3 Graph基本信息获取2 4 Graph的绘制2 5 Graph的其他内置算法 3 其他3
  • 基于gunicorn部署flask项目

    文章目录 1 WSGI协议2 gunicorn介绍3 gunicorn安装4 gunicorn使用4 1 基于Flask创建python服务4 2 配置参数 启动应用服务4 2 1 命令行配置gunicorn参数4 2 2 文件配置guni
  • Python日志记录库——loguru

    loguru简单且强大的日志记录库 https zhuanlan zhihu com p 446232870
  • 批量删除word中的换行符号

    在Word中 xff0c 回车符有两种 xff0c 即 硬回车 和 软回车 硬回车是直接敲键盘上的Enter键 xff0c 软回车是按键盘上的 Shift 43 Enter 硬回车 输入快捷键 xff1a Enter xff0c 作用 xf
  • 把字符串中的字符进行排序

    把字符串中的字符进行排序 xff1a 把字符串中的字符进行排序 toCharArray xff1a 把字符串转换为字符数组 valueOf xff1a 把字符数组转换为字符串 1 把字符串中的字符进行排序 举例 xff1a 34 dacge
  • 【Ubuntu切换内核版本】NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.

    文章目录 一 有图形界面二 无图形界面2 1 查看当前内核版本2 2 查看内核启动顺序2 3 切换内核 服务器信息 xff1a Ubuntu 18 04 服务器重新启动后 xff0c 内核可能被自动更新 xff0c 这就会造成开机后服务器有
  • 深入解析最短路径算法

    转载自 xff1a http blog csdn net fengchaokobe article details 7478774 第一节 问题的提出及解决方法 所谓最短路径问题 xff0c 可以说有两种情况来描述 描述一 xff1a 在图
  • 图像特征提取(颜色,纹理,形状)

    本文主要内容转载自博客 xff1a http blog csdn net abcjennifer article details 7424971 http blog csdn net abcjennifer article details
  • latex中公式过长问题的解决

    latex中公式过长通常有以下几个解决方案 xff1a xff08 1 xff09 使用amsmath package的split环境 begin equation begin split F 61 F x in F c amp S gt
  • LATEX使用 图文混排,文字环绕插图

    插入图片时 xff0c 使用如下命令 xff1a begin wrapfigure 行数 位置 超出长度 宽度 lt 图形 gt end wrapfigure 这里行数是指图形高度所占的文本行的数目 如果不给出此选项 xff0c wrapf
  • Linux解压文件到指定目录

    tar是Linux中常用的打包 压缩 加压缩工具 xff0c tar的参数很多 xff0c 这里仅仅列举常用的压缩与解压缩参数 tar的参数 xff1a c xff1a create 建立压缩档案的参数 x xff1a 解压缩压缩档案的参数
  • SpringBoot 项目在 kubernetes 集群中启动速度过慢

    问题描述 在实际开发过程中 将 springboot 项目打成 Docker 镜像部署在 kubernetes 集群中 并启动容器实例 打开日志 发现很久才能刷一条日志 并且项目启动超过 10 分钟 如下为服务 yaml span clas
  • 结构体和文件操作

    include lt stdio h gt define NUM 3 int main struct stu char name NUM int age int score int number stu Stu NUM stu p for
  • IOS:表视图

    表视图是在iOS应用中最常见到的用户接口对象 表视图将数据以多行可滑动列表的形式展现 xff0c 并且可以以章节的形式展示 表示图有很多目的 xff1a 让用户通过分等级的结构浏览数据 呈现一个带索引的列表 通过在视觉上清晰的分组来展示详细
  • iOS UIBezierPath贝塞尔曲线常用方法

    关于 UIBezierPath UIBezierPath这个类在UIKit中 xff0c 是Core Graphics框架关于path的一个封装 xff0c 使用此类可以定义简单的形状 xff0c 比如我们常用到 xff0c 矩形 xff0
  • c++ (优化)百钱买百鸡

    问题 百钱买百鸡问题 xff1a 公鸡五文钱一只 xff0c 母鸡三文钱一只 xff0c 小鸡三只一文钱 xff0c 用100文钱买100只鸡 xff0c 公鸡 母鸡 小鸡各买多少只 第一种方法 三层循环 xff08 穷举法 xff09 s
  • JPA的@Query用法

    文章目录 64 Query作用使用例子简单使用like表达式原生sql 传参方式SPEL表达式nativeQuery 作用更新操作删除操作 64 query返回自定义字段 64 query返回自定义对象 64 Query作用 64 Quer
  • @RequestParam和@RequestPart的区别

    64 RequestPart 64 RequestPart这个注解用在multipart form data表单提交请求的方法上 支持的请求方法的方式MultipartFile xff0c 属于Spring的MultipartResolve
  • apache poi 和EasyExcel 的使用

    文章目录 apache poi隐藏sheet做下拉列表 EasyExcel超链接跳转sheet页自定义类型转换隐藏sheet做下拉列表 apache poi 官方文档 xff1a https poi apache org component