1.POI说明

Apache POI是Apache软件基金会的开源代码库,
POI提供对Microsoft Office格式档案读和写的功能。

POI支持的格式:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。

其中Excel支持HSSF和XSSF两种格式:
HSSF对应Excel 2003及以前版本生成的文件格式(.xls),
XSSF对应Excel 2007及之后版本生成的文件格式(.xlsx)。
本文仅介绍Excel文件的读写,
并且使用HSSF读写.xls格式的Excel文件。

2.HSSF说明

HSSF是Horrible Spread Sheet Format的缩写,
即糟糕的表格格式。
HSSF为读取操作提供了两类API:
User Model,Event ModelEvent User Model
即"用户模型", "事件模型"和"事件-用户-模型"。

User Model是类似于Dom方式的解析,
API使用起来很简单,
但是占用内存,处理效率低。
Event Model是类似于Sax方式的解析,
比User Model更节约内存,效率更高,
但是抽象程度相比User Model更低,
相比User Model功能更少,
API使用门槛也要高一些。
Event User Model是结合了上面的两个优点,
基于Event Model的流解析方式进一步封装,
提供了类似User Model更友好的操作方式。

学过Xml的都知道,
Dom解析就是将文件全部读入内存,
对文件内部的结构进行建模成一颗Dom树的过程。
下面是POI对Excel的建模的Dom树结构:

本文下面仅介绍使用User Model方式,
操作HSSF(.xls)格式的文件,
其他方式请参考后续文章。

3.Jar包依赖

在pom.xml中添加如下依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version>
</dependency>

4.Excel文件

现在有需要导入的city_date.xls,
内容如下:

5.Area对象

根据上面的Excel文件内容,
抽象出来Area对象,
其中属性一一对应文件中列名。

package org.apache.poi;import java.util.Date;public class Area {/** 省份 */private String province;/** 城市 */private String city;/** 城市排名 */private Integer order;/** 城市纪念日 */private Date cityDay;/** 是否一线大城市 */private Boolean isBigCity;/** 城市描述 */private String description;public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public Integer getOrder() {return order;}public void setOrder(Integer order) {this.order = order;}public Date getCityDay() {return cityDay;}public void setCityDay(Date cityDay) {this.cityDay = cityDay;}public Boolean getIsBigCity() {return isBigCity;}public void setIsBigCity(Boolean isBigCity) {this.isBigCity = isBigCity;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}@Overridepublic String toString() {return "Area [province=" + province + ", city=" + city + ", order=" + order + ", cityDay=" + cityDay+ ", isBigCity=" + isBigCity + ", description=" + description + "]";}}

6.导入Excel

解析.xls格式文件,
转换为内存中的Java对象。

