Java读取和写入Excel表格

2023-11-01

1. 绪论

  1. POI
    Apache POI是Apache软件基金会的开放源码函数库,POI提供API给Java程序对Microsoft Office格式档案读写功能。
    • HSSF 读写Microsoft Excel格式档案的功能。
    • XSSF 读写Microsoft Excel OOXML格式档案的管理。
    • HWPF 读写Microsoft PowerPoint格式档案的功能。
    • HSLF 读写Microsoft PowerPoint格式档案的功能。
    • HDGF 读写Microsoft Visio格式档案的功能。
  2. JXL
    开放源码文件。POI效率更高,操作相对复杂,JXL操作更简单。
  3. FASTEXCEL:纯Java开发的excel文件读写组件,支持Excel 97-2003文件格式;占用内存小。

2. JXL篇之程序范例

2.1 JXL 创建低版本Excel文件

  1. 程序代码
package excelJxl;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;

import java.io.File;

public class JxlExcelCre {
    /**
     * JXL 创建Excel文件
     * @author yangtingting
     * @date 2019/07/29
     */
    public static void main(String[] args) throws Exception{
        //创建Excel文件
        File file=new File("D:/jxl_test.xls");
        //创建文件
        file.createNewFile();
        //创建工作薄
        WritableWorkbook workbook = Workbook.createWorkbook(file);
        //创建sheet
        WritableSheet sheet=workbook.createSheet("sheet1",0);
        //添加数据
        String[] title={"id","name","sex"};
        Label label=null;
        for (int i=0;i<title.length;i++){
            label=new Label(i,0,title[i]);
            sheet.addCell(label);
        }
        //追加数据
        for (int i=1;i<10;i++){
            label=new Label(0,i,"a"+1);
            sheet.addCell(label);
            label=new Label(1,i,"user"+1);
            sheet.addCell(label);
            label=new Label(2,i,"男"+1);
            sheet.addCell(label);
        }
        workbook.write();
        workbook.close();

    }
}
  1. 程序解读:
  • JXL的每个单元格都是通过Label写入的
  • JXL没有行的概念,通过“坐标”确定行和列

2.2 JXL 读取低版本Excel文件

  1. 程序代码
package excelJxl;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;

import java.io.File;

public class JxlExcelRead {
    /**
     * JXL 读取Excel文件
     * @author yangtingting
     * @date 2019/07/29
     */
    public static void main(String[] args) throws Exception {
        //创建workbook
        Workbook workbook=Workbook.getWorkbook(new File("D:/jxl_test.xls"));
        //获取第一个工作表sheet
        Sheet sheet=workbook.getSheet(0);
        //获取数据
        for (int i=0;i<sheet.getRows();i++){
            for (int j=0;j<sheet.getColumns();j++){
                Cell cell=sheet.getCell(j,i);
                System.out.print(cell.getContents()+" ");
            }
            System.out.println();
        }

        workbook.close();
    }

}

3. POI篇之程序范例

3.1 POI 创建低版本Excel文件

  1. 程序代码:
package excelPOI;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.FileOutputStream;

public class POIExcelCre {
    /**
     * POI 创建Excel文件
     * @author yangtingting
     * @date 2019/07/29
     */
    public static void main(String[] args) throws Exception {
        //创建Excel文件薄
        HSSFWorkbook workbook=new HSSFWorkbook();
        //创建工作表sheeet
        HSSFSheet sheet=workbook.createSheet();
        //创建第一行
        HSSFRow row=sheet.createRow(0);
        String[] title={"id","name","sex"};
        HSSFCell cell=null;
        for (int i=0;i<title.length;i++){
            cell=row.createCell(i);
            cell.setCellValue(title[i]);
        }
        //追加数据
        for (int i=1;i<10;i++){
            HSSFRow nextrow=sheet.createRow(i);
            HSSFCell cell2=nextrow.createCell(0);
            cell2.setCellValue("a"+i);
            cell2=nextrow.createCell(1);
            cell2.setCellValue("user"+i);
            cell2=nextrow.createCell(2);
            cell2.setCellValue("男");
        }
        //创建一个文件
        File file=new File("D:/poi_test.xls");
        file.createNewFile();
        FileOutputStream stream=FileUtils.openOutputStream(file);
        workbook.write(stream);
        stream.close();

    }

}

