使用 POI创建一个简单的 Excel 文件

2023-10-27

初级程序员一枚,看到公司大佬写的生成Excel文件,做下记录,同时也分享给大家参考

  ·······································实现原理是用workBook 然后还有OutputStream

首先是一个ExcelDataBean 这个实体类 用来 声明 Excel的最大行数,最大列数 以及用来保存  所传入的 标题列 内容列 并且对它们做出校验。

import java.util.ArrayList;
import java.util.List;

/**
 * 使用 Excel007Util 工具类创建 Excel 2007 文件所需要的数据类.
 * 包含多个包含标题信息的头列表
 * 和多个内容行列表.
 * 超出 Excel 文件行列限制时会抛出异常, 不过没测试过这么大的数据.
 *
 * Created by gongsidalao on 17-5-10.
 */
public class ExcelDataBean {

    /**
     * 2007的是1048576行、16384列.
     */
    public static final int MAX_ROW_SIZE = 1048576;
    public static final int MAX_COL_SIZE = 16384;

    private List<List<?>> headerList;
    private List<List<?>> rowList;

    public List<List<?>> getHeaderList() {
        return headerList;
    }

    public List<List<?>> getRowList() {
        return rowList;
    }

    private ExcelDataBean(List<List<?>> headerList, List<List<?>> rowList) {
        this.headerList = headerList;
        this.rowList = rowList;
    }

    public static class Builder {
        private List<List<?>> headerList;
        private List<List<?>> rowList;

        public Builder() {
            headerList = new ArrayList<>();
            rowList = new ArrayList<>();
        }

        public Builder addHeaderList(List<?> header) {
            if (header.size() > MAX_COL_SIZE) {
                throw new RuntimeException("数据列超出 Excel 允许的最大值!");
            }
            if (headerList.size() + rowList.size() + 1 > MAX_ROW_SIZE) {
                throw new RuntimeException("数据行超出 Excel 允许的最大值!");
            }
            this.headerList.add(header);
            return this;
        }

        public Builder addRowList(List<?> row) {
            if (row.size() > MAX_COL_SIZE) {
                throw new RuntimeException("数据列超出 Excel 允许的最大值!");
            }
            if (headerList.size() + rowList.size() + 1 > MAX_ROW_SIZE) {
                throw new RuntimeException("数据行超出 Excel 允许的最大值!");
            }

            this.rowList.add(row);
            return this;
        }

        public ExcelDataBean build() {
            return new ExcelDataBean(headerList, rowList);
        }
    }
}
 然后下面就是一个工具类了 ,用于生成行row 生成单元格cell然后数据填充

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.IOException;
import java.io.OutputStream;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.IntStream;

/**
 * 使用 POI 创建一个简单的 Excel 文件
 * Created by gongsidalao on 17-5-10.
 */
public class Excel2007Util {


    /**
     *
     * @param excelDataBean
     * @param outputStream
     * @throws IOException
     */
    public static void createExcel(final ExcelDataBean excelDataBean,
                                   final OutputStream outputStream) throws IOException {

        //创建工作簿对象用于创建Sheet
        final Workbook workbook = new XSSFWorkbook();
        //创建一个Sheet(纸)对象也就是一个EXCEL
        final Sheet sheet = workbook.createSheet();
        //标题行数据List
        final List<List<?>> headerList = excelDataBean.getHeaderList();
        //根据标题列的大小创建几个带有标题行的Sheet
        IntStream.range(0, headerList.size())
                .forEach(i ->
                        createRow(i, 0, headerList, sheet ));
      //行偏移量用于创建数据行的时候 做行偏移处理 如果只有一个标题行的话可以写死为1
        final int rowOffset = headerList.size();
        final List<List<?>> rowList = excelDataBean.getRowList();

        IntStream.range(0, rowList.size())
                .forEach(i ->
                        createRow(i, rowOffset, rowList, sheet ));


        workbook.write(outputStream);

    }
    //创建行
    private static void createRow(final int index, final int rowOffset,
                                  final List<List<?>> rowList,
                                  final Sheet sheet) {
        List<?> data = rowList.get(index);
        if (Objects.nonNull(data) && !data.isEmpty()) {
            final Row row = sheet.createRow(index + rowOffset);
            IntStream.range(0, data.size())
                    .forEach(j ->
                        createCell(j, data, row));
        }
    }
   //创建单元格 并且填充data
    private static void createCell(final int index, final List<?> data, final Row row) {

        final Object obj = data.get(index);
        final Cell cell = row.createCell(index);
        if (obj == null) {
            cell.setCellValue("");
        } else if (Double.class.isInstance(obj)) {
            cell.setCellValue((double) obj);
        } else if (Date.class.isInstance(obj)) {
            Date date = (Date) obj;
            cell.setCellValue(LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toString());
        } else if (Calendar.class.isInstance(obj)) {
            cell.setCellValue((Calendar) obj);
        } else if (Boolean.class.isInstance(obj)) {
            cell.setCellValue((boolean) obj);
        } else {
            final CreationHelper createHelper = row.getSheet().getWorkbook().getCreationHelper();
            cell.setCellValue(createHelper.createRichTextString(obj.toString()));
        }
    }
}
  附上一个测试类以便测试

