java excel 操作 poi_Java使用apache poi进行excel相关操作

一.基本介绍

1.1、Apache POI介绍

Apache POI是一个可以进行微软的文档进行开源库,可以操作的文档类型包括word、ppt、excel、visio、outlook....

本文主要针对Apache POI对excel的操作进行介绍,主要包括如何创建一个excel、录入数据、读取excel数据的方式。

参考官方文档:

1.2、HSSF和XSSF

在POI中,如果要操作Excel,可以有两种操作“模式”,分别是HSSF和XSSF,其中HSSF可以处理win97以及低于2007的excel,而XSSF可以用于处理2007以及更高的版本excel,所以我们一般都会使用XSSF。

有一个很重要的术语:工作薄,其实可以理解为“文档”,excel、word,都属于工作簿,英文workbook。

1.3、引入依赖

只需要导入poi-ooxml这个库即可。

org.apache.poi

poi-ooxml

4.1.2

junit

junit

4.13

二.利用poi库创建excel

2.1、创建一个空excel

下面的代码运行后

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

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

import org.junit.Test;

import java.io.*;

public class CreateExcelTest {

/**

* 创建一个空的Excel文件

*/

@Test

public void testCreateEmptyExcel() throws IOException {

// 创建文件

BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("data.xlsx"));

// 创建工作簿类(所有要写入excel的数据,都将保存在workbook中)

XSSFWorkbook workbook = new XSSFWorkbook();

// 将workbook中的数据写入到文件中。

workbook.write(outputStream);

// 关闭

workbook.close();

outputStream.close();

}

}

2.2、简单演示写入excel内容

下面演示创建一个data.xlsx,并在“my-sheet-1”sheet内的第5行第3列写入一个“hello world”:

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

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

import org.junit.Test;

import java.io.*;

public class CreateExcelTest {

/**

* 简单演示如何写入数据内容

*/

@Test

public void testCreateSimpleWorkbook() throws IOException {

// 指定创建的excel文件名称

BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("data.xlsx"));

// 定义一个工作薄(所有要写入excel的数据,都将保存在workbook中)

XSSFWorkbook workbook = new XSSFWorkbook();

// 创建一个sheet

XSSFSheet sheet = workbook.createSheet("my-sheet-1");

// 开始写入数据流程,2大步:1、定位到单元格,2、写入数据;定位单元格,需要通过行、列配合指定。

// step1: 先选择第几行(0表示第一行),下面表示在第6行

XSSFRow row = sheet.createRow(5);

// step2:选择第几列(0表示第一列),注意,这里的第几列,是在上面指定的row基础上,也就是第6行,第3列

XSSFCell cell = row.createCell(2);

// step3:设置单元格的数据(写入数据)

cell.setCellValue("hello world");

// 执行写入操作

workbook.write(outputStream);

workbook.close();

outputStream.flush();

outputStream.close();

}

}

运行后,下面是生成的excel:

cc822ae640a48ecb06238392c5b7c111.png

2.3、通常的写入数据流程

一般写入excel的数据都是结构化的(类似于数据库表的结构),下面是一个示例,创建一个users.xlsx文档:

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFCell;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

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

import org.junit.Test;

import java.io.BufferedOutputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