3.2 POI 读取低版本Excel文件

  1. 程序代码
package excelPOI;

import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.io.File;

public class POIExcelRead {
    /**
     * POI 读取Excel文件
     * @author yangtingting
     * @date 2019/07/29
     */
    public static void main(String[] args) throws Exception {
        //创建Excel,读取文件内容
        File file=new File("D:/poi_test.xls");
        HSSFWorkbook workbook=new HSSFWorkbook(FileUtils.openInputStream(file));
        //两种方式读取工作表
      //  HSSFSheet sheet=workbook.getSheet("Sheet0");
        HSSFSheet sheet=workbook.getSheetAt(0);
        //获取sheet中最后一行行号
        int lastRowNum=sheet.getLastRowNum();
        for (int i=0;i<=lastRowNum;i++){
            HSSFRow row=sheet.getRow(i);
            //获取当前行最后单元格列号
            int lastCellNum=row.getLastCellNum();
            for (int j=0;j<lastCellNum;j++){
                HSSFCell cell=row.getCell(j);
                String value=cell.getStringCellValue();
                System.out.print(value+" ");
            }
            System.out.println();

        }

    }
}

3.3 POI -XSSF创建高版本Excel文件

实际上,高版本的Excel文件只需更改响应jar包和个别方法名即可,直接附上代码吧。

package excelPOI;

import org.apache.commons.io.FileUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


import java.io.File;
import java.io.FileOutputStream;

public class POIEcxelCreHigh {
    /**
     * POI 创建高版本Excel文件
     * @author yangtingting
     * @date 2019/07/29
     */
    public static void main(String[] args) throws Exception {
        //创建Excel文件薄
        XSSFWorkbook workbook=new XSSFWorkbook();
        //创建工作表sheeet
        Sheet sheet=workbook.createSheet();
        //创建第一行
        Row row=sheet.createRow(0);
        String[] title={"id","name","sex"};
        Cell cell=null;
        for (int i=0;i<title.length;i++){
            cell=row.createCell(i);
            cell.setCellValue(title[i]);
        }
        //追加数据
        for (int i=1;i<10;i++){
            Row nextrow=sheet.createRow(i);
            Cell cell2=nextrow.createCell(0);
            cell2.setCellValue("a"+i);
            cell2=nextrow.createCell(1);
            cell2.setCellValue("user"+i);
            cell2=nextrow.createCell(2);
            cell2.setCellValue("男");
        }
        //创建一个文件
        File file=new File("D:/poi_test.xlsx");
        file.createNewFile();
        FileOutputStream stream= FileUtils.openOutputStream(file);
        workbook.write(stream);
        stream.close();

    }

}


3.4 POI -XSSF读取高版本Excel文件

代码:

package excelPOI;

import org.apache.commons.io.FileUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;

public class POIExcelReadHigh {
    /**
     * POI 读取高版本Excel文件
     * @author yangtingting
     * @date 2019/07/29
     */
    public static void main(String[] args) throws Exception {
        //创建Excel,读取文件内容
        File file=new File("D:/poi_test.xlsx");
        XSSFWorkbook workbook=new XSSFWorkbook(FileUtils.openInputStream(file));
        //两种方式读取工作表
        // Sheet sheet=workbook.getSheet("Sheet0");
         Sheet sheet=workbook.getSheetAt(0);
        //获取sheet中最后一行行号
        int lastRowNum=sheet.getLastRowNum();
        for (int i=0;i<=lastRowNum;i++){
            Row row=sheet.getRow(i);
            //获取当前行最后单元格列号
            int lastCellNum=row.getLastCellNum();
            for (int j=0;j<lastCellNum;j++){
                Cell cell=row.getCell(j);
                String value=cell.getStringCellValue();
                System.out.print(value+" ");
            }
            System.out.println();
        }
    }
}


注意

在读取某些Excel时报错Exception in thread “main” java.lang.IllegalStateException: Cannot get a STRING value from a NUMERIC cell。

处理

代码做出相应更改:

在这里插入图片描述
代码如下:

