Java处理Excel

2023-11-02

1 引言

Excel是我们平时工作中比较常用的用于存储二维表数据的。Java中有两种常用的方法操作Excel:jxl和poi。
其中,在小数据量时jxl快于poi,在大数据量时poi要快于jxl。但差距都不明显。
本文使用poi进行处理Excel

2 POI的maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.9</version>
</dependency>	

<dependency>
	<groupId>com.github.pjfanning</groupId>
	<artifactId>excel-streaming-reader</artifactId>
	<version>4.0.5</version>
</dependency>
<!--        <dependency>-->
<!--            <groupId>com.monitorjbl</groupId>-->
<!--            <artifactId>xlsx-streamer</artifactId>-->
<!--            <version>2.2.0</version>-->
<!--        </dependency>-->

3 创建Excel

// 创建Excel到指定文件
public static void createExcel(String fileName) throws IOException {
   /**
    * 注意这只是07版本以前的做法对应的excel文件的后缀名为.xls
    * 07版本和07版本以后的做法excel文件的后缀名为.xlsx,并且
    * 使用
    *  XSSFWorkbook workbook = new XSSFWorkbook();
    *  来操作excel
    */
   //创建新工作簿
   Workbook workbook = new HSSFWorkbook();
   //新建工作表
   Sheet sheet = workbook.createSheet("pwx");
   //创建行,行号作为参数传递给createRow()方法,第一行从0开始计算
   Row row = sheet.createRow(0);
   //创建单元格,row已经确定了行号,列号作为参数传递给createCell(),第一列从0开始计算
   Cell cell = row.createCell(2);
   //设置单元格的值,即C1的值(第一行,第三列)
   cell.setCellValue("pwx");
   //输出到磁盘中
   FileOutputStream fos = new FileOutputStream(new File(fileName));
   workbook.write(fos);
   fos.close();
}

4 解析Excel

// 解析指定文件中的Excel表格
public static void parseExcel(String fileName) throws IOException {
    //创建输入流
    FileInputStream fis = new FileInputStream(new File(fileName));
    //通过构造函数传参
    Workbook workbook = new HSSFWorkbook(fis);
    //获取工作表
    Sheet sheet = workbook.getSheetAt(0);
    //获取行,行号作为参数传递给getRow方法,第一行从0开始计算
    Row row = sheet.getRow(0);
    //获取单元格,row已经确定了行号,列号作为参数传递给getCell,第一列从0开始计算
    Cell cell = row.getCell(2);
    //设置单元格的值,即C1的值(第一行,第三列)
    String cellValue = cell.getStringCellValue();
    System.out.println("第一行第三列的值是: " + cellValue);
    fis.close();
}

注意:由于HSSFWorkbook只能操作excel2003一下版本,XSSFWorkbook只能操作excel2007以上版本,所以利用Workbook接口创建对应的对象操作excel来处理兼容性

二、大文件处理

1、创建

public static void createExcel(String fileName) throws IOException, IOException {
    //创建新工作簿
    Workbook workbook = new SXSSFWorkbook(1000);
    //新建工作表
    Sheet sheet = workbook.createSheet("pwx00");

    Row row;
    Cell cell;
    for (int i = 0; i < 1048575; i++) {
        row = sheet.createRow(i);
        for (int j = 0; j < 30; j++) {
            cell = row.createCell(j);
            cell.setCellValue(i + "_" + j);
        }
    }

    FileOutputStream fos = new FileOutputStream(fileName);
    workbook.write(fos);
    fos.close();
}

2.2 读取

public static void readExcel(String fileName) throws FileNotFoundException {
   InputStream is = new FileInputStream(fileName);

   Workbook workbook = StreamingReader.builder()
           .rowCacheSize(1000)    // 缓存到内存中的行数(默认是10)
           .bufferSize(1024 * 8)     // 读取资源时,缓存到内存的字节大小(默认是1024)
           .open(is);


   for (Sheet sheet : workbook) {
       System.out.println(sheet.getSheetName());
       for (Row r : sheet) {
           for (Cell c : r) {
               System.out.println(c.getStringCellValue());
           }
       }
   }
}

2.3 复制