public class CreateExcelTest {

private static class User {

private Integer id;

private String name;

private Integer age;

private String addr;

// 避免占用篇幅,所以省略了构造方法、getter、setter

}

/**

* 写入结构化的用户信息数据

*/

@Test

public void testCreateUsersExcel() throws IOException {

List userList = new ArrayList<>();

userList.add(new User(1, "abc", 99, "北京"));

userList.add(new User(2, "lol", 77, "上海"));

userList.add(new User(3, "qaq", 88, "深圳"));

userList.add(new User(4, "owo", 66, "杭州"));

// 指定创建的excel文件名称

BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("users.xlsx"));

// 定义一个工作薄(所有要写入excel的数据,都将保存在workbook中)

XSSFWorkbook workbook = new XSSFWorkbook();

// 创建一个sheet

XSSFSheet sheet = workbook.createSheet("my-sheet");

// 第一行,为表头,需要单独写入,下面是错误方式,因为在反复的创建第1行(rowNumber为0)

/*

sheet.createRow(0).createCell(0).setCellValue("编号");

sheet.createRow(0).createCell(1).setCellValue("姓名");

sheet.createRow(0).createCell(2).setCellValue("年龄");

sheet.createRow(0).createCell(3).setCellValue("城市");

*/

// 正确方式

XSSFRow head = sheet.createRow(0);

head.createCell(0).setCellValue("编号");

head.createCell(1).setCellValue("姓名");

head.createCell(2).setCellValue("年龄");

head.createCell(3).setCellValue("城市");

// 接下来遍历要录入的数据(建议使用for,并且从第2行开始,也就是rowNumber为1,因为表头占了一行)

for (int rowNumber = 1, index = 0; index < userList.size(); index++, rowNumber++) {

User user = userList.get(index);

// 写入数据流程,1、定位到单元格,2、写入数据;定位单元格,需要通过行、列配合指定。

XSSFRow row = sheet.createRow(rowNumber);

row.createCell(0).setCellValue(user.getId());

row.createCell(1).setCellValue(user.getName());

row.createCell(2).setCellValue(user.getAge());

row.createCell(3).setCellValue(user.getAddr());

}

// 执行写入操作

workbook.write(outputStream);

workbook.close();

outputStream.flush();

outputStream.close();

}

}

生成的excel如下:

fec60e5817fd53e060094ea0427e261c.png

三.使用POI读取Excel内容

3.1、读取excel示例

下面针对上面创建的users.xlsx进行读取并打印

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFRow;

import org.apache.poi.xssf.usermodel.XSSFSheet;

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

import org.junit.Test;

import java.io.BufferedInputStream;

import java.io.FileInputStream;

import java.io.IOException;

public class ReadExcelTest {

@Test

public void testReadUsersExcel() throws IOException {

// 指定excel文件,创建缓存输入流

BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("users.xlsx"));

// 直接传入输入流即可,此时excel就已经解析了

XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

// 选择要处理的sheet名称

XSSFSheet sheet = workbook.getSheet("my-sheet");

// 第一行表头,单独处理

// 迭代遍历sheet剩余的每一行

for (int rowNum = 0; rowNum < sheet.getPhysicalNumberOfRows(); rowNum++) {

if (rowNum == 0) { // 读取第一行(表头)

XSSFRow head = sheet.getRow(rowNum);

String headColumn_1 = head.getCell(0).getStringCellValue();

String headColumn_2 = head.getCell(1).getStringCellValue();

String headColumn_3 = head.getCell(2).getStringCellValue();

String headColumn_4 = head.getCell(3).getStringCellValue();

String headStr = String.format("%s\t%s\t%s\t%s", headColumn_1, headColumn_2, headColumn_3, headColumn_4);

System.out.println(headStr);

} else { // 非表头(注意读取的时候要注意单元格内数据的格式,要使用正确的读取方法)

XSSFRow row = sheet.getRow(rowNum);

int id = (int) row.getCell(0).getNumericCellValue();

String name = row.getCell(1).getStringCellValue();

int age = (int) row.getCell(2).getNumericCellValue();

String addr = row.getCell(3).getStringCellValue();

String rowContent = String.format("%s\t%s\t%s\t%s", id, name, age, addr);

System.out.println(rowContent);

}

}

workbook.close();

inputStream.close();

}

}

运行输出如下:

256e85953563cb9b5e728674d9e6da59.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序解析excel中的图片_产品日志丨支持导入Excel中的图片amp;批量修改后期实体字段...

本次安捷秀又迎来了一个大版本更新&#xff0c;除了大家呼声很高的「实体模块导入 Excel 」外&#xff0c;还有「批量编辑实体」&#xff0c;「支持右击修改」以及针对海外用户的「全页面支持英文」等功能的新增与优化&#xff0c;一起来看看吧。导入功能优化AGILESHOT&#xf…

java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors

本文非原创&#xff0c;翻译自Types of Java Garbage Collectors在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的。和C语言不一样的是Java程序员不需要手动写垃圾回收相关的代码。这是使得Java如此流行&#xff0c;同时也是Java能帮助程序员写出更好的Java应…

js修改地址栏url_不同寻常的地址栏过渡

前几天&#xff0c;我在推特上看到这样一张图。原来地址栏还能这么玩&#xff0c;瞬间就觉得自己弱爆了。然后我决定去实现一下这个效果&#xff0c;然后做成一个库。画了一个晚上&#xff0c;终于做好了。这是最后的成果。这个库使用非常的简单。你只需要&#xff0c;yarn add…

kaggle数据集_ArXiv170万篇论文数据集上线Kaggle!

大数据文摘出品学术圈的朋友对ArXiv肯定都不陌生。在将近30年的时间里&#xff0c;ArXiv通过公开访问学术文章为公众和研究社区提供了一个更高效的学术成果沟通平台&#xff0c;从物理学到计算机科学的许多子学科&#xff0c;以及介于两者之间的所有内容&#xff0c;包括数学&a…

万能驱动xp离线版_教你用SC封装软件来封装XP系统

今天我们来讲解一下如何用SC软件来封装XP系统。今天的讲解只演示基本的SC封装软件&#xff0c;具体的封装前的准备工具&#xff0c;我们不进行讲解&#xff0c;当然前期的准备工作也是有很多&#xff0c;首先我们先要安装虚拟机软件&#xff0c;并在虚拟机上面安装好原版的XP系…

java dispo lock_java实现文件上传和下载(1)

原理&#xff1a; 使用html 的 标签&#xff0c;提交form 的几个属性必须为&#xff1a; methodpost encTypemultipart/form-data;组件:smartUpload或者commons fileuploadsmartUpload代码实现1。文件预览function showImage(obj){var strobj.value;$("#id").html(&q…

剪板机自动上下料_机器人联轴器,用于机器人自动化上下料

关注点击蓝字&#xff0c;关注我吧纤薄型机器人联轴器&#xff0c;可搬运重量范围从 1kg 至 1,000kg&#xff0c;用于高效机器人自动化机床上下料&#xff0c;多年来受到广泛认可。紧凑型微型联轴器适合于最近迅速发展的小型机器人应用领域。无人操作时工艺可靠性高模块的特殊混…

java 格式化 布尔型_Java基础篇(1)-格式化

本文目录&#xff1a;十进制数字格式化——DecimalFormat数字格式化基类——NumberFormat字符串格式化类——String.format()Linux输出格式化——printf1. 十进制数字格式化(DecimalFormat)decimal是对数字进行格式化&#xff0c;比如取2位小数&#xff0c;这是最常见的。Java提…

一旦有辞职念头就干不长了吗_每天都有辞职不想上班的冲动,你有吗?

我从大学毕业到今天&#xff0c;工作的时间将近10年了。直到现在&#xff0c;我还经常有辞职的想法。我觉得现在职场真的不好混&#xff0c;不如意的事情十之八九&#xff0c;有了辞职冲动是非常正常的&#xff0c;不必一上来就刻意的否定&#xff0c;或者克制。依照我的职场经…

mysql 序号_脚本搭建Nginx、Redis、MySql、Maven

当你面对一个全新的Linux系统时&#xff0c;是如何部署搭建项目环境呢&#xff1f;是否是一个一个软件安装呢&#xff1f;小编在往期文章中介绍了相关软件的安装方法&#xff0c;但是你是否发现不同的软件安装下来是否会出现问题呢&#xff1f;今天就教大家如何使用脚本一键安装…

mysql数据库子查询的使用_MySQL数据库使用子查询方式更新数据优化及思考

【环境介绍】云数据库MySQL 5.7【背景描述】业务需要&#xff1a;需要对16370077的表数据进行更新部分数据操作UPDATE P_MOXXXX_REXXXX SET FISAVAILABLE 1 WHERE FREG_ID IN (SELECT FREG_ID FROM P_MOXXXX_REXXXX_UPDATE_TEMP);【按照正常流程更新数据操作】使用archery的SQ…