for (int j=0;j<lastCellNum;j++){
             //   Cell cell=row.getCell(j);
                DataFormatter formatter=new DataFormatter();
                String value=formatter.formatCellValue(row.getCell(j));
                System.out.print(value+" ");
            }

4. Maven

4.1 低版本Excel创建与读取

<dependencies>
        <!-- https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxl -->
            <dependency>
                <groupId>net.sourceforge.jexcelapi</groupId>
                <artifactId>jxl</artifactId>
                <version>2.6.10</version>
            </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

4.2 高版本Excel创建与读取

需要 额外增加 依赖:

        <!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
       <dependency>
            <groupId>org.apache.poi</groupId>
           <artifactId>poi-ooxml</artifactId>
           <version>4.1.0</version>
     </dependency>

5. 定制Excel导入模板

5.1 概念

  1. 利用xml解析技术,确定模板样式
  • 确定模板列
  • 定义标题(合并单元格)
  • 定义列名
  • 定义数据区域单元格样式
  1. 这一部分的学习放在以后,先mark一下。视频链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何在 Jupyter Notebook 内的 conda 环境中使用特定的 Java 版本

    我的总体目标是使用sparklyr在 Jupyter 实验室的 Azure 云服务上的 R Jupyter 笔记本中 我使用 R sparklyr 和 Java 8 创建了一个新的 conda 环境 因为这是 Sparklyr 支持的版本
  • 是否有与 Java 的 IdentityHashMap 等效的 Python 版本?

    我正在遍历一个数据结构 想要构建一个映射 X gt Y 的字典 其中 X 是我正在遍历的数据结构中的一个字段 Y 是我正在动态构建的数据结构中的一个字段 X 是不可散列的类型 Java的IdentityHashMap的目的是模拟动态字段 由
  • JavaFX:如何在 JavaFX 中正确使用 ProgressIndicator

    我是 JavaFX 新手 我的 JavaFX 应用程序有问题 我需要在数据库查询之前启动 ProgressIndicator 类型 INDETERMINATE 这是我的代码的一部分 spinner setVisible true passC
  • 有人知道如何在android中实现像Unfold(这是iphone中的应用程序)这样的效果吗?

    我怎样才能实现这个效果呢 任何建议都会对我有帮助 None
  • Java用逗号或点和两个小数值验证价格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 验证必须用点或逗号表示价格值且最多具有两位小数值的字符串的最佳方法和解决方案是什么 RegExp java text DecimalFor
  • 理解 Spring AOP [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在使用 Spring 3 0 框架 但仍然是新手 谁能通俗地解释一下什么是AOP编程 一个简短的例子肯定会有帮助 Spring 如
  • 为什么 java.util.concurrent.FutureTask 不可序列化

    我目前正在使用 Apache Wicket 我有一些 REST 调用 每个调用需要几秒钟 Wicket 只允许同步调用 ajax 所以我尝试使用 Future 和 Callable 这是我的课程的一部分 public abstract cl
  • JavaFX TabPane 禁用按键切换选项卡

    我有一个Tab有一些内容 ScrollBar和别的 The ScrollBar has event handler for keys left and right 但如果我按下这些按钮Tabs被切换 因为TabPane还有一个密钥处理程序
  • 动态添加的 RemoteView 上的布局权重

    在我的小部件中 我使用以下内容将项目 R layout widget item 动态添加到我的主小部件布局中定义的 LinearLayout 中 Main widget layout RemoteViews views new Remote
  • 如何在 Spring Security 中创建自定义身份验证过滤器?

    我正在尝试创建一个自定义 Spring Security 身份验证过滤器以实现自定义身份验证方案 我花了几个小时阅读 Spring Security 但我找到的所有指南都解释了如何配置基本设置 我正在尝试编写自定义设置 但无法找到有关如何执
  • HttpURLConnection 中的 NTLM 身份验证在 JRE 中不起作用,但在 JDK 环境中起作用

    我正在使用 eclipse 开发应用程序的两个部分 Web 部件提供 REST 服务 并对服务的请求进行过滤waffle servlet NegotiateSecurityFilter它提取 Windows 登录信息来识别用户 客户端部分使
  • Android O - 通知通道和NotificationCompat

    我无法改变这种感觉 Android 开发人员再次提出了一些新东西 却让每个人都对他们如何看待该功能的使用一无所知 我说的是 Android O 中的通知通道 多年来 我一直使用兼容性支持库来避免处理特定平台的细节 即 Notificatio
  • Apache James 学习资源 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 该计划是创建一个列表阿帕奇 詹姆斯 http james apache org学习资源 涉及从设置到使用
  • 使用 Spring Java 配置自动装配 bean

    是否可以使用Spring的 Autowired用 Java 编写的 Spring 配置中的注释 例如 Configuration public class SpringConfiguration Autowired DataSource d
  • String.substring 在 Java 中到底做了什么?

    我一直想如果我这样做String s Hello World substring 0 5 然后我就得到一个新字符串s Hello Java API 文档中也记录了这一点 返回一个新字符串 该字符串是该字符串的子字符串 但当我看到下面两个链接
  • Java中对象类的继承

    当我读java书时 我遇到了 每个类都扩展类 Object 但是如果想要 B 类扩展 A 类 但是 B 类现在将具有多重继承 一个来自 Object 类 一个来自 A 类 如何解决冲突 谁能解释一下吗 它是多级继承 而不是多重 class
  • [PersistenceUnit:<名称>]:无法构建EntityManagerFactory

    正如主题所述 我的问题是EntityManagerFactory无法建造 我正在使用 Maven Hibernate 我正在连接到 MySQL 数据库
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • Java/Android 字符串到颜色的转换

    我正在制作一个应用程序 我希望能够通过用户输入 edittext 和十六进制值设置各种颜色 例如 eeeeee等等 问题是我似乎不知道如何转换它们 如果我在代码中做这样的事情 它工作得很好 标题栏 setBackgroundColor 0x
  • 从 HashMap 中查找对象键

    我有一个 HashMap 其键作为我自己的对象 键作为 String 的 ArrayList 有没有一种方法可以从映射中获取与另一个对象相同的关键对象 而无需迭代映射 请注意 我的对象已经实现了 equals 和 hashcode 并且它只

随机推荐

  • echarts解决X轴溢出数据,echarts中的boundaryGap属性

    xAxis type category boundaryGap false true才是正常的 data Date 注意 把这个设置为true才是正常的 如果设置为false两端没有留白 就会导致数据溢出
  • 同个局域网内SSH远程Ubuntu系统

    荣誉认证 51CTO博客专家博主 TOP红人 明日之星 阿里云开发者社区专家博主 技术博主 星级博主 微信公众号 iOS开发上架 本文由iOS开发上架原创 文章目录 前言 在Ubuntu系统下如何实现不同系统间的SSH连接 同一局域网环境
  • C++ 内存分区模型

    本阶段注意针对C 面向对象编程计算左详细讲解 探讨C 中的核心和精髓 1 内存分区模型 C 程序在执行时 将内存大方向划分为4个区域 1 代码区 存放函数体的二进制代码 由操作系统进行管理的 2 全局区 存放全局变量和静态变量以及常量 3
  • 如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘

    阿里妹导读 基于TMF 2 0关键模型 阿里交易平台实现了业务定义可视 可管 可配 今天我们来一起了解交易平台遇到的挑战 TMF2 0解决的关键问题 以及TMF 2 0的关键模型 本文作者为毗卢 阿里巴巴资深技术专家 主导设计了TMF2 0
  • jsp页面,EL表达式失效

    检查pom文件引入的依赖
  • C++ 集合

    目录 1 Vector 容器 2 Stack 栈 3 Queue 队列 4 Map 关联容器 5 Set 关联容器 C 的集合 较为简单 但容易混淆 所以总结一下 1 Vector 容器 Vector 是 C 的一种数据结构 确切的说是一个
  • Bing搜索核心技术BitFunnel原理

    1 概述 转载 Bing搜索核心技术BitFunnel原理 相似文章 guava 大数据量下的集合过滤 Bloom Filter 导语 从90年代中期开始 人们普遍认识 对于内容索引来说 文件签名技术比反向链接效果更差 最近几年必应搜索引擎
  • 应对当今的医疗器械软件测试开发挑战,如何选择测试软件

    随着计算机科学与技术的发展 计算机软件控制技术在医疗设备中的应用越来越广泛 并已成为医疗设备的核心技术之一 大到高端的大型医疗设备 如螺旋CT 核磁共振 直线加速器或全自动生化分析仪等 小到家用的电子血压计 血糖仪或微波理疗仪等 计算机软件
  • 修改python的默认版本

    如果电脑上安装了多个python环境 那么如何设置某一个版本的python为默认打开方式呢 我们尝试将2 7设置为默认的python环境 方法如下 此电脑 gt 属性 gt 高级系统设置 gt 环境变量 选择系统变量 然后点击编辑 将2 7
  • 前后端交互与接口设计学习

    目录 前言 介绍目录内容和目的 前后端交互概述 解释前后端交互的基本概念和作用 2 强调前后端分离的架构模式 2 前后端交互逻辑设计 1 讨论前后端交互的一般逻辑流程 2 探索不同的数据传输方式 3 提供实际案例加深理解 4 接口设计与文档
  • 太原理工大学python考试题总结

    已知x 1 2 3 那么x 3的值为 1 2 3 1 2 3 1 2 3 已知x 1 2 和y 3 4 那么x y的结果是 1 2 3 4 Python 不具备运行速度快的特点 具备扩展库丰富 跨平台 支持函数式编程的特点 Python是面
  • 15. 线性代数 - 克拉默法则

    文章目录 克拉默法则 矩阵运算 Hi 大家好 我是茶桁 上节课我们在最后提到了一个概念 克拉默法则 本节课 我们就来看看到底什么是克拉默法则 克拉默法则 之前的课程我们一直在强调 矩阵是线性方程组抽象的来的 那么既然我们抽象出来了 有没有一
  • 选中物体高亮显示(MR开发日志)

    业务逻辑 屏幕中央扫到物体 点亮该物体 离开物体 取消高亮 程序逻辑 射线选中物体 配合Outline Effect高亮显示物体 场景设置 下载插件Outline Effect 1 摄像机设置添加Outline Effect脚本 2 然后那
  • Linux防火墙端口

    在服务器上使用某些软件时需要开启相应的防火墙端口号 简单了解下Linux防火墙端口 防火墙策略 防火墙策略可以基于流量的源目地址 端口号 协议 应用等信息来定制 然后防火墙使用预先定制的策略规则监控出入的流量 若流量与某一条策略规则相匹配
  • strlen、strcpy、strcmp、strcat函数的实现

    目录 一 strlen函数的实现 二 strcpy函数的实现 三 strcmp函数的实现 四 strcat函数的实现 五 代码示例展示 strlen strcpy strcmp strcat四个函数都包含在 include
  • ios safari 开启无痕浏览(隐私模式)报QuotaExceededError: DOM Exception 22异常解决办法...

    检测safari是否开启无痕浏览 function var testKey test var storage window sessionStorage try storage setItem testKey testValue stora
  • 域适应(Domain Adaptation)综述

    根据李宏毅老师的视频所归纳的笔记 视频链接 https www bilibili com video BV1TL411p7Us spm id from 333 999 0 0 假设我们在训练集上训练黑底白字的手写数字集后 如下图 再把它用在
  • undefined symbol 问题解决记录(二)

    昨天上车自测本模块功能稳定性 顺便pull小弟分支 帮忙一起验证 结果小包上车后无法运行 一查发现一直报 undefined symbol XXXXXX 晚上下班后开始帮忙排查 今日记录以便后期回顾 前两年写过一篇关于undefined s
  • git clone 使用用户名和密码

    git clone 使用用户名和密码 一般git仓库的用户 都是用户名和密码登录 git clone命令如下 模板 git clone http 邮箱 或用户名 密码 仓库 git clone http username password
  • Java读取和写入Excel表格

    Java读取和写入Excel表格 1 绪论 2 JXL篇之程序范例 2 1 JXL 创建低版本Excel文件 2 2 JXL 读取低版本Excel文件 3 POI篇之程序范例 3 1 POI 创建低版本Excel文件 3 2 POI 读取低