1、POI是什么Apache POI - the Java API for Microsoft Documents,顾名思义,Apache的三方包,用来操作微软office文档的,多数时候用来操作excel,所以这里就以excel方面来说明。
需要引入两个包,maven地址如下(version 3.9):
<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>
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.
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()
XSSFWorkbook(java.io.File file)
XSSFWorkbook(java.io.InputStream is)
2.2 标签页 SheetHSSFSheet 和 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瞅瞅内容。关注公从号互联网架构师,回复:2T,可以获取更多架构系列干货。
3.1 创建空白工作簿import java.io.*;
import org.apache.poi.xssf.usermodel.*;
public class CreateWorkBook
{public static void main(String[] args)throws Exception {XSSFWorkbook workbook = new XSSFWorkbook(); FileOutputStream out = new FileOutputStream(new File("createworkbook.xlsx"));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);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.");}}
}
3.3、任意对象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<Student> list = new ArrayList<Student>();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;public class ExcelUtil {private static Logger log = Logger.getLogger(ExcelUtil.class);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;}private static boolean isOlderEdition(File file) {return file.getName().matches(".+\\.(?i)xls");}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);}public static <E> Workbook createExcel(List<E> 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;}
}
参考链接:www.yiibai.com/apache_poi/apache_poi_core_classes.html
作者:Dulk
来源:www.cnblogs.com/deng-cc/p/7443192.html

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

来,通过 Excel 来认识神器——POI相关推荐

  1. Kettle使用_23 Excel表格输入ODS POI

    Kettle使用_23 Excel表格输入ODS POI 需求:通过Kettle实现对Open Office ODS.Excel 97-2003.Apache POI.Excel 2007 XLSX等 ...

  2. excel 导入导出使用poi自定义注解

    excel导入导出使用poi自定义注解 最近在做一个数据导入导出的模块 在网上找了一些例子 在这里整理一下 这里就不再贴原作者的地址  (以下代码来自网上非原创 稍作简单修改)  首先引入pom.xm ...

  3. Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 poi excel copy

    Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 一.前言 1.本文记录 poi excel 实现 单元格ce ...

  4. excel poi 加背景图_java 在Excel中插入图片 POI实现

    一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...

  5. Java操作Excel三种方式POI、Hutool、EasyExcel

    Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...

  6. java实现Excel文件解析---apache POI以及把汉字转化为拼音

    java实现Excel文件解析----apache  POI以及把汉字转化为拼音 1.POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供给Java程序对Microso ...

  7. excel html 列宽,POI精确设置Excel的行高和列宽

    EXCEL的行高度和列宽度单位是不一样的. 1,EXCEL列高度的单位是磅,Apache POI的行高度单位是缇(twip): 1英寸=72磅=25.4毫米=1440缇 1磅=0.353毫米=20缇 ...

  8. 报表技术之Excel格式报表生成(POI)

    报表技术之Excel格式报表生成(POI) 1.找到你的页面的导出Excel的按钮 2.给导出按钮添加事件 3. 编写 ReportAction 添加 exportXls 方法 POI 生成 Exce ...

  9. java poi 读取excel 编码_Java使用POI 读取和写入Excel指南

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求:网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0. ...

  10. java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...

    个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法 ``` /** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队 ...

最新文章

  1. 单机安装oracle,Oracle 11G 单机安装
  2. 从4篇顶会论文看Self-training最新研究进展
  3. macOS 10.11.* 安装scrapy
  4. java后台用 requset对象 存储值 前台获取不到_springmvc form表单提交后台对象获取不到值(解决)...
  5. VSCode尝试在目标目录创建文件发生错误
  6. vsftp服务器mysql认证_基于mysql控制vsftp的用户认证机制
  7. 一文搞懂什么是禁忌搜索算法Tabu Search【附应用举例】
  8. 支付宝支付提示 4006 ISV权限不足
  9. IntelliJ IDEA下载 与 破解(Evaluate for free 灰色)
  10. win11安装texlive 2021版本
  11. 水星路由器DNS服务器未响应,为什么新版水星路由器不能上网
  12. bmp批量转换jpg的方法
  13. html b5纸尺寸,A5纸的尺寸多大(各种标准纸张大小A1,A2,A3,A4纸的尺寸)
  14. 只有真正程序猿才能看懂的段子!!
  15. Origin 导入数据画图使用经验总结
  16. php8最新版本,PHP8 GA版本来了,赶快来玩吧
  17. JIAR安装报错IRA Startup Failed
  18. 常用设计模式的代码实战教程
  19. 智慧城市赛道跑出独角兽,摘果子的为何是平安?
  20. linux网络测速qerf,www.n5fe.com

热门文章

  1. 一首歌是怎么诞生的?
  2. JavaScript静态页面值传递之URL篇
  3. 浅谈JavaScript代码预解析 + 示例详解
  4. Navicat for mysql 远程连接 mySql数据库10061、1045错误
  5. Android通过Alpha实现渐变效果的几个方法
  6. 百度安全专家盘点:非官方购火车票渠道 几乎都不靠谱
  7. 微信全球MBA创新大赛Roadshow最终站火爆中欧
  8. 「代码随想录」本周学习小结!(动态规划系列三)
  9. 「leetcode」39. 组合总和【回溯算法】详解!
  10. 如何在 Mac 上重命名 Apple Magic Mouse?