Apache POI 实现对 Excel 文件读写
1. Apache POI 简介
Apache POI是Apache软件基金会的开放源码函式库。
提供API给Java应用程序对Microsoft Office格式档案读和写的功能。
老外起名字总是很谦虚,POI为(Poor Obfuscation Implementation)的首字母缩写,意为“可怜的模糊实现”。
如果你查看过 Apache 开源库中的任意项目的源码,你会发现恰到好处的设计模式、高内聚低耦合的模块关系、
到位的接口抽象、优雅的实现方式,这样的一些特点。
o(︶︿︶)o 唉 需要多严谨的思维、多大的代码实现量,多少项目的设计积累,才能达到那样的高度?
POI 中主要提供的读写 Microsoft Office 功能点如下:
- HSSF -- 提供读写Microsoft Excel格式档案的功能。
- XSSF -- 提供读写Microsoft Excel OOXML格式档案的功能。
- HWPF -- 提供读写Microsoft Word格式档案的功能。
- HSLF -- 提供读写Microsoft PowerPoint格式档案的功能。
- HDGF -- 提供读写Microsoft Visio格式档案的功能。
本文借一次使用POI 实现读写 Excel 的过程,记述其中具体POI运用的方式。
由搜索引擎点进来的同学,上面这一句话就是本文的主旨句。若能解决你问题,请往下细看。
项目中使用的是最新的 poi-3.14-20160307.jar,百度云地址:http://pan.baidu.com/s/1bnWFWg3 密码: kame
Oschina 收录地址:https://www.oschina.net/p/poi
官方 Demo : http://poi.apache.org/spreadsheet/examples.html#hssf-only
2.一点点实现前的设计
因项目比较大,下面为单独新建工程后的例子。
3.POI 写 Excel
上图左侧用例图为 POI 写 Excel
a.getExcelData: 获取需要输出到Excel数据,这里的数据获取可以是从持久层,页面展示层......
(例子中的数据为Mysql自有数据库中表help_categroy 表记录),其中的 JavaBean建立 与 数据库获取的过程这里就不说了。
获取数据的数据类型是这样的 List<HelpCategory>
b.POI Write Workbook:这里才是关键的地方,使用POI 将数据实例化为 HSSFWorkbook。核心代码如下:
public HSSFWorkbook expExcel(List<HelpCategory> helpCategories) {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
createSheetStyle(workbook, sheet); HSSFRow row = sheet.createRow(0);
HSSFCell cell;
HelpCategory category = new HelpCategory();
Field[] fields = category.getClass().getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
cell = row.createCell(j);
cell.setCellValue(fields[j].getName());
cell.setCellStyle(this.textAlignCenter);
} for (int i = 0; i < helpCategories.size(); i++) {
category = helpCategories.get(i);
row = sheet.createRow(i + 1);
for (int k = 0; k < fields.length; k++) {
Field field = fields[k];
Object o = invokeGet(category, field.getName());
cell = row.createCell(k);
cell.setCellValue(o != null ? o.toString() : "");
cell.setCellStyle((k == 0 || k == 1) ? this.textAlignCenter : this.textAlignLeft);
}
}
return workbook;
}
Core Code
获取JavaBean字段值作为表头,并设置表头的样式:
HSSFRow row = sheet.createRow(0);
HSSFCell cell;
HelpCategory category = new HelpCategory();
Field[] fields = category.getClass().getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
cell = row.createCell(j);
cell.setCellValue(fields[j].getName());
cell.setCellStyle(this.textAlignCenter);
}
获取JavaBean HelpCategory 中字段的值填充到对应的表格中,并设置样式:
for (int i = 0; i < helpCategories.size(); i++) {
category = helpCategories.get(i);
row = sheet.createRow(i + 1);
for (int k = 0; k < fields.length; k++) {
Field field = fields[k];
Object o = invokeGet(category, field.getName());
cell = row.createCell(k);
cell.setCellValue(o != null ? o.toString() : "");
cell.setCellStyle((k == 0 || k == 1) ? this.textAlignCenter : this.textAlignLeft);
}
}
这里面用的了一点反射的东西,来获取javaBean属性的值。
如果你觉得反射的效率有点差劲,可以自己构造一个Map数据集合,同样能达到这样的效果。
private Object invokeGet(Object o, String fieldName) {
Method method = getGetMethod(o.getClass(), fieldName);
try {
return method.invoke(o, new Object[0]);
} catch (Exception e) {
e.printStackTrace();
}
return null;
} private Method getGetMethod(Class objectClass, String fieldName) {
StringBuilder sb = new StringBuilder();
sb.append("get");
sb.append(fieldName.substring(0, 1).toUpperCase());
sb.append(fieldName.substring(1));
try {
return objectClass.getMethod(sb.toString());
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
同样你可以设置表格样式、边框样式:
private void createSheetStyle(HSSFWorkbook _workbook, HSSFSheet _sheet) {
// 设置表字体
HSSFFont font10 = _workbook.createFont();
font10.setFontHeightInPoints((short) 12);
font10.setFontName("黑体");
// 设置表样
this.textAlignCenter = getCellStyle(_workbook, font10, HSSFCellStyle.ALIGN_CENTER);
this.textAlignLeft = getCellStyle(_workbook, font10, HSSFCellStyle.ALIGN_LEFT);
// 设置列宽
_sheet.setColumnWidth(0, 4000);
_sheet.setColumnWidth(1, 4000);
_sheet.setColumnWidth(2, 10000);
_sheet.setColumnWidth(3, 10000);
}
上面的样式设置,如果还满足不了你的功能需求,更多的设置请参考博客:
http://langhua9527.iteye.com/blog/388005
http://blog.csdn.net/tolcf/article/details/48346697
4.POI 读 Excel
上图左侧用例图为 POI 写 Excel
a.getExcleFile:获取要读取的Excel文件...这里就不说了。(注意:判断获取的文件后缀名)
String fileName = excel.getName();
int iIndex = fileName.lastIndexOf(".");
String ext = (iIndex < 0) ? "" : fileName.substring(iIndex + 1).toLowerCase();
if (!"xls,xlsx".contains(ext) || "".contains(ext)) {
System.out.println("文件类型不是EXCEL!");
}
b.POI Read Workbook:这里就是重点啦,使用POI读取Excel文件,解析并进行保存到你自己数据类型当中。
ArrayList<HelpCategory> categories = new ArrayList<>();
try {
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(excel));
HSSFWorkbook workbook = new HSSFWorkbook(poifsFileSystem);
HSSFSheet sheet = workbook.getSheetAt(0); HelpCategory category = new HelpCategory();
Field[] declaredField = category.getClass().getDeclaredFields();
for (int k = 1; k <= sheet.getLastRowNum(); k++) {
HSSFRow row = sheet.getRow(k);
category = new HelpCategory();
for (int j = 0; j < declaredField.length; j++) {
HSSFCell cell = row.getCell(j);
invokeSet(category, declaredField[j].getName(), cell.getStringCellValue());
}
categories.add(category);
}
} catch (Exception e) {
e.printStackTrace();
}
上面也同样用到了一些反射的东西,这里获取JavaBean 的set方法,来设置具体的属性。
public void invokeSet(Object o, String fieldName, Object value) {
Method method = getSetMethod(o.getClass(), fieldName);
try {
method.invoke(o, new Object[]{value});
} catch (Exception e) {
e.printStackTrace();
}
} public Method getSetMethod(Class objectClass, String fieldName) {
try {
Class[] parameterTypes = new Class[1];
Field field = objectClass.getDeclaredField(fieldName);
parameterTypes[0] = field.getType();
StringBuffer sb = new StringBuffer();
sb.append("set");
sb.append(fieldName.substring(0, 1).toUpperCase());
sb.append(fieldName.substring(1));
Method method = objectClass.getMethod(sb.toString(), parameterTypes);
return method;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
上述例子仅当作抛砖引玉之用,项目中的具体需求随时都有其他的变化。
如获取数据的途径可能是多表联合查询或者是展现层、结果需要进行其他运算、写Excel表格样式的变化........
但熟悉具体核心读写实现,已不变应万变,可为上将。
Apache POI 实现对 Excel 文件读写的更多相关文章
- JAVA-----基于POI实现对Excel导入
在日常项目开发中, 数据录入和导出是十分普遍的需求,因此,导入导出也成为了开发中一个经典的功能.数据导出的格式一般是excel或者pdf,而批量导入的信息一般是借助excel来减轻工作量,提高效率. ...
- 使用POI来实现对Excel的读写操作
事实上我感觉直接贴代码就好了.代码里面差点儿做到每一行一个凝视.应该看起来会比較简单 代码托管在github上:https://github.com/chsj1/ExcelUtils package ...
- C#实现对Word文件读写[转]
手头上的一个项目报表相对比较简单,所以报表打印采用VBA引擎,通过定制Word模版,然后根据模版需要填充数据,然后OK,打印即可. 实现方法:首先需要引用VBA组建,我用的是Office2003 Pr ...
- 使用jxl操作之一: 实现对Excel简单读写操作
项目目录树 对象类UserObject UserObject.java package com.dlab.jxl; public class UserObject { private String u ...
- java中使用poi导入导出excel文件_并自定义日期格式
Apache POI项目的使命是创造和保持java API操纵各种文件格式基于Office Open XML标准(OOXML)和微软的OLE复合文档格式(OLE2)2.总之,你可以读写Excel文件使 ...
- POI读取/写入Excel文件
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io ...
- 通过vb.net 和NPOI实现对excel的读操作
通过vb.net 和NPOI实现对excel的读操作,很久很久前用过vb,这次朋友的代码是vb.net写的需要一个excel的操作, 就顾着着实现功能了,大家凑合着看吧 Option Explicit ...
- Apache POI组件操作Excel,制作报表(四)
Apache POI组件操作Excel,制作报表(四) 博客分类: 探索实践 ExcelApacheSpringMVCServlet 上一篇我们介绍了如何制作复杂报表的分析和设计,本篇结合S ...
- Apache POI组件操作Excel,制作报表(三)
Apache POI组件操作Excel,制作报表(三) 博客分类: 探索实践 ExcelApache算法Office单元测试 上一篇介绍了POI组件操作Excel时如何对单元格和行进行设置, ...
随机推荐
- 华为S5700S-52P-LI-AC千兆网管交换机web登录界面配置
研究一下午,包装附的说明书根本就是错误的,通过技术售后和官方的文档结合,总算可以登录交换机的web管理界面. 首先需要使用通讯控制线缆(包装中附)连接电脑和交换机,一头接交换机的Console口,一头 ...
- ARC下的所有权修饰符
ARC有效时,id类型必须加上所有权修饰符 下面为三种等效的声明,为了便于和二级指针的情况联系起来,采用第一种. NSError * __weak error = nil; NSError __wea ...
- Linux服务器文件删除空间未释放的问题
一.问题起源 在Linux系统中,通过rm删除文件将会从文件系统的目录结构上解除链接(unlink),如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件磁盘空间也一直被占用 这样就 ...
- 工作中常用的Linux命令:mkdir命令
本文链接:http://www.cnblogs.com/MartinChentf/p/6076075.html (转载请注明出处) 在Linux系统中,mkdir命令用来创建一个目录或一个级联目录. ...
- Type mismatch: cannot convert from MainFragment to Fragment 报错
源码: FragmentTransaction mFragmentTranscation = getSupportFragmentManager().beginTransaction(); Fragm ...
- 成为 Linux 终端高手的七种武器 之七 条件执行&&
7.条件执行 Bash 也可以连续执行两条命令。 第二条命令仅在第一条命令成功执行后才会开始执行。如要如此,你可以通过键入“&&”,也就是两个“&”字符进行分隔,在同一行输入两 ...
- TFS代码变更和工作项关联,为系统变更提供完美的跟踪轨迹
TFS是微软的应用软件生命周期管理(ALM)的解决方案产品,相比我们常见的一些ALM产品,例如HP ALM, IBM Rational, Atlanssian Jira等,其最大的区别在于TFS将软件 ...
- django用户登录和注销
django版本:1.4.21. 一.准备工作 1.新建项目和app [root@yl-web-test srv]# django-admin.py startproject lxysite [roo ...
- [转]OnKeyDown Numeric Validator CLIENT SIDE
本文转自:http://forums.asp.net/t/1211724.aspx?OnKeyDown+Numeric+Validator+CLIENT+SIDE <!DOCTYPE html ...
- 使用jMeter测试Solr服务接口
之前一直用ab做简单的服务接口测试,ab功能强悍,使用简单,但是没有生成专题图和表格等功能,因此,我们决定使用jmeter来作为我们测试工具.接下来,我们将详细介绍jmeter使用的步骤,主要包括:j ...