import com.github.pjfanning.xlsx.StreamingReader;
import com.github.pjfanning.xlsx.impl.XlsxHyperlink;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellUtil;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.InputStream;

public class CopyToSXSSFUtil {
    public static SXSSFWorkbook copyToSXSSF(final InputStream inputStream) throws Exception {
        SXSSFWorkbook sxssfWorkbook = new SXSSFWorkbook();

        try (Workbook wbInput = StreamingReader.builder().setReadHyperlinks(true).open(inputStream)) {
            //note that StreamingReader.builder().setReadHyperlinks(true) and that cellCopyPolicy.setCopyHyperlink(false)
            //the hyperlinks appear at end of sheet, so we need to iterate them separately at the end
            final CellCopyPolicy cellCopyPolicy = new CellCopyPolicy();
            cellCopyPolicy.setCopyHyperlink(true);
            cellCopyPolicy.setCopyCellStyle(true);

            final CellCopyContext cellCopyContext = new CellCopyContext();

            for (Sheet sheetInput : wbInput) {
                SXSSFSheet sheetOutput = sxssfWorkbook.createSheet(sheetInput.getSheetName());
                for (Row rowInput : sheetInput) {
                    SXSSFRow rowOutput = sheetOutput.createRow(rowInput.getRowNum());
                    for (Cell cellInput : rowInput) {
                        SXSSFCell cellOutput = rowOutput.createCell(cellInput.getColumnIndex());
                        CellUtil.copyCell(cellInput, cellOutput, cellCopyPolicy, cellCopyContext);
                    }
                }
                //this loop only works with POI 5.2.3
                for (Hyperlink hyperlink : sheetInput.getHyperlinkList()) {
                    sheetOutput.addHyperlink(((XlsxHyperlink) hyperlink).createXSSFHyperlink());
                }
                //POI versions before 5.2.3: you need XSSFSheet instance
        /*
        XSSFSheet xssfSheet = sxssfWorkbook.getXSSFWorkbook().getSheet(sheetInput.getSheetName());
        for (Hyperlink hyperlink : sheetInput.getHyperlinkList()) {
          xssfSheet.addHyperlink(((XlsxHyperlink)hyperlink).createXSSFHyperlink());
        }
        */
            }
        } catch (Exception e) {
            sxssfWorkbook.dispose();
            throw e;
        }
        return sxssfWorkbook;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java处理Excel 的相关文章

随机推荐

  • pycharm remote 远程项目 同步 本地_工具篇-vscode sftp代码同步

    之前有一篇写过pycharm远程访问服务器 这里还写vscode的一个类似功能理由有两个 vscode相比于pycharm占用的内存要小 vscode远程访问不要钱 而pycharm必须要付费的专业版才拥有这个功能 但是vscode也有不好
  • WPF界面设计—撸大师

    WPF界面设计 模仿了金山卫士 360 鲁大师的界面
  • keepalived 笔记

    keepalived可以认为是VRRP协议在Linux上的实现 主要有三个模块 分别是core check和vrrp core模块为keepalived的核心 负责主进程的启动 维护以及全局配置文件的加载和解析 check负责健康检查 包括
  • STM32CubeMX系列教程

    微雪课堂 STM32CubeMX系列教程 https www waveshare net study portal php mod list catid 40 page 1
  • 如何保护自己知识产权,建立代码护城河——建立自己的静态库,x86和arm平台的实例讲解

    前言 1 想象一下 假如我们幸幸苦苦写了一个封装库代码 为了建立护城河 我们企业不愿意把真实的代码提供给用户 怕客户拿了代码 这个合同结束 稍微改一点点 就盗用我们的技术 然后说全自主创新 那真是有苦说不出啊 2 但是呢 你不把自己的代码给
  • 2023华为OD机试真题【分苹果/位运算】

    题目内容 A B两个人把苹果分为两堆 A希望按照他的计算规则等分苹果 他的计算规则是按照二进制加法计算 并且不计算进位 12 5 9 1100 0101 9 B的计算规则是十进制加法 包括正常进位 B希望在满足A的情况下获取苹果重量最多 输
  • 信号调理方式(放大、滤波、隔离、调制解调等)

    0 信号调理 百度百科 信号调理简单的说就是指将敏感元件检测到的各种信号转换为标准信号 数字量输入通道中的信号调理主要包括消抖 滤波 保护 电平转换 隔离等 1 一 目 的 将敏感元件检测到的各种信号转换为标准信号 二 方 式 放大电路 滤
  • gdb调试步骤

    gdb调试 Gdb调试过程 1 程序经过预处理后 即进入编译阶段 进入编译阶段 首先声明编译 2 格式 gdb o test test c g 3 进入编译 gdb test 4 显示需要编译调试的源程序 l list list filen
  • Python 基于openpyxl的表格数据处理 举例为统计身高数据

    基于openpyxl的表格数据处理 注意事项 将data html文件放到py文件同级目录下使用相对路径 或使用绝对路径 data xlsx群里有 没找到可以私聊我 注意事项 如果不确定自己的操作是否影响源数据 请在代码最后保存语句中换成其
  • 大数据基础——Linux常用命令

    一个优秀的操作系统 Linux Linux 内核最初只是由芬兰人林纳斯 托瓦兹 Linus Torvalds 在赫尔辛基大学上学时出于个人爱好而编写的 Linux 是一套免费使用和自由传播的类 Unix 操作系统 是一个基于 POSIX 和
  • 初级JS

    JS中实现一个简单日历
  • 贴片电容介质X5R与X7R之间的区别

    X5R X7R类介质贴片电容是在工业中广泛使用的一种温度稳定型电容器 属于II类介质材料 具有中等介电常数 在使用温度 55 125 85 范围内容值变化率在 15 以内 容值老化率为1 说了这么多都是几乎相同的材料 那么这两种材料的不同到
  • 解决nodejs中json序列化时Date类型默认为UTC格式的问题

    在nodejs中 json序列化时Date类型时 默认转为UTC格式 如下图 zhupengfei DESKTOP HJASOE3 MINGW64 d MyProject exp2 node gt new Date 2018 04 24T1
  • Vue3 :Pinia入门

    Vue3 Pinia入门 Date May 11 2023 Sum Pinia概念 实现counter getters 异步action storeToRefs保持响应式解构 什么是Pinia Pinia 是 Vue 的专属状态管理库 可以
  • 什么是第二人称,第二人称在游戏的表现

    油管up Nick Robinson 做过介绍 第一人是玩家角色自身 第二人是游戏内的其他角色 第三人是独立于游戏的观察者 所以说 第一人称视角来自玩家角色自身 玩家看到视角的和现实的视角一致 第三人称视角来自一个独立于游戏世界的第三方观察
  • Doris之rollup上卷及物化视图

    Rollup上卷 通过建表语句创建出来的表称为 Base 表 Base Table 基表 在 Base 表之上 我们可以创建任意多个 ROLLUP 表 这些 ROLLUP 的数据是基于 Base 表产生的 并且在物理上是独立存储的 Roll
  • Redhat Enterprise Linux 9安装配置图解教程

    2022 年 5 月 18 日 IBM 收购的红帽公司宣布推出红帽企业 Linux 9 RHEL 9 这是世界领先的企业 Linux 平台的最新版本 RHEL 9 为支持混合云创新提供了更灵活 更稳定的基础 并为跨物理 虚拟 私有和公共云和
  • workman 日志_workerman

    下载 手册参考 http doc3 workerman net 一 WorkerMan代码规范 1 类采用首字母大写的驼峰式命名 类文件名称必须与文件内部类名相同 以便自动加载 2 使用命名空间 命名空间名字与目录路径对应 并以开发者的项目
  • Java架构直通车——Redis的PF实现原理:HyperLogLog

    文章目录 引入 什么是基数统计 基数统计的常用方法 HyperLogLog原理 再近一步 分桶平均 更近一步 真实的HyperLogLog 引入 之前的文章Java架构直通车 点赞功能用Mysql还是Redis 一文中 我们介绍了分别从my
  • Java处理Excel

    1 引言 Excel是我们平时工作中比较常用的用于存储二维表数据的 Java中有两种常用的方法操作Excel jxl和poi 其中 在小数据量时jxl快于poi 在大数据量时poi要快于jxl 但差距都不明显 本文使用poi进行处理Exce