Apache POI:Excel读写库
1)Apache POI 简介
Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现“。基本功能如下:
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
OOXML:Offic Open XML,微软以XML为基础并以ZIP格式压塑的电子文件规范,支持文件,表格,备忘录,幻灯片等格式。从Microsoft Offic 2007开始,OOXML已经成为Microsoft Offic默认的文件格式。
HWPF - 提供读写Microsoft Word格式档案的功能。HSLF - 提供读写Microsoft PowerPoint格式档案的功能。HDGF - 提供读写Microsoft Visio格式档案的功能。
2) maven pom.xml配置
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15-beta2</version>
</dependency>
3)核心代码
/**
* 下载
* @param response
* @param list
* @param clazz
* @param templatePath
* @param templateName
* @throws Exception
*/
public static void download(HttpServletResponse response, List list, Class clazz, String templatePath, String templateName) throws Exception {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/M/d");
OutputStream os = response.getOutputStream();
try {
XSSFWorkbook workbook = ExcelUtil.getExportWorkBook(list, clazz, templatePath);
response.setHeader("Content-Disposition", "attachment; filename='" + templateName + "'");
response.setContentType("application/vnd.ms-excel");
workbook.write(os);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
os.close();
}
}
}
/**
* 获取导出Excel工作薄
*
* @param list 数据源
* @param clazz 类
* @param templatePath 模板路径
* @return
* @throws Exception
*/
public static XSSFWorkbook getExportWorkBook(List list, Class clazz, String templatePath) throws Exception {
//获取导入模板
InputStream in = ExcelUtil.class.getResourceAsStream(templatePath);
XSSFWorkbook wb = new XSSFWorkbook(in);
XSSFSheet sheet = wb.getSheetAt(0);
//写入数据
writeDate(sheet, clazz, list);
return wb;
}
/**
* 写入数据
*
* @param sheet 表格
* @param clazz 类
* @param list 数据源
* @throws Exception
*/
public static void writeDate( XSSFSheet sheet, Class clazz, List list) throws Exception {
int propertyRowNum = 2;
XSSFRow propertyRow = sheet.getRow(propertyRowNum);//获取属性行
int columnCount = propertyRow.getLastCellNum();//获取属性行的列数
//循环赋值
for (int i = 0; i < list.size(); i++) {
Row dataRow = sheet.createRow(propertyRowNum + 1 + i);
//循环为每列赋值
for (int j = 0; j < columnCount; j++) {
String propertyString = propertyRow.getCell(j).getStringCellValue();
if (StringUtil.isEmpty(propertyString)) {
continue;
}
Method getMethod = getGetMethod(clazz, propertyString);//使用反射来获取方法和赋值
if (getMethod != null) {
Cell cell = dataRow.createCell(j);
CellStyle cellStyle = propertyRow.getCell(j).getCellStyle();
cell.setCellStyle(cellStyle);
setCell(list.get(i), getMethod, cell);
} else {
dataRow.createCell(j).setCellValue("");
}
}
}
if(propertyRowNum == sheet.getLastRowNum()){
sheet.removeRow(propertyRow);//没有数据,清空属性行
}else {
sheet.shiftRows(propertyRowNum + 1, sheet.getLastRowNum(), -1);//有数据,清空属性行,全部数据行上移一行(该函数从起始行,到结束行,上移一行)
}
}
/**
* 根据关键词查找对应的get方法
*
* @param objectClass
* @param fieldName
* @return
*/
public static Method getGetMethod(Class objectClass, String fieldName) {
StringBuffer sb = new StringBuffer();
sb.append("get");
sb.append(fieldName.substring(0, 1).toUpperCase());
sb.append(fieldName.substring(1));
try {
return objectClass.getMethod(sb.toString());
} catch (Exception e) {
}
return null;
}
/**
* 设置单元格的值
*
* @param object
* @param method
* @param cell
* @return
* @throws Exception
*/
private static Cell setCell(Object object, Method method, Cell cell) throws Exception {
String returnType = method.getReturnType().getName();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d");
switch (returnType) {
case "java.util.Date": {
java.util.Date cellValue = (java.util.Date) method.invoke(object);
if (cellValue != null) {
cell.setCellValue(sdf.format(cellValue));
}
}
break;
case "java.lang.Float": {
Float cellValue = (java.lang.Float) method.invoke(object);
if (cellValue != null) {
cell.setCellValue(Double.valueOf(cellValue.toString()));
}
}
break;
case "java.lang.Double": {
Double cellValue = (java.lang.Double) method.invoke(object);
if (cellValue != null) {
cell.setCellValue(cellValue);
}
}
break;
case "java.lang.String": {
String cellValue = (java.lang.String) method.invoke(object);
if (StringUtil.isNotEmpty(cellValue)) {
cell.setCellValue(cellValue);
}
}
case "java.lang.Integer":{
Integer cellValue = (java.lang.Integer) method.invoke(object);
if (cellValue != null) {
cell.setCellValue(cellValue);
}
}
default:
break;
}
return cell;
}
Apache POI:Excel读写库的更多相关文章
- Apache POI - Excel
基于模板的EXCEL报表组件ExcelUtils:http://blog.csdn.net/hanqunfeng/article/details/4834875 http://blog.csdn.ne ...
- 使用Apache POI导出Excel小结--导出XLS格式文档
使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI ...
- Apache POI 实现对 Excel 文件读写
1. Apache POI 简介 Apache POI是Apache软件基金会的开放源码函式库. 提供API给Java应用程序对Microsoft Office格式档案读和写的功能. 老外起名字总是很 ...
- Apache POI读写Excel
Apache POI是Apache软件基金会的开放源码函式库,POIAPI给Java程序对Microsoft Office格式档案读和写的功能. 官方文档 [https://poi.apache.or ...
- Apache POI 读写 Excel 文件
目录 写入 Excel 文件 读取 Excel 文件 遍历 Excel 文件 需要的 maven 依赖 完整代码 写入 Excel 文件 // 写入 Excel 文件 // ============= ...
- Apache POI - Java Excel APIs
文档来源:https://www.yiibai.com/apache_poi/ POI 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显 ...
- Apache POI导出excel表格
项目中我们经常用到导出功能,将数据导出以便于审查和统计等.本文主要使用Apache POI实现导出数据. POI中文文档 简介 ApachePOI是Apache软件基金会的开放源码函式库,POI提供A ...
- Apache poi简介及代码操作Excel
一.简介 在我们进行企业的系统开发时,难免会遇到网页表格和Excel之间的操作问题(POI是个不错的选择) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序 ...
- 使用apache POI解析Excel文件
1. Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 2. POI结构 ...
随机推荐
- Oracle数据库新装之后出现的监听程序无法正常启动和运行(Oracle-12514)
修改安装目录下的配置文件 比如:F:\app\admin-PC\product\11.2.0\dbhome_1\network\admin\ 修改这个目录下的listener.ora和tns ...
- Oracle创建序列,Oracle创建序列语法
-- Oracle创建序列 Create sequence CREATE SEQUENCE SEQ_SINGER -- 序列名称 START WITH 2 -- 开始数字 MAXVALUE 999 ...
- mysql update 子查询锁表问题
mysql在Update带有子查询的时候,子查询的表会锁住,导致该表无法使用.比如 update A set comments = (select count(1) from B where id = ...
- shell基础知识---与监听服务器长连接端口状态
从未写过脚本我的最近接了俩脚本的需求,就在这分享一下我的我学到基础知识主要就四部分内容 一.变量 变量的定义 string='字符串' string="字符串" num=808st ...
- python环境Anaconda的安装
本人最开始的的环境为:win10 + 32位的python 最近想学习一下爬虫,听说某些库需要64的python才能实现(本人也是小白,只是平时喜欢折腾,这里是听说,暂时没有能力解释),无奈之下只好卸 ...
- 【Hadoop故障处理】全分布下,DataNode进程正常启动,但是网页上不显示,并且DataNode节点为空
[故障背景] DataNode进程正常启动,但是网页上不显示,并且DataNode节点为空. /etc/hosts 的ip和hostname配置正常,各个机器之间能够ping通. [日志错误信息] ...
- PHP通过curl向其它服务器发请求并返回数据
在很多时候,我们都需要请求第三方的服务器来获取一些数据,比如token,比如百度的主动推送,那么我们的php如何实现向第三方服务器发请求呢?我们可以通过curl来实现 首先定义请求的url,然后创建h ...
- hadoop生态搭建(3节点)-15.Nginx_Keepalived_Tomcat配置
# Nginx+Tomcat搭建高可用服务器名称 预装软件 IP地址Nginx服务器 Nginx1 192.168.6.131Nginx服务器 Nginx2 192.168.6.132 # ===== ...
- 第5天 Java基础语法
第5天 Java基础语法 今日内容介绍 方法 方法 方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这 ...
- C语言调整数组使奇数全部都位于偶数前面
//输入一个整数数组,实现一个函数,//来调整该数组中数字的顺序使得数组中所有的奇数 位于数组的前半部分,//所有偶数 位于数组的后半部分. #include<stdio.h>#inclu ...