import org.junit.Test;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;

/**
 * Created by gongsidalao on 17-5-11.
 */
public class Excel2007UtilTest {


    @Test
    public void TestUtil() {

        List<String> header = Arrays.asList("姓名", "年龄", "生日", "记录创建时间", "婚否", "备注");

        List<Object> list1 = new ArrayList<>();
        list1.add("AA");
        list1.add(18);
        list1.add(Calendar.getInstance());
        list1.add(new Date());
        list1.add(true);
        list1.add(null);

        List<Object> list2 = new ArrayList<>();
        list2.add("BB");
        list2.add(18);
        list2.add(Calendar.getInstance());
        list2.add(new Date());
        list2.add(true);
        list2.add(null);
        System.out.println(list1.get(0));
        String url = "L:/ceshi.xlsx";
        try (OutputStream outputStream = new FileOutputStream(url)) {
            ExcelDataBean excelDataBean = new ExcelDataBean.Builder()
                    .addHeaderList(header)
//                  .addHeaderList(header)
                    .addRowList(list1)
                    .addRowList(list2)
                    .build();

            Excel2007Util.createExcel(excelDataBean, outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
  有什么不足的还望大家指出来,高手轻喷,做个日常记录以便学习.

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

使用 POI创建一个简单的 Excel 文件 的相关文章

  • MS Access 中的舍入

    VBA Access 中舍入的最佳方法是什么 我目前的方法是利用Excel方法 Excel WorksheetFunction Round 但我正在寻找一种不依赖Excel的方法 请注意 VBA Round 函数使用 Banker 舍入 将
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 选择在 Excel 宏(VBA 中的范围对象)中具有值的列

    如何修改 VBA 中的这一行以仅选择具有值的列 Set rng Range A1 Range A65536 End xlUp SpecialCells xlCellTypeVisible 我不认为我做的事情是正确的CountLarge财产是
  • 在 VBA 中按键对字典进行排序

    我使用 VBA 创建了一个字典CreateObject Scripting Dictionary 将源单词映射到要在某些文本中替换的目标单词 这实际上是为了混淆 不幸的是 当我按照下面的代码进行实际替换时 它将按照源单词添加到字典中的顺序替
  • 使用 VBA 通过简单命令从非连续范围的并集获取值到数组中(无循环)

    我有以下任务 表面上很简单 使用 VBA 将电子表格上多个列的值复制到二维数组中 为了让生活更有趣 这些柱子并不相邻 但它们的长度都相同 显然 可以通过依次循环每个元素来做到这一点 但这看起来非常不优雅 我希望有一个更紧凑的解决方案 但我很
  • For...VBA 中的下一个循环超出限制

    我正在使用一个For Next循环填充数组 如下所示 ReDim array 1 to 100 1 to 100 For i 1 to 100 Next i But the i计数器似乎总是转到 101 而不是停止在 100 因此 这会在我
  • 查找并替换目录中所有 Excel 文件工作簿中的字符串

    我正在编写 VBA 代码来替换位于特定目录中的多个 Excel 文件 工作簿 中的特定字符串 我尝试在 Stack Overflow 上搜索 找到答案 但这与通过 Excel 中的宏替换文本文件中的字符串有关 相同的链接是查找并替换文件中的
  • 使用 pythoncom 在 Python 进程之间编组 COM 对象

    我希望有人可以帮助我从 Python 进行编组跨进程调用到 Excel 我有一个通过 Python 启动的 Excel 会话 我知道当需要从单独的 Python 进程访问它时 该会话将会启动并运行 我已经使用编组让一切按预期工作CoMars
  • 在组合框中显示可见工作表

    您好 我有以下代码来在组合框中显示工作表 创建工作表后 工作表会自动添加到列表中 我不希望隐藏的工作表在保管箱中可见 我怎么做 Option Explicit Private Sub ComboBox1 Change If ComboBox
  • 定义 js-xlsx 单元格范围

    我正在尝试使用 js xlsx 读取 Excel 值 我可以使用以下代码从工作簿工作表中获取单元格值 if typeof require undefined XLSX require xlsx var workbook XLSX readF
  • 在 VBA Excel 中查找、剪切和插入行以匹配借项和贷项值

    我在 Sheet1 中有以下设置数据 并从第 4 行 A 列开始 其中标题位于第 3 行 No Date Code Name Remarks D e b i t Cr e d i t 1 4 30 2015 004 AB 01 04 15
  • 使用 MID、LEN 和 FIND 函数提取单元格文本的某些部分?

    我有一份 Excel 作业 但我陷入了最后部分 我被要求使用 MID LEN 和 FIND 来提取单元格内的特定字符串 我非常了解每个人的工作方式 将这三者结合起来并让它们发挥作用是我遇到的问题 我需要将城市与地址的其余部分分开 然后将其显
  • 在 Node.js 中解析 Json(带有数组和对象)并将数据导出到 Excel 文件中

    我是 Node js 新手 我的要求是 我需要解析 JSON 并将数据导出到 Excel 文件中 其中包含 JSON 中的所有字段 我的 JSON 如下 id 1255 title The Brain and Nervous System
  • 所以,我有 6 个“主”文件,然后分为 40 个单独的文件

    我将简要描述我想要的内容 我有 6 个 主 文件 每个文件包含 40 个工作表 如下所示 AG 工作簿有 HR Gp 1 到 HR Gp 40 ER 工作簿有 FB Gp 1 到 Gp 40 等 所有工作表都已 平坦 我已经成功创建了一个适
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • Excel 2013 数据透视表不会更改当前页面,除非手动导航到

    我们有一小段 VBA 代码 多年来一直完美运行 本质上是 Me PivotTables APivot PivotFields AField CurrentPage Some text 这种方法一直有效 直到 Excel 2013 该行将失败
  • Powershell - 在不安装 Excel 的情况下将 CSV 转换为 XLS

    我有一台自动生成报告的服务器 报告采用 CSV 格式 我需要能够直接加密文件 无需第三方压缩 无 WinZIP 或 WinRAR 我认为最好的想法是将 CSV 转换为 XLS 然后通过 Powershell 密码保护 XLS 文件 不幸的是
  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • 如果 Excel 中的表格包含单元格引用,如何对其进行排序?

    我在工作表 1 中有一个 Excel 数据表 它引用了许多其他工作表中的各种不同单元格 当我尝试对工作表进行排序或过滤时 引用会随着单元格的移动而发生变化 但是 我不想手动进入每个单元格并在各处插入 符号 因为有些引用是连续的 我可能想稍后
  • Excel 2010 在 IF 函数中搜索文本 - 单独的单元格数据

    Program Excel 2010 Require 一种将名字 姓氏 电子邮件提取到各个单元格的方法 Data 我的数据有一个包含原始 脏数据 的表 它是原始的并且一团糟 我用一个简单的方法整理它 IF A7 Order 1 然后其余单元

随机推荐

  • 服务器虚拟化 —— 集群服务器 —— 分布式 —— 云服务

    一 服务器虚拟化技术 是下面集群服务器 云服务的技术基石 将服务器的物理资源抽象成逻辑资源 让一台服务器变成几台甚至上百台 很少见啊 相互隔离的虚拟服务器 我们不再受限于物理上的界限 而是让CPU 内存 磁盘 I O等硬件变成可以动态管理的
  • 顺序表,你真的知道吗[SQL]

    好看的目录 前言 一 顺序表是什么 概念及结构 二 顺序表的实现 顺序表的缺点 几道练手题 总结 前言 线性表是n个具有相同特性的数据元素的有限序列 线性表是一种在实际中广泛使用的数据结构 常见的线性表 顺序表 链表 栈 队列 字符串 线性
  • 实现弧形切角两种方式

    1 css 的 radial gradient
  • springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透

    文章目录 前言 1 本地环境搭建 1 1 环境参数 1 2 搭建springboot服务项目 2 内网穿透 2 1 安装配置cpolar内网穿透 2 1 1 windows系统 2 1 2 linux系统 2 2 创建隧道映射本地端口 2
  • C语言版通讯录操作系统

    通讯录操作系统 目录 通讯录操作系统 一 通讯录的简介 三 各部分代码实现 1 首先在主函数中编写项目的整体框架 2 优化菜单界面 menu函数 3 封装属性 4 创建通讯录的结构变量 在main函数中 5 函数声明 头文件中实现 6 函数
  • Effective C++学习笔记——宁以传引用替换传值

    目录 一 传值效率可能会很低 二 传值可能发生割裂问题 三 适用于传值的情况和注意事项 相关博客 C 引用知识归纳 一 传值效率可能会很低 我们假设有这样两个类 class Human public string name string s
  • ajax中包含哪些技术,AJAX是什么?都包含那些技术?

    AJAX全称为 Asynchronous JavaScript and XML 异步JavaScript和XML 是指一种创建交互式网页应用的网页开发技术 主要包含了以下几种技术 Ajax Asynchronous JavaScript X
  • Apinto 网关: Go语言实现 HTTP 转 gRPC

    gRPC 是由 Google 开发的一个高性能 通用的开源RPC框架 主要面向移动应用开发且基于 HTTP 2 协议标准而设计 同时支持大多数流行的编程语言 gRPC 基于 HTTP 2 协议传输 HTTP 2 相比 HTTP1 x有以下优
  • 麦克风阵列原理

    1 麦克风阵列 麦克风阵列 是一组位于空间不同位置的全向麦克风按一定的形状规则布置形成的阵列 是对空间传播声音信号进行空间采样的一种装置 采集到的信号包含了其空间位置信息 根据声源和麦克风阵列之间距离的远近 可将阵列分为近场模型和远场模型
  • 【平衡车】TB6612+编码器电机的使用

    一 编码器电机的使用 1 电线 电机 用于控制电机正 反转 2 编码器5V GND 使编码器工作 3 编码器A B相 连接在单片机 用于反馈电机运动状态 用于输出角度 速度数据 stm32的定时器有具备输入捕获功能 从而读取脉冲 获得速度值
  • selenium对元素进行操作(二):点击&输入

    1分钟了解一个测开小知识 selenium对元素进行操作 二 其他常规操作 鼠标单击 click 在定位的元素后 使用增加 click 即对该元素进行点击操作 例如 driver find element by Xpath id s xma
  • 启用已签名的 kubelet 服务证书

    默认情况下 kubeadm 所部署的 kubelet 服务证书是自签名 Self Signed 这意味着从 metrics server 这类外部服务发起向 kubelet 的链接时无法使用 TLS 来完成保护 要在新的 kubeadm 集
  • Window查看apache的版本

    我使用的是xampp进入shell命令界面的 1 点击shell 进入 2 直接输入命令 httpd v 就可以看到你电脑平时使用的Apache版本了
  • 在线Qt查看源码网站

    Woboq Code Browser Explore C code on the web
  • Tomcat Manager 账号密码设置

    Windows版本 下载https tomcat apache org 我选择Tomcat9 可以查看包信息 详细信息介绍 所以Windows版本下载 我这里先下载了9 0 37 所以没有下载 解压以后 启动bin startup bat
  • 3-排序算法

    冒泡排序 冒泡排序的思路是将每两个数据之间进行大小比对 将大的数据后移 反复比对移动数据 直至数组排列整齐 include
  • Vosviewer+Pajek实现知网社交网络(解决中文乱码问题)

    Vosviewer Pajek实现知网社交网络 一 软件准备 Vosviewer安装 下载地址https www vosviewer com download 安装JDKhttps www oracle com java technolog
  • Python+Selenium_UI自动化操作(3)——刷新页面

    UI自动化 刷新页面 语法 refresh class TestRefreshWeb unittest TestCase def setUp self setUp是一个初始化方法 为test案例做数据准备 当前方法的数据准备动作是 启动ch
  • MQTT通讯协议简介和测试 [MQTT.fx]

    一 介绍 1 MQTT简介 MQTT Message Queuing Telemetry Transport 消息队列遥测传输 是IBM开发的一个即时通讯协议 有可能成为物联网的重要组成部分 该协议支持所有平台 几乎可以把所有联网物品和外部
  • 使用 POI创建一个简单的 Excel 文件

    初级程序员一枚 看到公司大佬写的生成Excel文件 做下记录 同时也分享给大家参考 实现原理是用workBook 然后还有OutputStream 首先是一个ExcelDataBean 这个实体类 用来 声明 Excel的最大行数 最大列数