`

poi 操作excel

 
阅读更多
本篇面向对象为Java的初学者,从下载必备软件到创建一个空白的POI工程,已经熟练掌握环境搭建的请跳过此文。

开发环境为windowsXP-SP2,Eclipse3.2,JDK1.5.07,其实差不多都行,不会有太大的差异。本文从POI下载开始讲解,前提是开发环境包括系统变量等等已经正确设置完毕。

1.POI的下载

截至本文发表,POI最新版本是3.0.1,距离上一个Final版本有3年了吧,以至于我差点儿就把他放弃了——以为没人管了。官方的公告讲,这一版主要是追加了一些新的特性和BUG修正,不过稍微有点儿遗憾的是,还不能很好的操作Excel2007。

POI官方网址:



JAR包下载:



源码下载:




下载上面的JAR和源码(源码不是必须的,但是为了早日修得正果,深入系统的看看POI代码还是有必要的)并解压待用。

2.用Eclipse搭建项目


• 打开Eclipse
•依次点击File->New->Java Project
•输入项目名称,本例中设置为POI
•单击完成
•在项目上点击右键->New->Folder
•输入文件夹名称lib
•把刚才解压的poi-3.0.1-FINAL-20070705.jar复制过来
•右键点击项目,选择Properties
•在左侧列表里选中Java Build Path,右侧选中Libraries
•点击Add JARs,选择POI项目的lib下的所有文件
•两次OK确认,回到Eclipse界面

小技巧,快捷操作:可以用鼠标左键选中poi-3.0.1-FINAL-20070705.jar但不松开,拖到任务栏的Eclipse图标上等候1秒左右,Eclipse会自动弹起来,依然不松开移动到lib文件夹上,这个时候鼠标后面跟个十字符号,松开左键,就完成了复制动作。这个是对整个windows系统都好用的快捷复制方式,视源盘符和目标盘符的不同偶尔会用到Ctrl键。


到此为止,我们做好了POI学习的前提准备,接下来将从最简单的文档创建开始一步一步学习怎样让POI更好的为我们工作。

 

第一讲 :基本的Excel读写

本文主要演示一下POI的基本操作,例如怎样读取和创建一个具体的Excel文件。按照惯例,拿HelloWorld说事儿。

说明:本文主要内容皆包含于官方帮助手册,之所以要拿出来,出于两个原因,手册是英文的+手册是对应2.5.1的。

核心代码如下,注释部分为讲解。 这里只挑干的讲,完整的代码请参考(下载代码)。


//创建一个空白的WorkBook

HSSFWorkbook wb = new HSSFWorkbook();

//基于上面的WorkBook创建属于此WorkBook的Sheet,

//3.0.1版在使用全角Sheet名的时候不必再setEncdoing了,个人感觉方便了许多。

HSSFSheet st = wb.createSheet("测试页");

//创建属于上面Sheet的Row,参数0可以是0~65535之间的任何一个,

//注意,尽管参数是Int类型,但是Excel最多支持65536行

HSSFRow row = st.createRow(0);

//创建属于上面Row的Cell,参数0可以是0~255之间的任何一个,

//同样,是因为Excel最大支持的列数为256列

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

//设置此单元格的格式为文本,此句可以省略,Excel会自动识别。

//其他还有几种常用的格式,请参考本文底部的补充部分。

cell.setCellType(HSSFCell.CELL_TYPE_STRING);

//此处是3.0.1版的改进之处,上一版可以直接setCellValue("Hello, World!"),

//但是在3.0.1里,被deprecated了。

cell.setCellValue(new HSSFRichTextString("Hello, World!"));

//创建一个文件输出流,指定到C盘根目录下(C盘都有吧?)

//xls是Excel97-2003的标准扩展名,2007是xlsx,目前的POI能直接生产的还是xls格式,

//如果此处把扩展名改成xlsx,在用Excel2007打开此文件时会报错。

FileOutputStream writeFile = new FileOutputStream("c:/helloworld.xls");

//把WorkBook写到流里

wb.write(writeFile);

//记得手动关闭流,官方文档已经做了特别说明,说POI不负责关闭用户打开的流。所以...

writeFile.close();


上面就是创建一个新文档的简易代码,下面的例子是读取刚才创建的Excel并把读取到的内容显示在控制台上。


//指定要读取的文件,本例使用上面生成的helloworld.xls

FileInputStream readFile = new FileInputStream("c:/helloworld.xls");

//创建一个WorkBook,从指定的文件流中创建,即上面指定了的文件流

HSSFWorkbook wb = new HSSFWorkbook(readFile);

//获取名称为“测试页”的sheet

//注意,如果不能确定具体的名称,可以用getSheetAt(int)方法取得Sheet

HSSFSheet st = wb.getSheet("测试页");

//获得第一行,同上,如果此行没有被创建过则抛出异常

HSSFRow row = st.getRow(0);

//获取第一个单元格,如果没有被创建过则抛出异常

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

//把cell中的内容按字符串方式读取出来,并显示在控制台上

//注意,getRichStringCellValue()方法是3.0.1新追加的,

//老版本中的getStringCellValue()方法被deprecated了

System.out.println(cell.getRichStringCellValue());

//记得关闭流

readFile.close();


上面对创建和读取分别举例说明,回顾两段代码,不难看出POI操作Excel的“套路”:

•获得一个WorkBook(准确说是HSSFWorkBook,对于POI来说,WorkBook是“另有其类”,以下类同)
•获得要读/写的Sheet对象
•获得要操作的Row对象
•获得最小单位——Cell对象

然后就可以随意的读取、写入了。



--------------------------------------------------------------------------------

 


关于单元格格式的补充:


单元格一共有如下几种格式, 都是HSSFCell类的静态共有属性,


•CELL_TYPE_NUMERIC - 数字格式
•CELL_TYPE_STRING - 字符串(默认)
•CELL_TYPE_FORMULA - 公式
•CELL_TYPE_BLANK - 空白
•CELL_TYPE_BOOLEAN - 布尔
•CELL_TYPE_ERROR - 错误
第二讲 :单元格边框、字体及颜色

此文概要性的讲述了一下单元格的边框、字体以及颜色的设置方式,在POI中,这一切都是通过实例化HSSFCellStyle对象来实现的,HSSFCellStyle类还有很多其他实际有用方法,本例中只是取平时用的比较普遍的一些设置来做演示的。好,开始讲解了……


// 设置行号

row.setHeightInPoints((short) 50);

// 设置列宽,(256 * 50)这种写法是因为width参数单位是单个字符的256分之一

st.setColumnWidth(cell.getCellNum(), (short) (256 * 50));

// 让HSSFWorkbook创建一个单元格样式的对象

// 小技巧:在多处用到完全一样的样式的时候可以用工厂模式生产

HSSFCellStyle cellStyle = wb.createCellStyle();

// 设置单元格的横向和纵向对齐方式,具体参数就不列了,参考HSSFCellStyle

cellStyle.setAlignment(HSSFCellStyle.ALIGN_JUSTIFY);

cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

// 这个地方是用来在单元格里画斜线的

// 原理是在指定的两个点之间画线,然后默认情况此线会随着单元格的变化而变化

// 类似Excel那种设置边框的方式达到的斜线效果目前好像POI不支持

// 如果是我疏忽了请记得告诉我一些,先行谢过啦

HSSFPatriarch patriarch = st.createDrawingPatriarch();

HSSFClientAnchor anchor = new HSSFClientAnchor();

anchor.setAnchor(cell.getCellNum(), row.getRowNum(), 0, 0, (short) (cell.getCellNum() + 1),

row.getRowNum() + 1, 0, 0);

patriarch.createSimpleShape(anchor);

// 设置单元格的文本方式为可多行编写方式

cellStyle.setWrapText(true);

// 设置单元格的填充方式,以及前景颜色和背景颜色

// 三点注意:

// 1.如果需要前景颜色或背景颜色,一定要指定填充方式,两者顺序无所谓;

// 2.如果同时存在前景颜色和背景颜色,前景颜色的设置要写在前面;

// 3.前景颜色不是字体颜色。

cellStyle.setFillPattern(HSSFCellStyle.DIAMONDS);

cellStyle.setFillForegroundColor(HSSFColor.RED.index);

cellStyle.setFillBackgroundColor(HSSFColor.LIGHT_YELLOW.index);

// 设置单元格底部的边框及其样式和颜色

// 这里仅设置了底边边框,左边框、右边框和顶边框同理可设

cellStyle.setBorderBottom(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);

cellStyle.setBottomBorderColor(HSSFColor.DARK_RED.index);

// 创建一个字体对象,因为字体也是单元格格式的一部分,所以从属于HSSFCellStyle

// 下面几个字体的相关设置望文生义,就不用一一说明了吧

HSSFFont font = wb.createFont();

font.setFontName("宋体");

font.setItalic(true);

font.setColor(HSSFColor.BLUE.index);

font.setFontHeightInPoints((short) 20);

font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

// 将字体对象赋值给单元格样式对象

cellStyle.setFont(font);

// 将单元格样式对应应用于单元格

cell.setCellStyle(cellStyle);


这样就OK了,可以可以看到效果了。



补充,各个章节的例子最终都在同一个附件内,下载的时候下任何一个页面内的都可以,都是一样的。

 

 

 

Java-Excel报表开发POI—合并、分组及冻结

Java-Excel报表开发POI系列讲座

第三讲 :单元格的合并、数据行的分组以及Excel窗口的冻结

本来想把这三个东西分开来实现的,后来发现分开后内容都很少,于是就合在一起说吧。那总不能干巴巴的列几个例子就完了吧,那就拿比较初级但又会经常遇到的表格类数据的统计的设计来做个小例子。(源码下载)

结果发现——还真够辛苦的。

这次先看效果图吧,其中的竖排并不是真正意义上Excel那种设置的竖排,而是稍微转变了一下输出的方式实现的,因为老外的英文单词没有这种竖排的可能(顶多是旋转,但是那样字体就变了)。除此之外想到的另外一种竖排文字的实现方式就是样式旋转+字体旋转,没测试,不知道是否可用,谁有功夫实现一下,然后记得告诉我结果啊。



老样子,把核心的代码和简要的说明列出来大家看一下吧。


// 这里首先创建一个单元格样式对象,设置了四周的边框以及字体可以换行

  // 其中的字体换行是用来竖向显示其中的一个单元格的

  // 更好的一点儿做法是再做一个单独的单元格样式对象

  // 要不然在处理自动列宽的时候可能会有点儿小问题

  HSSFCellStyle normalStyle = wb.createCellStyle();

  normalStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

  normalStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

  normalStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

  normalStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

  normalStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

  normalStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

  normalStyle.setWrapText(true);

  // 合并单元格A1-C1,填入内容的时候添到第一个格子里就可以

  // 但是注意一点:单元格合并後设置边框只在原第一个上有效,

  // 如果想应用的合并後的整体,则需要一个个的Create出单元格并应用样式

  // 这个明显是一个不太方便的操作,期待POI下一版的改进了

  st.addMergedRegion(new Region(0, (short) 0, 0, (short) 2));

  HSSFRow row = st.createRow(0);

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

  cell.setCellValue(new HSSFRichTextString("业务一览表"));

  cell.setCellStyle(normalStyle);

  row.createCell((short) 1).setCellStyle(normalStyle);

  row.createCell((short) 2).setCellStyle(normalStyle);

  // 设置列头,当然也可以一个一个格子的写,用循环感觉有些取巧而已

  // 同样,需要单独给每个单元格应用样式对象

  String[] seasonName = ;

  for (short i = 3; i < 7; i++)

  {

  cell = row.createCell(i);

  cell.setCellValue(new HSSFRichTextString(seasonName[i - 3]));

  cell.setCellStyle(normalStyle);

  }

  // 这个是竖排文字的实现

  // 目前POI没找到(或许没提供,或许我无知)让文字竖排的方法,

  // HSSFCellStyle.setRotation()方法是设置旋转角度的,和竖排不太一样,

  // 后来想了一下,因为只有中文等全角字符才有竖排的可能,

  // 一个英文单词要是竖排看起来恐怕会非常怪异,不过不排除搞艺术的……

  st.addMergedRegion(new Region(1, (short) 0, 6, (short) 0));

  row = st.createRow(1);

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

  cell.setCellValue(new HSSFRichTextString("地\n区\n代\n理\nA"));

  cell.setCellStyle(normalStyle);

  for (int i = 2; i < 7; i++)

  st.createRow(i).createCell((short) 0).setCellStyle(normalStyle);

  // 属于地区的二级分类,竖向合并相邻的两个单元格,其他同上

  String[] shopName = ;

  for (int i = 1; i < 6; i = i + 2)

  {

  row = st.createRow(i);

  cell = row.createCell((short) 1);

  cell.setCellValue(new HSSFRichTextString(shopName[(i - 1) / 2]));

  cell.setCellStyle(normalStyle);

  st.createRow(i + 1).createCell((short) 1).setCellStyle(normalStyle);

  st.addMergedRegion(new Region(i, (short) 1, i + 1, (short) 1));

  }

  // 属于连锁店的下一级,基本也是创建出来然后赋值+应用样式

  for (int i = 1; i < 7; i = i + 2)

  {

  cell = st.getRow(i).createCell((short) 2);

  cell.setCellValue(new HSSFRichTextString("收入"));

  cell.setCellStyle(normalStyle);

  cell = st.getRow(i + 1).createCell((short) 2);

  cell.setCellValue(new HSSFRichTextString("支出"));

  cell.setCellStyle(normalStyle);

  }

  // 数据部分,直接Create然后应用样式,有数据的话这个地方就打数据好了

  for (int i = 1; i < 7; i++)

  for (short j = 3; j < 7; j++)

  st.createRow(i).createCell(j).setCellStyle(normalStyle);

  // 冻结Excel的窗口,边界为数据部分的边界

  st.createFreezePane(3, 1);

  // 按照连锁店级别分组(当然实际情况这样分组没啥意义)

  for (int i = 1; i < 7; i = i + 2)

  st.groupRow(i, i);

  // 按照地区分组

  st.groupRow(1, 5);


其实这样实现起来是不是很麻烦呢?答案是:是。

其实这只是举个例子,熟悉一下POI的各种API而已,真正要实现这样一个表格的时候,例如项目需要制作报表等等,通常的做法都是事先把格式一切的东西都手动制作好(这个做好了的文件在实际的项目里我们称之为“数据模板”,简称“模板”),然后在Java应用中适当的时机把这个文件读进来修改,最后再另存到指定的位置或者传递给下一个处理者(例如以流的方式送给Servlet等等),这样其实POI具体做的事情就是向模板里写业务的数据,还是很方便快捷的。
分享到:
评论

相关推荐

    poi 操作excel案例 直接运行 适合参考

    标题中的“poi操作excel案例”指的是使用Apache POI库来处理Excel文件的示例项目。Apache POI是一个开源的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Excel工作簿(XLS和XLSX)。在这个...

    POI操作Excel常用方法总结

    这篇博客文章“POI操作Excel常用方法总结”可能详细介绍了如何利用Apache POI库在Java环境中读写Excel文件。以下是对该主题的一些关键知识点的详细说明: 1. **Apache POI介绍**: Apache POI是开源项目,提供了...

    poi操作excel所需完整jar包

    "poi操作excel所需完整jar包"指的是包含了所有必要组件的Apache POI库,这样在导入IDE并添加到构建路径后,就可以避免出现`NoClassDefFoundError`这样的运行时错误。 Apache POI 提供了丰富的API,允许开发者读取、...

    POI生成Excel POI操作Excel POI读取Excel POI类库

    Apache POI是一个强大的Java库,专门用于处理...通过lib.rar和Poi02.rar中的示例代码,你可以更深入地了解和学习POI操作Excel的具体实现。在实践中,结合这些资源,你将能够熟练地在Java Web项目中集成Excel处理功能。

    java 通过poi操作excel jar包

    标题中的"java通过poi操作excel jar包"指的是使用Apache POI库来处理Excel文件的Java程序,通常需要引入特定版本的POI JAR包。在这个案例中,我们有两个版本的JAR包可供使用:poi_3.17.jar和poi_3.15.jar。这些版本...

    poi操作excel表格导入和导出

    在“poi操作excel表格导入和导出”这个主题中,我们将深入探讨如何利用Apache POI进行Excel数据的处理,包括导入和导出。 一、Apache POI简介 Apache POI是一个开源项目,它提供了API来处理Microsoft Office格式的...

    poi操作excel的Demo

    这个"poi操作excel的Demo"很可能是提供了一个使用Apache POI库来读取、写入或修改Excel文件的示例代码。下面将详细介绍Apache POI在处理Excel时的一些关键知识点。 1. **Apache POI概述**: Apache POI 是Java平台...

    POI操作Excel的封装

    在这个场景中,"POI操作Excel的封装"指的是对POI API进行的高级抽象和简化,以便于开发人员更方便地处理Excel文件。通过反射和约定,可以创建一个易于使用的API,隐藏底层复杂的POI细节。 反射是Java编程语言中的一...

    Java Poi 操作excel的API 好用

    二、Java POI操作Excel的核心功能 1. 创建新的Excel工作簿 使用`WorkbookFactory.create()`方法可以创建一个新的Excel工作簿对象,然后通过工作簿对象创建工作表。 2. 读取Excel工作簿 同样,使用`WorkbookFactory....

    poi操作excel所需jar包及poi源码

    poi操作excel所需jar包及poi源码 包含内容 poi-3.7.jar poi-ooxml-3.7.jar poi-ooxml-schemas-3.7.jar poi-scratchpad-3.7.jar Lib--&gt;commons-logging-1.1.jar lib--&gt;junit-3.8.1.jar lib--&gt;log4j.1.2.13.jar ooxml-...

    poi操作Excel文件jar包

    "poi操作Excel文件jar包"指的是包含Apache POI库的Java归档(JAR)文件,可以集成到Java项目中以实现Excel文件的处理功能。 1. **Apache POI 简介** Apache POI 是Apache软件基金会的一个顶级项目,最初由Markus ...

    poi操作excel2007

    接下来,我们将讨论如何使用Apache POI操作Excel 2007(.xlsx)文件的主要步骤: 1. **创建Workbook对象**:这是Excel工作簿的Java表示。你可以使用`XSSFWorkbook`类来创建一个新的Excel工作簿。 ```java import...

    POI操作excel的 JAR包

    这个“POI操作excel的JAR包”是Apache POI项目的一部分,它提供了一系列API,使得Java开发者可以方便地创建、读取、修改Excel电子表格。 在Java开发中,使用Apache POI库可以实现以下功能: 1. **创建Excel工作簿*...

    poi操作excel全部jar包

    "poi操作excel全部jar包"指的是使用Apache POI进行Excel操作所需的所有库文件集合,通常包含多个JAR文件,每个文件服务于不同的功能模块。 Apache POI 主要分为三个部分: 1. **HSSF**: 这是处理Microsoft Excel的...

    java poi操作excel批量导入导出项目需要的jar包

    Java中的Apache POI库是处理...以上是Java POI操作Excel的基本概念和关键点,理解并熟练运用这些知识点,你就可以在项目中高效地进行批量导入导出操作了。记住,持续学习和适应新的库版本是保持技术领先的关键。

    POI操作Excel 调用高德API操作示例

    使用POI操作Excel调用高德地图API操作Excel示例

    poi操作excel的jar包集.rar

    "poi操作excel的jar包集.rar"文件包含了运行Apache POI库所需的全部依赖,让你能够无缝进行Excel文件的操作,无论是2003的老版本还是2007及以后的新版本。 首先,我们需要理解Apache POI的主要组件: 1. **HSSF...

    POI操作Excel总结实例

    这个"POI操作Excel总结实例"的资料可能包含了一系列示例代码,教你如何利用Apache POI库来读取、写入和操作Excel文件。下面,我将详细讲解关于POI操作Excel的一些关键知识点。 1. **创建Excel工作簿(Workbook)** ...

    POI 操作Excel工具类

    在这个场景中,我们关注的是如何使用 POI 操作 Excel 工具类。这个工具类可以帮助开发者在 Java 环境下读写 Excel 文件,从而实现数据导入、导出等功能。下面将详细介绍 POI 操作 Excel 的关键知识点。 1. **工作簿...

Global site tag (gtag.js) - Google Analytics