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

news/2024/11/25 0:29:43/

本文是  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 第一行为0int 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);// 获取sheetXSSFSheet 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.ppmy.cn/news/138185.html

相关文章

vue3 vite 引入路由后代码报红解决方法

如图&#xff1a;正常引入页面路由&#xff0c;路径也是正确的&#xff0c;但是路径有报红。 原因是&#xff1a;当前指明路径正则有问题的文件是 解决方法&#xff1a; "src/**/*.ts"

地理百科程序

五一期间&#xff0c;我们地理老师让我们做一个地理作业&#xff0c;我就想起了我的编程才能做了一个&#xff0c;现在分享一下&#xff0c;上代码&#xff01;制作不易&#xff0c;求求您给个赞吧 #include <bits/stdc.h> #include <unistd.h> #include <cstd…

Leetcode 739. 每日温度

Leetcode 739. 每日温度题目 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替…

在Ubuntu上增加swap交换空间

一. 前言 Ubuntu默认分配的交互空间swap 为 2G 实际上在代码编译的过程中&#xff0c;如果你的CPU内存不超过16G的话&#xff0c;交换空间就有必要去设置更改一下。 二. 修改步骤 1. 进入根目录 cd / 选择自己想要定义的交换空间&#xff0c;比如8G大小。 2.创建一个8G的交换…

HP台式机设置Intel VT-x

由于要使用虚拟机。但是虚拟机报错。 找了一下没有找到。原来在这个地方&#xff1a;

HP bios F10

HP 288 pro G6商用台式机进入bios按F10无效&#xff0c;后发现是显示器需要连接显示卡接口&#xff0c;不能连接主板集成的显示卡接口。拨打HP官方客服竟然也没告知显示器连接会导致无法进入BIOS&#xff0c;而是要求拔掉硬盘数据线尝试下或更换键盘

HP/惠普远程重装正版win10 7笔记本电脑台式机系统安装升级win11暗影精灵光影精灵星战系类原厂镜像安装教程

系统来源于惠普镜像服务器&#xff0c;绝对原装的系统&#xff0c;安装好以后跟刚买电脑系统展开的时候是一样的。壁纸&#xff0c;预装正版软件&#xff0c;联机支持都有。 型号持续更新中&#xff0c;未列型号&#xff0c;联系作者&#xff01; 暗影精灵系列&#xff1a; 暗…

惠普台式机在Android studio创建模拟器报错“Enable VT-x in your Bios Security Settings”

随着惠普台式机新产品的出厂,由以前HP BIOS到现在的UEFI BIOS,部分选项有所更改,咨询如何开启虚拟化技术,BIOS设置方法如下 开机时不断点击F10键进入BIOS,选择Advanced&#xff08;高级&#xff09;然后选择System Options&#xff08;系统选项&#xff09;,点击回车 然后选择V…