Java处理Excel表格的读取和写入

2023-10-29


由于工作需要处理以下excel表格,所以学习了以下关于excel的两个库,这里记录下简单的读取和写入方法。处理xlsx文件使用的是java poi,处理csv文件使用的是opencsv。

一、处理xlsx文件:

首先导入依赖:

<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>

使用java poi 对excel进行无对象的读取和写入:

public class ExcelUtils {

    public static void main(String[] args) throws IOException {
        operationExcel("C:\\Users\\OYMN\\Desktop\\鸿荣翻译\\SDG1.csv", 
                       "C:\\Users\\OYMN\\Desktop\\鸿荣翻译\\newSDG1.csv");
    }

    public static void operationExcel(String sourcePath, String destPath) {
		
        FileOutputStream fos = null;
        try {
            Workbook workbook = new XSSFWorkbook(new FileInputStream(sourcePath));
            int sheetCount = workbook.getNumberOfSheets();  //获取sheet的数量

            Workbook newWorkbook = new XSSFWorkbook();
            for (int i = 0; i < sheetCount; i++) {
                operationExcel(workbook, newWorkbook, i);
            }

            fos = new FileOutputStream(destPath);
            
            //这里有个问题:只能一次性通过fos写入,而不能处理完一张sheet后write一次,否则运行没问题,但是excel打开显示损坏
            newWorkbook.write(fos);

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 
     * @param workbook   源workbook
     * @param newWorkbook  新的workbook
     * @param index  第几张sheet(从0开始计数)
     * @throws IOException
     */
    private static void operationExcel(Workbook workbook, Workbook newWorkbook, int index) 
        throws IOException {

        Sheet oldSheet = workbook.getSheetAt(index);
        Sheet newSheet = newWorkbook.createSheet(oldSheet.getSheetName());

        int rowNum = oldSheet.getPhysicalNumberOfRows();
        for (int i = 0; i < rowNum; i++) {
            Row oldRow = oldSheet.getRow(i);
            Row newRow = newSheet.createRow(i);
            for (int j = 0; j < oldRow.getPhysicalNumberOfCells(); j++) {
                //获取单元格
                Cell oldCell = oldRow.getCell(j);
                if (oldCell != null) {
                    
                    //这里可以加入自己的业务,对单元格进行处理,然后再后续写入到新的表格
                    
                    Cell newCell = newRow.createCell(j, oldCell.getCellType());
                    //数字
                    if (oldCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
                        newCell.setCellValue(oldCell.getNumericCellValue());
                    }
                    //字符串
                    else if (oldCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
                        newCell.setCellValue(oldCell.getStringCellValue());
                    }
                }
            }
        }
    }
}

二、处理csv文件:

由于java poi并没有支持对csv文件的处理,所以想要处理csv文件,就需要借助其他的库,这里选用opencsv,首先导入依赖:

<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.4</version>
</dependency>

简单读取和写入:

public static void operationCsv(String sourcePath, String destPath)  {
    CSVReader csvReader = null;
    CSVWriter csvWriter = null;
    try {
        //这里是为了处理中文乱码问题
        Writer writer = new FileWriter(destPath);
        writer.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));
        csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER, CSVWriter.NO_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END);

