来,通过 Excel 来认识神器——POI
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相关推荐
- Kettle使用_23 Excel表格输入ODS POI
Kettle使用_23 Excel表格输入ODS POI 需求:通过Kettle实现对Open Office ODS.Excel 97-2003.Apache POI.Excel 2007 XLSX等 ...
- excel 导入导出使用poi自定义注解
excel导入导出使用poi自定义注解 最近在做一个数据导入导出的模块 在网上找了一些例子 在这里整理一下 这里就不再贴原作者的地址 (以下代码来自网上非原创 稍作简单修改) 首先引入pom.xm ...
- 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 ...
- excel poi 加背景图_java 在Excel中插入图片 POI实现
一.POI简介 Jakarta POI 是apache的子项目,目标是处理ole2对象.它提供了一组操纵Windows文档的Java API 目前比较成熟的是HSSF接口,处理MS Excel(97- ...
- Java操作Excel三种方式POI、Hutool、EasyExcel
Java操作Excel三种方式POI.Hutool.EasyExcel 1. Java操作Excel概述 1.1 Excel需求概述 1.2 Excel操作三种方式对比 2. ApachePOIExc ...
- java实现Excel文件解析---apache POI以及把汉字转化为拼音
java实现Excel文件解析----apache POI以及把汉字转化为拼音 1.POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供给Java程序对Microso ...
- excel html 列宽,POI精确设置Excel的行高和列宽
EXCEL的行高度和列宽度单位是不一样的. 1,EXCEL列高度的单位是磅,Apache POI的行高度单位是缇(twip): 1英寸=72磅=25.4毫米=1440缇 1磅=0.353毫米=20缇 ...
- 报表技术之Excel格式报表生成(POI)
报表技术之Excel格式报表生成(POI) 1.找到你的页面的导出Excel的按钮 2.给导出按钮添加事件 3. 编写 ReportAction 添加 exportXls 方法 POI 生成 Exce ...
- java poi 读取excel 编码_Java使用POI 读取和写入Excel指南
做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求:网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0. ...
- java excel 模板 替换_JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签...
个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法 ``` /** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队 ...
最新文章
- 单机安装oracle,Oracle 11G 单机安装
- 从4篇顶会论文看Self-training最新研究进展
- macOS 10.11.* 安装scrapy
- java后台用 requset对象 存储值 前台获取不到_springmvc form表单提交后台对象获取不到值(解决)...
- VSCode尝试在目标目录创建文件发生错误
- vsftp服务器mysql认证_基于mysql控制vsftp的用户认证机制
- 一文搞懂什么是禁忌搜索算法Tabu Search【附应用举例】
- 支付宝支付提示 4006 ISV权限不足
- IntelliJ IDEA下载 与 破解(Evaluate for free 灰色)
- win11安装texlive 2021版本
- 水星路由器DNS服务器未响应,为什么新版水星路由器不能上网
- bmp批量转换jpg的方法
- html b5纸尺寸,A5纸的尺寸多大(各种标准纸张大小A1,A2,A3,A4纸的尺寸)
- 只有真正程序猿才能看懂的段子!!
- Origin 导入数据画图使用经验总结
- php8最新版本,PHP8 GA版本来了,赶快来玩吧
- JIAR安装报错IRA Startup Failed
- 常用设计模式的代码实战教程
- 智慧城市赛道跑出独角兽,摘果子的为何是平安?
- linux网络测速qerf,www.n5fe.com