1、POI是什么

Apache POI - the Java API for Microsoft Documents,顾名思义,Apache的三方包,用来操作微软office文档的,多数时候用来操作excel,所以这里就以excel方面来说明。

需要引入两个包,maven地址如下(version 3.9‍

org.apache.poi

poi

3.9

org.apache.poi

poi-ooxml

3.9

POI的组件列表中,针对excel的主要是HSSF和XSSF组件,前者针对97-2007的通用版excel,即后缀xls;后者针对2007或更高版的excel,即后缀xlsx。官方概要如下:

HSSF is the POI Project's pure Java implementation of the Excel '97(-2007) file format.

XSSF is the POI Project's pure Java implementation of the Excel 2007 OOXML (.xlsx) file format.胖胖胖虎阿:华为鸿蒙工程师MySQL笔记分享​zhuanlan.zhihu.com

2、POI核心类

面向对象面向对象,既然如此,自然去找找一些能表示excel中内容的类。

2.1 工作簿 Workbook

创建或维护Excel工作簿的所有类的超接口,Workbook,属于org.apache.poi.ss.usermodel包。其下有两个实现类:HSSFWorkbook : 有读取.xls 格式和写入Microsoft Excel文件的方法。它与微软Office97-2003版本兼容

XSSFWorkbook : 有读写Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。它与MS-Office版本2007或更高版本兼容

所以在针对不同版本的excel时,需要对应以上使用不同的Workbook。构造函数中,常用的:

HSSFWorkbook

//直接创建新的

HSSFWorkbook()

//通过输入流创建

HSSFWorkbook(java.io.InputStream s)

XSSFWorkbook

//直接创建新的

XSSFWorkbook()

//通过File类创建

XSSFWorkbook(java.io.File file)

//通过输入流创建

XSSFWorkbook(java.io.InputStream is)

2.2 标签页 Sheet

HSSFSheet 和 XSSFSheet 都是Sheet接口的实现类,Sheet可以使用Workbook的两个方法获得:

workbook.createSheet();

workbook.createSheet(String sheetName);

2.3 行 Row

同理,Row是 HSSFRow 和 XSSFRow 的接口,通过Sheet获取:

sheet.createRow(int rownum);

2.4 单元格 Cell

同理,Cell是 HSSFCell 和 XSSFCell 的接口,通过Row获取:

row.createCell(int column);

row.createCell(int column, int type);

3、创建和读取

其实如果能理解面向对象,就很简单了,另外包括字体,公式,超链接等,都有对应的封装类,此处只提出了核心的几个,需要了解更多的需要自行展开。

例子的话,直接从别人教程里摘出来吧,另,读取的workbook,可以debug瞅瞅内容。

3.1 创建空白工作簿

import java.io.*;

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

public class CreateWorkBook

{

public static void main(String[] args)throws Exception

{

//Create Blank workbook

XSSFWorkbook workbook = new XSSFWorkbook();

//Create file system using specific name

FileOutputStream out = new FileOutputStream(

new File("createworkbook.xlsx"));

//write operation workbook using file out object

workbook.write(out);

out.close();

System.out.println("

createworkbook.xlsx written successfully");

}

}

3.2 打开现有的工作簿

import java.io.*;

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

public class OpenWorkBook

public static void main(String args[])throws Exception

File file = new File("openworkbook.xlsx");

FileInputStream fIP = new FileInputStream(file);

//Get the workbook instance for XLSX file

XSSFWorkbook workbook = new XSSFWorkbook(fIP);

if(file.isFile() && file.exists())

{

System.out.println(

"openworkbook.xlsx file open successfully.");

}

else

{

System.out.println(

"Error to open openworkbook.xlsx file.");

}

}

}

4、方法示例:任意对象List转至为Excel文档(可用注解定义标签名和列名)

写了个方法,可以将某个类的List转换为对应的Excel文档,列名如果在不使用注解的情况下默认为属性名:

类:

@Excel(name = "学生标签页")

public class Student {

@Excel(name = "姓名")

private String name;

private boolean male;

@Excel(name = "身高")

private int height;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public boolean isMale() {

return male;

}

public void setMale(boolean male) {

this.male = male;

}

public int getHeight() {

return height;

}

public void setHeight(int height) {

this.height = height;

}

}