        //reader
        csvReader = new CSVReader(new FileReader(sourcePath));
        List<String[]> rows = csvReader.readAll();
        //每行再写入新表格
        for (String[] row : rows) {
            csvWriter.writeNext(row);
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            csvReader.close();
            csvWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java处理Excel表格的读取和写入 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 为什么HashMap不能保证map的顺序随着时间的推移保持不变

    我在这里阅读有关 Hashmap 和 Hashtable 之间的区别 http javarevisited blogspot sg 2010 10 difference Between hashmap and html http javar
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • QT控件之(TableView)中设置为不可编辑状态

    加入以下一句代码 ui gt tableView gt setEditTriggers QAbstractItemView NoEditTriggers
  • 【H.264/AVC视频编解码技术详解】二十三、帧间预测编码(1):帧间预测编码的基本原理

    H 264 AVC视频编解码技术详解 视频教程已经在 CSDN学院 上线 视频中详述了H 264的背景 标准协议和实现 并通过一个实战工程的形式对H 264的标准进行解析和实现 欢迎观看 纸上得来终觉浅 绝知此事要躬行 只有自己按照标准文档
  • STM32初始化USART后只发送了一个0x00,而无法发送其他数据的解决方法

    GPIO InitTypeDef GPIO InitStructure USART InitTypeDef USART InitStructure RCC APB2PeriphClockCmd RCC APB2Periph GPIOB EN
  • Tornado入门教程

    Overview FriendFeed是一款使用 Python 编写的 相对简单的 非阻塞式 Web 服务器 其应用程序使用的 Web 框架看起来有些像 web py 或者 Google 的 webapp 不过为了能有效利用非阻塞式服务器环
  • 【数据结构与算法】顺序表精讲

    所属专栏 数据结构与算法 前期内容 绪论1 抽象数据类型 绪论2 时间复杂度与空间复杂度 与时间复杂度相关的OJ面试题 抽象数据类型的实现 目录 1 1线性表的定义和特点 1 2案例引入 eg 图书信息管理系统 1 3线性表的类型定义 基本
  • code-server安装使用

    code server是一款基于VSCode的在线编辑器 它提供了一个web话的在线IDE 服务端上运行code server 可以理解为一个在远程服务器上运行的VS Code 客户端就可以使用浏览器打开vscode vscode上的资源都
  • 软件工程实训day01-mybatis

    本次实训环境 jdk 1 8 编辑器 eclipse 数据库 mysql SQLyog 实训所得结果 使用mybatis进行简单增删改查操作 代码上传gitee 创建数据库 DROP TABLE IF EXISTS computers CR
  • 非管理员用户添加右键菜单(管理员也适用)

    目录 背景 解决办法 总结 把其他教程中的HKEY CLASSES ROOT替换为HKEY CURRENT USER SOFTWARE Classes即可 背景 网上大多数教程添加右键菜单的方法都需要管理员权限 公司电脑处于信息安全角度 大
  • Jenkins自动化打包上传到Fir报Can not found mapping or dysm file in的解决方案

    在踩了几个坑以后 Jenkins自动打包终于成功了 就想着自动上传到Fir 自动生成二维码 便于下载安装 在网上找到了一个Fir插件 安装成功以后再次打包发现报Can not found mapping or dysm file in 在网
  • 使用JDK开发WebService-客户端建立

    一 序言 上篇 我已经写了一个简单的WebService服务器 看起来貌似不错 但我们真正的目的是想通过编程的方式来访问服务器 而不是通过eclipse带的Web Service浏览器来访问 服务器我们是一行行代码敲出来的 客户端同样我们也
  • vue 创建一个登录界面

    vue创建一个登录界面 1 创建登录界面和主页 2 配置路由 3 配置main js 4 配置App vue 5 登录页面 6 主页面 用到的组件 参考链接 1 创建登录界面和主页 打开搭建好的vue项目 在components文件夹下面新
  • 电信光猫改桥接模式

    如果只是改桥接 可以试试下面这两个地址 http 192 168 1 1 bridge route gchhttp 192 168 1 1 8080 bridge route gch 转载于 https www cnblogs com De
  • Java对象拷贝时根据枚举自动转换属性值

    问题描述 在copyProperties A B 拷贝对象时 需要将A type Integer 拷贝到B type String 但是A type是类型的数字编码 B type是类型的描述 通过给B type加一个注解指定枚举类 实现在拷
  • 全面认识二极管,一篇文章就够了

    电子设计基础元器件 二极管 小小二极管 大大用途 矜辰所致 目录 前言 一 二极管基础知识 1 1 什么是二极管 1 2 二极管的组成 1 3 二极管的原理 二 二极管特性 2 1 伏安特性曲线图 2 2 温度的影响 2 3 关于击穿 三
  • Flink大数据平台下的WordCount案例

    WordCount是大数据处理领域中的经典案例 它用于统计给定文本中各个单词出现的频次 在本文中 我们将介绍如何在macOS系统下使用Apache Flink框架来实现WordCount案例 我们将提供相应的源代码 并逐步解释实现过程 首先
  • 路由器上端口转发_如何在路由器上转发端口

    路由器上端口转发 Although modern routers handle most functions automatically some applications will require you to manually forw
  • 手把手制作一个IDEA插件(Demo搭建篇)

    新建IDEA插件 File gt new gt Project gt Intellij PlatForm Plugin gt Next gt 填好项目名OK 编写插件 新建工程后在src下建个java文件 如下 代码如下 import co
  • 构建big data 学习基石

    catalog what s big data 打下坚实的基础 掌握技术要点 玩转数据科学 数据说故事 不断前行 what s big data 4V 特性 深入解析Volume Velocity Variety Veracity四个方面的
  • Umi.js-配置式路由(学习笔记)

    配置式路由 当使用了路由配置后 约定式路由全部失效 两种方式书写umi配置 使用根目录下的文件 umirc js 使用根目录下的文件config config js 进行路由配置时 每个配置就是一个匹配规则 并且 每个配置是一个对象 对象中
  • Java处理Excel表格的读取和写入

    文章目录 一 处理xlsx文件 二 处理csv文件 由于工作需要处理以下excel表格 所以学习了以下关于excel的两个库 这里记录下简单的读取和写入方法 处理xlsx文件使用的是java poi 处理csv文件使用的是opencsv 一