public static List<Area> importExcel() throws Exception {InputStream fileIn = null;HSSFWorkbook workbook = null;try {// 1.创建文件输入流fileIn = new FileInputStream("city_date.xls");// 2.创建Excel工作簿对象workbook = new HSSFWorkbook(fileIn);// 校验excel中的工作表是否存在int numberOfSheets = workbook.getNumberOfSheets();if (numberOfSheets <= 0) {return null;}// 3.获取Excel工作表对象HSSFSheet sheetAt = workbook.getSheetAt(0);ArrayList<Area> citys = new ArrayList<>();// 工作表中至少要有一行数据if (sheetAt.getLastRowNum() < 0) {return null;}// 4.循环读取表格数据for (Row row : sheetAt) {// 首行(即表头)不读取,后面可以校验表头if (row.getRowNum() == 0) {continue;}// 一行至少有6列信息,无法解析需要跳过if (row.getLastCellNum() < 5) {continue;}// 读取当前行中单元格数据,索引从0开始String province = row.getCell(0).getStringCellValue();String cityName = row.getCell(1).getStringCellValue();Integer order = (int) row.getCell(2).getNumericCellValue();Date cityDay = row.getCell(3).getDateCellValue();Boolean isBigCity = row.getCell(4).getBooleanCellValue();String description = row.getCell(5).getStringCellValue();Area city = new Area();city.setProvince(province);city.setCity(cityName);city.setOrder(order);city.setCityDay(cityDay);city.setIsBigCity(isBigCity);city.setDescription(description);citys.add(city);return citys;}} finally {// 5.关闭流if (fileIn != null) {fileIn.close();}if (workbook != null) {workbook.close();}}return null;
}

7.导出Excel

将内存中的Java对象,
写入到.xls格式文件。
导出后的文件即为上面第4步的city_date.xls。

public static void exportExcel() throws Exception {HSSFWorkbook workbook = null;FileOutputStream fileOut = null;try {// 1.需要导出的数据List<Area> citys = new ArrayList<>();Area changzhou = new Area();changzhou.setProvince("江苏省");changzhou.setCity("常州市");changzhou.setOrder(88);changzhou.setCityDay(new Date());changzhou.setIsBigCity(false);changzhou.setDescription("常州是个美丽的旅游和实业城市~");citys.add(changzhou);// 2.在内存中创建一个excel文件workbook = new HSSFWorkbook();// 3.创建工作簿HSSFSheet sheet = workbook.createSheet("city sheet");// 4.创建标题行HSSFRow titlerRow = sheet.createRow(0);titlerRow.createCell(0).setCellValue("省份");titlerRow.createCell(1).setCellValue("城市");titlerRow.createCell(2).setCellValue("排名");titlerRow.createCell(3).setCellValue("纪念日");titlerRow.createCell(4).setCellValue("大城市");titlerRow.createCell(5).setCellValue("描述");// 获取最后一行的行号int lastRowNum = sheet.getLastRowNum();// 5.遍历数据,创建数据行for (Area city : citys) {// 在最后一行后面添加新的一行lastRowNum++;HSSFRow dataRow = sheet.createRow(lastRowNum);dataRow.createCell(0).setCellValue(city.getProvince());dataRow.createCell(1).setCellValue(city.getCity());dataRow.createCell(2).setCellValue(city.getOrder());HSSFCell dateCell = dataRow.createCell(3);setDateStyle(dateCell, workbook);dateCell.setCellValue(city.getCityDay());dataRow.createCell(4).setCellValue(city.getIsBigCity());dataRow.createCell(5).setCellValue(city.getDescription());}for (int i = 0; i <= 5; i++) {// 设置自适应列宽,必须数据全部插入后才调用sheet.autoSizeColumn(i);}// 6.指定输出的文件名String fileName = "city_date.xls";fileOut = new FileOutputStream(fileName);// 7.写文件workbook.write(fileOut);} finally {// 8.关闭流if (workbook != null) {workbook.close();}if (fileOut != null) {fileOut.close();}}
}private static void setDateStyle(HSSFCell cell, HSSFWorkbook wb) {HSSFDataFormat format = wb.createDataFormat();HSSFCellStyle style = wb.createCellStyle();style.setDataFormat(format.getFormat("yyyy年MM月dd日"));cell.setCellStyle(style);
}

8.头文件说明

上面的代码使用到的类如下:

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;

9.参考文章

Busy Developers' Guide to HSSF and XSSF Features
POI操作Excel
Java POI操作Excel(User Model)
Java使用POI操作Excel


http://www.taodudu.cc/news/show-1250999.html

相关文章:

  • 正则表达式常用汇总
  • 接口文档编写技巧
  • MySQL客户端mysql常用命令
  • HAproxy开启日志记录
  • SpringCloud创建Config模块
  • SpringCloud创建Eureka Client服务注册
  • SpringCloud创建Config Client配置读取
  • SpringCloud创建Config Client通过Eureka访问Config
  • SpringCloud集成Security安全(Config配置中心)
  • SpringCloud集成Security安全(Eureka注册中心)
  • SpringCloud创建Config多客户端公共配置
  • SpringCloud创建Config读取本地配置
  • SpringCloud使用汇总Config
  • SpringCloud创建Eureka模块集群
  • Eclipse启动SpringCloud微服务集群的方法
  • SpringCloud发现服务代码(EurekaClient,DiscoveryClient)
  • SpringBoot集成Actuator监控管理
  • SpringBoot集成Actuator端点配置
  • SpringBoot集成Actuator健康指示器health
  • gRPC创建Java RPC服务
  • ProtoBuf3语法指南(Protocol Buffers)_上
  • ProtoBuf3语法指南(Protocol Buffers)_下
  • gPRC基本介绍
  • Log4j2日志框架集成Slf4j日志门面
  • XML解析的四种方式
  • XML解析和创建的JAXB方式
  • 【转载】JSON介绍
  • Elasticsearch单机安装Version7.10.1
  • Drools创建Maven工程
  • Java二、八、十、十六进制介绍

POI导入导出Excel(HSSF格式,User Model方式)相关推荐

  1. POI导入导出excel表

            在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印. Apache POI是Apache软件基金会 ...

  2. POI导入导出EXCEL经典实现

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  3. POI导入导出Excel数据(IDEA版)简单运用

    一.POI Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能,简单来说就是能在Java程序中导入导出W ...

  4. 使用poi导入导出Excel(实测有效)

    1. 导入Excel将数据转换为对象: /*** 传入一Excel表格,创建出对应的类集合 要求:类的字段名必须和Excel的首行的标题相同** @param filePath* @param cls ...

  5. springboot使用 poi 导入导出Excel工具类

    转载的一个比较好用的工具类 import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOE ...

  6. Struts2 POI 导入导出Excel数据

    页面端: <html> <head> <title>导入数据</title> </head> <body> <h1> ...

  7. POI实现导入导出excel

    poi在日常的导入导出中是比较常用到的,最近也总结了下接触到的poi相关的导入导出的一些代码,有问题可以指出: package com.poi;import km.org.apache.poi.hss ...

  8. SpringBoot使用poi或EasyExcel导入导出Excel文件

    使用poi导入导出Excel 首先引入poi依赖包 03版本的Excel和07版本的Excel所需要的依赖不同,都需要导入. 记录问题: 最初导入的poi包为3.6版本.WorkBook类和Sheet ...

  9. java导入导出excel文件

    前言:该文章使用java集成poi来操作excel文件,此处只对poi相关api进行代码编写,对于poi的理论性知识,可在学习完这篇文章后,自行百度学习.建议大家跟着文章敲一遍代码. 创建一个mave ...

最新文章

  1. qchart画完以后删除_Unity2019基础教程:TileMap搭建像素画场景关卡
  2. Docker 容器的网络连接
  3. Tsung MQTT协议简介及MQTT xml文档配置介绍
  4. C#使用StreamReader类读取汉字
  5. python离线包安装_python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境...
  6. c++问题,EOF eofbit eof() 请问他们的区别是什么?
  7. node nest 框架学习(一)
  8. 分布式实时计算—实时计算相关问题及解决方案
  9. hdu 1086 A - You can Solve a Geometry Problem too (线段的规范相交非规范相交)
  10. JavaScript面向对象--封装
  11. 常用的基本Windows数据类型
  12. 【2016年第3期】大数据时代的数据科学家培养
  13. dell-inspiron-5439 uefi 黑苹果_follow me 跟我一起学黑苹果原版安装
  14. abort: error: Temporary failure in name resolution
  15. 3.netwox网络工具集入门教程
  16. 怎样在苹果Mac鼠标或触控板上复制和粘贴?
  17. 关于链表的讨论报告-第三小组
  18. 转 Java知识——精华总结
  19. inter-因特尔-官网
  20. 【盲解调】基于频率和滤波器参数估计的FH-GFSK调制信号盲解调算法matlab仿真

热门文章

  1. Python与数据库[2] - 关系对象映射/ORM[4] - sqlalchemy 的显式 ORM 访问方式
  2. python -sorted 学习
  3. 【面试】判断一棵二叉树是否为二叉排序树
  4. 【原创】关于MATLAB中imagesc函数图像保存的问题
  5. 3 Sum Closest
  6. Linux下部署ASP.NET服务连接oracle遇到的问题记录
  7. 谈谈软件的开发及成长历程
  8. HTML5 表单元素
  9. HTML5 音视频操作
  10. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别(小问题大思想)