poi java 其他_让POI架起Java与Office之间的桥梁一

本文将阐述如何用POI来读取/写入完整的Excel文件。

作者:中国IT实验室 来源:中国IT实验室 2007年8月31日

79eb091a82f2750cbd579d6c64fe1604.png

3b8150c45cdb744b6caf8a3d4371dadd.png

e479d1e590b9e515b48d400fedb6c2fc.png

本文将阐述如何用POI来读取/写入完整的Excel文件。

约定:POI项目2.0版现在已经接近正式发行阶段,开发进度迅速,不断有新的功能集成到原有的系统,同时也有对原有系统的修改。

为了保证本文的及时性,本文将按照最近的1.9开发版说明。虽然编译最近的发行版源代码也能正常运行,但现在的代码和2.0的发行版会有一些出入。

一、Excel基础

Microsoft Excel 97文件格式也被称为BIFF8,最近版本的Excel只对该格式作了少量的改动。增加对新格式的支持除了增加项目的复杂性之外,唯一的效果也许只是不得不使每个用户升级代码,没有什么实际的好处。

因此,在下文说明中,凡是提到Excel 97格式的地方其实都是指Excel从97到XP的格式。

二、HSSF概况

POI项目实现的Excel 97文件格式称为HSSF??也许你已经猜到,HSSF是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”(微软使某些原本简单的事情过分复杂,同时又过分简单地处理了某些原本需要灵活性的事情,让人不胜佩服!)

也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

前面一篇文章提到了POIFS,那么HSSF和POIFS又有什么关系呢?就象其他POI的API一样,HSSF建立在POIFS的基础上,因此在HSSF内的有些代码和前文的某些代码很相似。不过,当我们编写基于HSSF API的代码时,一般不需要了解POIFS API的细节。

HSSF为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。usermodel主要有org.apache.poi.hssf.usermodel和org.apache.poi.hssf.eventusermodel包实现(在HSSF的早期版本中,org.apache.poi.hssf.eventusermodel属于eventmodel包)。

usermodel包把Excel文件映射成我们熟悉的结构,诸如Workbook、Sheet、Row、Cell等,它把整个结构以一组对象的形式保存在内存之中。eventusermodel要求用户熟悉文件格式的底层结构,它的操作风格类似于XML的SAX API和AWT的事件模型(这就是eventusermodel名称的起源),要掌握窍门才能用好。

另外,eventusermodel的API只提供读取文件的功能,也就是说不能用这个API来修改文件。

三、通过usermodel读取文件

用HSSF的usermodel读取文件很简单。首先创建一个InputStream,然后创建一个HSSFWorkbook:

InputStream myxls = new FileInputStream("workbook.xls"));

HSSFWorkbook wb   = new HSSFWorkbook(myxls);

有了HSSFWorkbook实例,接下来就可以提取工作表、工作表的行和列,例如:

HSSFSheet sheet = wb.getSheetAt(0);    // 第一个工作表

HSSFRow row   = sheet.getRow(2);    // 第三行

HSSFCell cell  = row.getCell((short)3); // 第四个单元格

上面这段代码提取出第一个工作表第三行第四单元格。利用单元格对象可以获得它的值,提取单元格的值时请注意它的类型:

if (cell.getCellType() == HSSFCell.CELL_TYPE_STRING) {

("单元格是字符串,值是: " + cell.getStringCellValue());

} else if (cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {

("单元格是数字,值是: " + cell.getCellValue());

} else () {

("单元格的值不是字符串或数值。");

}

如果搞错了数据类型,程序将遇到异常。特别地,用HSSF处理日期数据要小心。Excel内部以数值的形式保存日期数据,区别日期数据的唯一办法是通过单元格的格式(如果你曾经在Excel中设置过日期格式,应该明白这是什么意思)。

因此,对于包含日期数据的单元格,cell.getCellType()将返回HSSFCell.CELL_TYPE_NUMERIC,不过利用工具函数HSSFDateUtil.isCellDateFormatted(cell)可以判断出单元格的值是否为日期。isCellDateFormatted函数通过比较单元格的日期和Excel的内置日期格式得出结论??可以想象,按照这种判断方法,很多时候isCellDateFormatted函数会返回否定的结论,存在一定的误判可能。

本文附录包含了一个在Servlet环境中利用HSSF创建和返回Excel工作簿的实例。

四、通过usermodel写入文件

写入XLS文件比读取XLS文件还要简单。创建一个HSSFWorkbook实例,然后在适当的时候创建一个把文件写入磁盘的OutputStream,但延迟到处理结束时创建OutputStream也可以:

HSSFWorkbook wb = new HSSFWorkbook();

FileOutputStream fileOut

= new FileOutputStream("workbook.xls");

wb.write(fileOut);

fileOut.close();

创建工作表及其内容必须从相应的父对象出发,例如:

HSSFSheet sheet = wb.createSheet();

HSSFRow row   = sheet.createRow((short)0);

HSSFCell cell  = row.createCell((short)0);

cell.setCellValue(1);

row.createCell((short)1).setCellValue(1.2);

row.createCell((short)2).setCellValue("一个字符串");

row.createCell((short)3).setCellValue(true);

如果要设置单元格的样式,首先要创建一个样式对象,然后把它指定给一个单元格??或者把它指定给多个具有相同样式的单元格,例如,如果Excel表格中有一个摘要行,摘要行的数据必须是粗体、斜体,你可以创建一个summaryRowStyle样式对象,然后把这个样式指定给所有摘要行上的单元格。

注意,CellFormat和CellStyle对象是工作簿对象的成员,单元格对象只是引用它们。

...

HSSFCellStyle style = workbook.createCellStyle();

style.setDataFormat

(HSSFDataFormat.getBuiltinFormat("($#,##0_);[Red]($#,##0)"));

style.setFillBackgroundColor(HSSFColor.AQUA.index);

style.setFillPattern(HSSFCellStyle.BIG_SPOTS);

...

someCell.setCellStyle(style);

someOtherCell.setCellStyle(style);

版本较新的HSSF允许使用数量有限的Excel公式。这一功能目前还是“Beta级质量”,正式使用之前务必仔细测试。指定公式的方式类如:someCell.setCellFormula(SUM(A1:A2:);。

当前,公式中已经可以调用所有内建的函数或操作符,但逻辑操作符和函数(例如IF函数)除外,这部分功能目前还在开发之中。

79eb091a82f2750cbd579d6c64fe1604.png

3b8150c45cdb744b6caf8a3d4371dadd.png

e479d1e590b9e515b48d400fedb6c2fc.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue ui框架_「webAPP」记录几款比较好用的vue 移动端的ui框架

有时在做项目时,不同场景的项目既要有网站,又要有手机端,为了快速开发,如果功能简单,要求不高的话,我们一般会用H5进行移动端的适配。如果采用纯html进行书写手机端的样式,往往UI的体验感非常差…

java定义基础变量语句_编程语言第一:JAVA语言基础,变量

在前面的几篇文章中我们介绍了Java的运行环境,以及Eclipse IDE的安装与使用。从今天开始我们的文章开始介绍Java开发语言的基础知识。今天主要介绍Java变量。一、什么是变量变量是指代在内存中开辟的存储空间,用于存放运算过程中需要用到的数据。例&…

spring.profiles.active配置了没生效_微服务架构之「 配置中心 」

在微服务架构的系列文章中,前面已经通过文章《微服务架构之「服务网关 」》介绍过了在微服务中服务网关的原理和应用,今天这篇文章我们继续来聊一聊微服务中另外一个重要模块:「 配置中心 」。后面还会继续介绍 服务框架、服务监控、服务治理…

公招网报照片审核处理工具_消防员招录报名照片处理工具使用说明

消防员招录报名照片处理工具使用说明请将下载的压缩包文件全部解压后,在照片处理工具文件夹中,用鼠标双击 “消防员招录报名照片处理工具.exe” 运行照片处理工具软件。本工具是消防员招录报名照片处理专用工具,只有经本工具处理符合要求的照…

php树形数据结构是什么,数据结构 之 树

概述树的章节一般分两大部分: 一部分将树,一部分将二叉树;虽然二叉树也是树,但是二叉树足够特殊,足够有用,所以重点来讲;或者说,如果不是二叉树,树的家族也不会如此的德高…

螺旋桨设计软件_第四届智能工业软件及设计技术研讨会暨2019天洑软件用户大会成功举办...

第四届智能工业软件及设计技术研讨会暨2019天洑软件用户大会于2019年6月13日-14日在辽宁省大连市召开。天洑软件用户大会至2019年已成功举办了四届,在历届会议中有来自中国、德国、瑞典、捷克、意大利、美国、加拿大、日本等各行业专家学者共同探讨最新的计算机智能…

群晖 百度网盘_海康威视联合百度网盘推出NAS私有存储 贡献带宽获积分兑网盘会员...

此前百度网盘因为限速问题遭到不少用户的吐槽,随后百度网盘推出单次付费加速由于价格过高再次被吐槽。网盘类的服务也确实需要大量的硬盘空间和服务器带宽支撑,所以对用户来说最好的办法还是自己搭建网盘。自己搭建的网盘也就是私有云存储,放…

onenetsim定位功能吗_微信小程序新增后台定位功能,你会卸载地图APP用微信导航吗...

[PConline]8月8日,根据微信官方发布的消息显示,小程序新增后台定位功能,并对自动化测试功能进行了升级。据介绍,为了满足线路导航、路线记录等服务场景下,小程序需要长时间持续定位来提供服务。当用户主动将小程序设置…

MATLAB静力学分析,锻造操作机静力学的Matlab仿真分析

由第3章中该新型锻造操作机的位置反解中的构件的位置以及角度的关系式,均为已知量。施加外力为Ftx50N,Fty300N和沿“轴方向的外力矩M 60000 N.mm。给定初始量范围,通过Matlab软件仿真,可以得到各个液压缸的驱动力的变化曲线。该新型锻造操作机…

babylonjs 设置面板位置_一篇关于开关面板的详细集合,值得收藏转发

对于大部分人来说,开关的布局,开关的种类都会是一脸懵。所以大家在装修的过程中就会迷茫,今天给大家分享一篇集合,相信通过这篇文章,问题会有所缓解~一,开关插座的分类1.电源开关分类:一位单控/…

ecs 云服务器 管理控制台_【弹性计算】教您快速学会云服务器ECS 创建命令!

云助手命令可以在ECS实例中快速完成运行自动化运维脚本、轮询进程、重置用户密码、安装或者卸载软件、更新应用以及安装补丁等一些日常任务。命令类型可以是Windows PowerShell脚本、Bat批处理命令和Linux Shell脚本,命令中支持自定义参数,方便设置变量值…

直流降压的简单方法_量血压的重大误区和简单的降压方法,尽快转告身边人!...

见五蕴皆空,度一切苦厄。舍利子,色不异空,空不异色,色即是空,空即是色,受想行识,亦复如是。舍利子,是诸法空相,不生不灭,不垢不净,不增不减。是故…

php oauth2 和 jwt,jwt-auth: thinkphp 的 jwt (JSON Web Token)身份验证扩展包,支持Swoole...

JWT-AUTHthinkphp的jwt(JSON Web Token)身份验证包。支持Header、Cookie、Param等多种传参方式。包含:验证、验证并且自动刷新等多种中间件。支持Swoole环境要求php > 7.0thinkphp ^5.1.10 || ^6.0.0说明目前支持如下三大类型加密方式:RSA,HASH,DSA。…

qt 将int型数据显示在文本框_Qt编写Online judge爬虫

一、前提刚开始接触C/Qt是需要一个项目练练手,当时听说过OJ并且网络不好,就想着把数据获取下来随时使用。后来代码写多了之后听说Python写爬虫更方便,可惜坑已经跳下去了,就一条路走到黑了。这是我代码之路的第一个完整实现完整功…

vim函数跳转 php,求助!! vim-gvim中如何让其显示函数及其参数!!

求助!! vim-gvim中如何让其显示函数及其参数!!(2012-06-05 02:25:34)标签:如何杂谈求助!!vim/gvim中如何让其显示函数及其参数!!用了一段时间的vim,发现在自动补全中发现…

php添加填空,PHP之preg_replace_callback(),将填空题的[[]]替换成______

preg_replace_callback 函数执行一个正则表达式搜索并且使用一个回调进行替换。语法图1这个函数的行为除了可以指定一个 callback 替代 replacement 进行替换字符串的计算,其他方面等同于 preg_replace()。参数说明:$pattern: 要搜索的模式,可…

怎么用php写软件老吴p,11.32 php扩展模块装安

php动态扩展模块添加因为业务需要或者编译php的时候少安装了一个模块,我们现在需要新添加一个模块,那怎么做呢?查看模块/usr/local/php/bin/php -m第一步:去php的安装目录中/ext/目录下查看有没有 你需要安装的扩展模块的包比如&a…

linux用户没有创建文件的权限设置密码,Linux学习第五章用户身份与文件权限

一、用户身份与能力Linux系统中一共有三种用户第一种:管理员 root UID 0第二种:系统用户 不需要登录系统 负责单一服务的运行 UID 0-1000第三种:普通用户 日常登录系统操作的用户 UID 1000--uid1000(zhang) gid1000(zhang) groups…

是vans_Vans 的旧海报上原来有这么多学问…

事情是这样的,某天,当我们编辑部翻开一张 Vans 70 年代的海报,发现开头上面写着:GO “JAMIN” IN VANS。这段话引起了在场的所有人的好奇。(图片来源:Vans)到底什么是 “JAMIN” 呢? 在我们刨根究底的搜寻下…

云科技网络验证源码_面向虚拟化架构和容器云的开源安全工具

随着云和虚拟技术发展,docker容器的使用越来越流行和方便。有很多企业已经把基础架构由传统实体机转移到了虚拟机化架构,基于公有云、私有云以及容器云构建在线服务。与容器相关的安全性对变得越来越重要。与传统的安全性方法相比,虚拟化架构…