一.基本介绍

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:

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如下:

三.使用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();

}

}

运行输出如下:

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

  1. java实现条形图_java – 使用Apache POI在Excel中创建条形图

    P,很难生;-).对于不了解背景 Apache POI supports only ScatterCharts and LineCharts why?的用户.描述了原则上如何进行. 就像我说的.用最简 ...

  2. java不用poi怎么读取excel,java-无法使用Apache POI读取Excel

    您必须包括poi jar文件.它的版本将是4.1.0.如果使用的是Maven pom.xml,请包括以下依赖项. org.apache.poi poi-ooxml 4.1.0 org.apache.p ...

  3. java excel 删除行_使用Apache POI在Excel中删除多行

    我有一张包含75行表格的Excel表格 . 在第76行我有各列的总功能 =SUM(A1:A75) 和 =SUM(B1:B75) 在第77到第92位的行我有一个Excel图表这需要A1:A75和B1:为 ...

  4. 【Apache POI】Excel操作(四):Excel大数据量的写入

    迷茫代表着你身边还有选择,焦虑意味着你手上还有时间. 有目录,不迷路 前言 超量数据 速率比较 原因剖析 超级版本大救星 往期回顾 前言 之前在下面这期Excel操作: [Apache POI]Exc ...

  5. java处理excel(java使用Apache POI处理Excel)

    Apache  POI是一套用来处理微软办公文档的java  api,可以使用它来处理Excel,word,PowerPoint等等文档. 官网地址:http://poi.apache.org/ 下载 ...

  6. Java开发小技巧(六):使用Apache POI读取Excel

    前言 在数据仓库中,ETL最基础的步骤就是从数据源抽取所需的数据,这里所说的数据源并非仅仅是指数据库,还包括excel.csv.xml等各种类型的数据接口文件,而这些文件中的数据不一定是结构化存储的, ...

  7. java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

    之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了.于是乎我在学会用Java在后 ...

  8. 【Apache POI】Excel操作(一):Excel本地写入基本操作的实现

    有人住高楼,有人在深沟,有人光万丈,有人一身锈:世人千万种,浮云莫去求,斯人若彩虹,遇上方知有. 有目录,不迷路 前言 前期准备 POI基本介绍 Excel简单介绍 Excel版本介绍 Excel基本 ...

  9. 【Apache POI】Excel操作(六):Excel计算公式的读取和使用

    此后如竟没有炬火,我便是唯一的光. 文章目录 前言 Excel准备 计算公式读取 直接读取 屠龙秘技 再直接读取 再通过计算公式读取 完整代码 往期回顾 前言 在上期:[Apache POI]Exce ...

最新文章

  1. 第四天2017/03/31(下午1:结构体、数组)
  2. 11.IDA-this指针
  3. 【FLink】Flink Forward Asia Hackathon (2021) 回顾
  4. Linux命令完全指南route,Linux命令--route
  5. 【Anaconda版本重装】Anaconda版本与Python版本的对应关系
  6. Python 西瓜书机器学习支持向量机(SVM)
  7. 做生意做不过中国,于是英国发动了鸦片战争
  8. JAVA企业微信事件接收
  9. EDI 单据和标准是什么?
  10. 【精品,面试之前必读】【转贴】安氏大俗商业学(2005-8-28)
  11. 操作系统-添加文件加密系统
  12. [ 电脑维修那些事 ] 一招教你自己解决电脑蓝屏
  13. Adobe Creative Cloud一直转圈无法进入的问题
  14. 英文论文写作中的词汇句式总结
  15. 计算6+德州扑克各个牌型的概率
  16. 最新版谷歌浏览器更新后下载时奔溃
  17. 2007-1-14日 周日 agilepoint的讲座
  18. Java 模拟栈结构
  19. 推荐5个神仙软件,个个让你爱不释手
  20. [HyperGraph专题]HGNN+:General Hypergraph Neural Networks

热门文章

  1. 删除指定下标的元素c语言,PHP删除数组中指定下标的元素方法
  2. python单双三引号区别_python中单引号,双引号,多引号区别_python中单双引号
  3. 8乘8led点阵显示数字_51单片机程序设计:[7]88点阵显示汉字
  4. pip install 包的安装位置
  5. 单片机c语言数码显示实验报告,单片机动态显示技术实验报告.doc
  6. html js停止计时,用 js 写的计时器,暂停计时无法生效
  7. 16*64点阵屏的c语言程序,16*64点阵程序 - 单片机/MCU论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛!...
  8. Silver Cow Party POJ - 3268(正反建图+dijkstra)
  9. Perform the Combo CodeForces - 1311C(字符串反转+树状数组)
  10. CCF之地铁修建(100分)