测试方法:

public static void main(String[] args) {

List list = new ArrayList();

Student student1 = new Student();

student1.setName("小红");

student1.setMale(false);

student1.setHeight(167);

Student student2 = new Student();

student2.setName("小明");

student2.setMale(true);

student2.setHeight(185);

list.add(student1);

list.add(student2);

File file = new File("C:/Users/Dulk/Desktop/1314.xls");

createExcel(list, file);

}

输出结果:

注解:

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)

public @interface Excel {

//设置名称

public String name() default "";

方法:

import org.apache.log4j.Logger;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

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.ss.usermodel.Workbook;

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

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.lang.reflect.Field;

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.List;

/**

* Excel的操作工具类

*/

public class ExcelUtil {

private static Logger log = Logger.getLogger(ExcelUtil.class);

/**

* 获取某个File文件对应的Workbook工作簿对象

*/

public static Workbook gainWorkbook(File file) throws ExcelException {

if (!isExcel(file)) {

throw new ExcelException("文件不是Excel类型");

}

//如果文件不存在则新建

if (!file.exists()) {

try {

OutputStream os = new FileOutputStream(file);

Workbook workbook = isOlderEdition(file) ? new HSSFWorkbook() : new XSSFWorkbook();

workbook.write(os);

log.debug("文件不存在,新建该Excel文件");

os.close();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

try {

InputStream is = new FileInputStream(file);

return isOlderEdition(file) ? new HSSFWorkbook(is) : new XSSFWorkbook(is);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return null;

}

/**

* 判断某个Excel文件是否是2003-2007通用旧版

*/

private static boolean isOlderEdition(File file) {

return file.getName().matches(".+\\.(?i)xls");

}

/**

* 判断文件是否是一个Excel文件

*/

private static boolean isExcel(File file) {

String fileName = file.getName();

String regXls = ".+\\.(?i)xls";

String regXlsx = ".+\\.(?i)xlsx";

return fileName.matches(regXls) || fileName.matches(regXlsx);

}

/**

* 将某个对象的List转换为Excel工作簿

*/

public static Workbook createExcel(List list, File file) {

String sheetName = "default";

if (list.size() == 0) {

return null;

}

Workbook workbook = null;

try {

Class clazz = list.get(0).getClass();

Field[] fields = clazz.getDeclaredFields();

if (clazz.isAnnotationPresent(Excel.class)) {

Excel excel = (Excel) clazz.getAnnotation(Excel.class);

sheetName = excel.name();

}

workbook = gainWorkbook(file);

Sheet sheet = workbook.createSheet(sheetName);

//创建首行

Row line = sheet.createRow(0);

for (int k = 0; k < fields.length; k++) {

Cell cell = line.createCell(k);

String columnName = fields[k].getName();

if (fields[k].isAnnotationPresent(Excel.class)) {

Excel excel = fields[k].getAnnotation(Excel.class);

columnName = excel.name();

}

cell.setCellValue(columnName);

}

//创建数据

for (int i = 1; i <= list.size(); i++) {

Row row = sheet.createRow(i);

for (int j = 1; j <= fields.length; j++) {

Cell cell = row.createCell(j - 1);

String fieldName = fields[j - 1].getName();

String fieldFirstLetterUpper = fieldName.substring(0, 1).toUpperCase();

String prefix = "get";

if ("boolean".equals(fields[j - 1].getType().getName())) {

prefix = "is";

}

String methodName = prefix + fieldFirstLetterUpper + fieldName.substring(1);

Method method = clazz.getMethod(methodName);

cell.setCellValue(String.valueOf(method.invoke(list.get(i - 1))));

}

}

log.debug("List读入完毕");

OutputStream os = new FileOutputStream(file);

workbook.write(os);

os.close();

} catch (ExcelException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return workbook;

}

}

workbook需要引入的包_用Java玩转Excel,竟然如此easy~相关推荐

  1. workbook需要引入的包_解决Maven引用POI的依赖,XSSFWorkbook依旧无法使用的问题

    Java项目,导入Excel数据功能,第一次使用POI,一开始就遇到了小麻烦! Maven项目引用POI的jar包 org.apache.poi poi 3.14 引入后XSSFWorkbook依旧无 ...

  2. java工程加包_向java工程添加jar包

    当你在向java类中导入某些包的时候(比如:import javax.servet.*)会报错,提示没有这个包.那是因为我们使用的jdk的JRE System Library库中没有包含servet_ ...

  3. poi导出excel写入公式_【java poi 写入Excel后读取公式值问题】poi导入excel

    java poi 写入Excel后读取公式值问题 不用改公式,只需要用cell.getNumericCellValue()获取,读出来就是正确的值了,如果你读出来的还有问题,说明你其他的地方写的还有问 ...

  4. java 从excel中读取数据_在Java中读取Excel文件的内容和导出数据到Excel文件中

    转自www.chianjavaworld.net 原作者:SonyMusic 读:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 在Java ...

  5. 用Java玩转Excel,竟然如此easy~

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客:点 ...

  6. java项目引入ear包_在Eclipse for EAR Project中添加外部jar文件 - java

    我需要将外部jar文件添加到EAR项目. 我确实添加了,但是jar文件没有反映在lib目录中,它显示在lib目录下面. 我在右键单击Deployment Descriptor,Import-> ...

  7. java -jar 运行jar包_用java –jar 命令运行Jar包

    用java –jar 命令运行Jar包 摘要 这个技巧阐明了如何不直接处理清单文件而将一个不能运行jar包转换成一个可以执行的jar包.学会如何写一段转换jar包的程序,将你的jar包转换成你能使用j ...

  8. 关于java包_关于Java包

    关于java包 我希望大家都同意,类的方法应该很小,并且只有很少的依赖关系. 这种观点被广泛接受,而对"小"的解释则各不相同. 关于这一点有很多文献. 但是包裹呢? 有些人将包视为 ...

  9. java 正则表达式的包_用于Java包名称的Python正则表达式

    我在使用 Python确定有效的Java包名称时遇到问题.这是代码: packageName = "com.domain.lala" # valid, not rejected - ...

最新文章

  1. 激光投影市场将保持产品多元化发展趋势
  2. Dubbo 版 Swagger 来啦!Dubbo-Api-Docs 发布
  3. qemu模拟armlinux执行目标文件系统的可执行文件
  4. UML轻松入门--类和对象
  5. framework dyld: Symbol not found: _OBJC_CLASS_xxx
  6. java ee cdi_Java EE CDI程序化依赖关系消歧示例–注入点检查
  7. mysql 生明变量_mysql中变量的使用
  8. 如何为网站进行安装SSL证书
  9. css表格排序,纯CSS实现表格排序-利用CSS 变量和Flexbox
  10. 在训练CNN时,loss稳定在log(类别数)
  11. 分页打印控制 摘自于网络:http://www.cnblogs.com/joinger/articles/1807517.html
  12. Python设计模式:抽象工厂模式
  13. 抖音直播下载方法(附视频下载方法)
  14. hibernate 各历史版本下载
  15. 免费领取微软OneDrive网盘5T容量,非扩容!
  16. edge打开pdf不显示印章_一旦碰到Edge浏览器打不开pdf文件,只需这样做就可完美解决!...
  17. [Python核心技术与实战学习] 18 单元测试unittest 库
  18. AndroidStudio问题XML格式化
  19. 数组与动态数组_验证步骤
  20. 大数据时代的隐私保护:“被遗忘权”

热门文章

  1. java 流读取图片供前台显示
  2. 怎么提高服务器的性能?
  3. 邮件营销群发6大技巧!怎么群发邮件效果好?
  4. Python计算分位点与逆运算:根据给定的值,计算在序列中的分位水平
  5. 【测试方法】业务流测试法之场景法
  6. 在模仿学习中进步的智能机器人
  7. 时区、时间戳、日期、夏令时、冬令时
  8. 本周大新闻|苹果首款MR没有主打卖点;Meta认为AI是AR OS的基础
  9. 【未】Optimizing Rebalance Scheme for Dock-less Bike Sharing Systems with Adaptive User Incentive
  10. 【GamePlay】UGUI的注意事项