业务中台建设与应用_容易网业务中台建设,助力企业数字化转型

“中台”这个概念自去年流行以来&#xff0c;至今仍然搅动着市场。期间&#xff0c;既有阿里、腾讯、百度、字节跳动、美团、滴滴等等头部互联网企业刮起的转型风&#xff0c;也有茅台延后中台签约、服装品牌CIO被开除等风波。尽管存在争议&#xff0c;但这不影响越来越多的企业…

java由大到小输出整数xvz_【视频+图文】Java经典基础练习题(三):输入3个整数,并将其由小到大输出...

java经典实例书店书畅想畅销书109.6元包邮(需用券)去购买 >目录https://www.cnblogs.com/Qpgshare/p/12588923.html一、视频讲解https://www.cnblogs.com/Qpgshare/p/12588923.html二、思路分析https://www.cnblogs.com/Qpgshare/p/12588923.html总结&#xff1a;https://ww…

压力测试过负载均衡_性能测试的方法有哪些?

压力测试&#xff1a;压力测试的关键字就是“极端”。通过对系统的极端加压&#xff0c;从而观察系统的所表现出来性能问题。再对此性能问题进行分析&#xff0c;从而达到系统优化的目的。所以压力测试就是一定要让系统出问题&#xff0c;如果系统没有出问题&#xff0c;那么压…

java比ios慢_Android为什么比iOS慢

有些人会觉Android应用没有iOS应用使用得流畅&#xff0c;我觉得主要原因有以下几点&#xff1a;第一&#xff0c;因为Android平台相较于iOS起步晚&#xff0c;平台不成熟&#xff0c;初期的开发者水平也有限&#xff0c;没有很关注性能优化&#xff0c;只是想做出可用的应用&a…

output怎么用_如何用 C++ 写一个可编程软件渲染器?

今天你想用最新的 D3D12 画一个三角形&#xff0c;少说也要上千行代码了&#xff0c;对于初学者来讲&#xff0c;这个门槛是非常高的&#xff0c;太多干扰了&#xff0c;而一千多行代码&#xff0c;已经足够你重头实现一个简易版 D3D 了&#xff0c;为什么不呢&#xff1f;比起…

mysql delete语句_MySQL ------ 触发器(TRIGGER)(二十七)

MySQL 语句在需要时被执行&#xff0c;存储过程也是&#xff0c;但是你要是想要某条&#xff08;或某些语句&#xff09;在事件发生时自动执行&#xff0c;该怎么办触发器由此而来触发器&#xff1a;某个表发生更改时自动处理。触发器是MySQL响应delete&#xff0c;insert&…

创建时间指定日期 java,Java避坑之如何创建指定时间Date对象

在翻看自己以前写的惨不忍睹的代码时&#xff0c;发现了自己曾经写的一个跟Date有关的坑。Date date new Date(2020, 1, 1);System.out.println(date);我的目的是想创建一个2020年1月1日的时间对象date&#xff0c;但是我们创建的date真的就代表2020年1月1日吗&#xff1f;错&…

pagerank数据集_从数据结构到算法:图网络方法初探

机器之心原创作者&#xff1a;朱梓豪编辑&#xff1a;Qing Lin如果说 2019 年机器学习领域什么方向最火&#xff0c;那么必然有图神经网络的一席之地。其实早在很多年前&#xff0c;图神经网络就以图嵌入、图表示学习、网络嵌入等别名呈现出来&#xff0c;其实所有的这些方法本…

php curl上传文件返回false,php curl上传文件$_FILES为空的问题

PHP 5.0~5.6 各版本兼容的cURL文件上传最近做的一个需求&#xff0c;使用PHP cURL上传文件。踩坑若干&#xff0c;整理如下。不同版本PHP之间cURL的区别PHP的cURL支持通过给CURL_POSTFIELDS传递关联数组(而不是字符串)来生成multipart/form-data的POST请求。传统上&#xff0c;…