APACHE POI教程

POI报表

--POIExcel交互

AURISOFT

第一章 POI简介

--Jakata Poi HSSF:纯javaExcel解决方案

在我们实际的开发中,表现层的解决方案虽然有多样,但是IE浏览器已成为最多人使用的浏览器,因为大家都用Windows。在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统、银行系统)。或者是:我们已经习惯用Excel打印。

ApacheJakata项目的POI子项目,目前比较成熟的是HSSF接口,处理MSExcel对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheetHSSFSheet)组成,一个sheet是由多个rowHSSFRow)组成,一个row是由多个cellHSSFCell)组成。

POI可以到www.apache.org下载到。实际运行时,需要有poi包就可以了。HSSF提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,还有辅助操作。有以下几种对象:

HSSFWorkbook excel的文档对象

HSSFSheet excel的表单

HSSFRow excel的行

HSSFCell excel的格子单元

HSSFFont excel字体

HSSFDataFormat 日期格式

poi1.7中才有以下2项:

HSSFHeader sheet

HSSFFooter sheet尾(只有打印的时候才能看到效果)

和这个样式

HSSFCellStyle cell样式

辅助操作包括

HSSFDateUtil 日期

HSSFPrintSetup 打印

HSSFErrorConstants 错误信息表

以下可能需要使用到如下的类    
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.HSSFFont;      
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.hssf.util.HSSFColor;

先看poi的examples包中提供的最简单的例子,建立一个空xls文件。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

import java.io.FileOutputStream;

import java.io.IOException;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class ExcelSample1 {

 public static void main(String[] args) throws IOException {

  //创建一个excel文件

  HSSFWorkbook wb= new HSSFWorkbook();

  FileOutputStream fileOut= new FileOutputStream("c:\\workbook.xls");

  // FileOutputStream fileOut= new FileOutputStream("c:/workbook.xls");

   wb.write(fileOut);

   fileOut.close();

    }

}

 

通过这个例子,我们在c盘下建立的是一个空白的xls文件(不是空文件)。在此基础上,我们可以进一步看其它的例子。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

import org.apache.poi.hssf.usermodel.*;

import java.io.FileOutputStream;

import java.io.IOException;

public class CreateCells

{

public static void main(String[] args) throws IOException

{

HSSFWorkbook wb = new HSSFWorkbook(); //建立新HSSFWorkbook对象

HSSFSheet sheet = wb.createSheet("new sheet"); //建立新的sheet对象

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

//在sheet里创建一行,参数为行号(第一行,此处可想象成数组)

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

//在row里建立新cell(单元格),参数为列号(第一列)

cell.setCellvalue(1); //设置cell的整数类型的值

row.createCell((short)1).setCellvalue(1.2); //设置cell浮点类型的值

row.createCell((short)2).setCellvalue("test"); //设置cell字符类型的值

row.createCell((short)3).setCellvalue(true); //设置cell布尔类型的值 

HSSFCellStyle cellStyle = wb.createCellStyle(); //建立新的cell样式

cellStyle.setDataFormat(HSSFDataFormat. getBuiltinFormat("m/d/yy h:mm"));

//设置cell样式为定制的日期格式

HSSFCell dCell =row.createCell((short)4);

dCell.setCellvalue(new Date()); //设置cell为日期类型的值

dCell.setCellStyle(cellStyle); //设置该cell日期的显示格式

HSSFCell csCell =row.createCell((short)5);

csCell.setEncoding(HSSFCell.ENCODING_UTF_16);

//设置cell编码解决中文高位字节截断

csCell.setCellvalue("中文测试_Chinese Words Test"); //设置中西文结合字符串

row.createCell((short)6).setCellType(HSSFCell.CELL_TYPE_ERROR);

//建立错误cell

FileOutputStream fileOut = new FileOutputStream("workbook.xls");

wb.write(fileOut);

fileOut.close();

}

}

通过这个例子,我们可以清楚的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。    
尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。    
其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。

感觉上面的操作比较的繁琐,然后就自己写了一个方法。这个方法不需要事先创建rowcell,直接进行cteateCell就可以了,在程序中会自动进行判断,如果不存在的话会创建。

?


1

2

3

4

5

6

7

8

private static void cteateCell(HSSFWorkbook wb,HSSFRow row,short col,short align,String val){

HSSFCell cell = row.createCell(col);

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

cell.setCellValue(val);

HSSFCellStyle cellstyle = wb.createCellStyle();

cellstyle.setAlignment(align);

cell.setCellStyle(cellstyle);

}

对里面的几个参数的说明:

short col 应该是你的cell单元格的位置也就是列号;

short align 应该是你的对齐方式;

String val 应该是你单元格里面要添加的值;

具体的调用如下:

?


1

2

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

cteateCell(wb,row,(short)0,HSSFCellStyle.ALIGN_CENTER_SELECTION,"SampleID");

在上边的例子里我们看到了要设置一个单元格里面信息的格式(例如,要将信息居中)设置的操作如下:

?


1

2

3

HSSFCellStyle cellstyle = wb.createCellStyle();

cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);

cell.setCellStyle(cellstyle);

还有我们我们经常会用到的合并单元格,在这里我们也有这样的操作,代码如下:


sheet.addMergedRegion(new Region(1,(short)1,2,(short)4));

这里面我们还要介绍一个经常会遇到的问题,就是怎么来冻结一个窗口。poi也为我们集成了这样的事情了。代码如下:

?


1

sheet.createFreezePane(1,2);

l 在这里我们需要注意的是

一、 该方法是在一个具体的sheet里面来进行操作。

二、 方法createFreezepane;2个参数。前一个参数代表列;后一个参数代表行。

上边的代码对应的excel文件如下:

我么在画面上看到了明显的两条黑线,这就是冻结的窗口。

然后我们来看一个完整的小例子,在这个例子里面我们要做的事情是要把数据库里面的一张表,把他里面的数据导出到一个具体的Excel文件当中。首先,我们来做一个数据库连接的bean

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class AA

{

public static void main(String[] args)

{

String url = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=master";

//为了方便测试,我连接的数据库是master

Connection con = null;

Statement sta = null;

ResultSet res=null

try {

Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");

con = DriverManager.getConnection(url, "sa""");

sta = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY); 

res=sta.executeQuery("select * from spt_values"); 

//查询的是master面的一张表 

catch (Exception e) {

e.printStackTrace();

try

{

FixationExcel fe=new FixationExcel();

fe.createFixationSheet(res);

// createFixationSheet()方法要接收一个ResultSet类型的参数

fe.writeExcel("FirstExcel"); 

//此处的FirstExcel是你要生成的excel文件的名字 

}

catch(Exception e)

{

System.out.println("AAAAAAAAAA");

e.printStackTrace();

System.out.println("");

}

}

然后就是我们具体的FixationExcel这个类了,这里面写的

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

import java.io.FileOutputStream;

import java.sql.ResultSet;

import java.sql.SQLException;

import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

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.hssf.util.Region;

public class FixationExcel implements SuperExcel

{

private HSSFWorkbook wb=null;

public FixationExcel()

{

wb=new HSSFWorkbook();

}

public void createFixationSheet(ResultSet res)

{

HSSFSheet sheet=wb.createSheet("new sheet");

wb.setSheetName(0,"Case-control",HSSFWorkbook.ENCODING_UTF_16);

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

sheet.createFreezePane(1,2);

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

cell.setCellValue("SNP110");

HSSFCellStyle cellstyle=wb.createCellStyle();

cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);

cell.setCellStyle(cellstyle);

sheet.addMergedRegion(new Region(0,(short)6,0,(short)7));

HSSFCell cell1=row.createCell((short)8);

cell1.setCellValue("SNP102");

cell1.setCellStyle(cellstyle);

sheet.addMergedRegion(new Region(0,(short)8,0,(short)9));

HSSFRow row1=sheet.createRow((short)1);

cteateCell(wb,row1,(short)0,HSSFCellStyle.ALIGN_CENTER_SELECTION,

"SampleID");

cteateCell(wb,row1,(short)1,HSSFCellStyle.ALIGN_CENTER_SELECTION,"ID"); cteateCell(wb,row1,(short)2,HSSFCellStyle.ALIGN_CENTER_SELECTION,"PID"); cteateCell(wb,row1,(short)3,HSSFCellStyle.ALIGN_CENTER_SELECTION,"MID"); cteateCell(wb,row1,(short)4,HSSFCellStyle.ALIGN_CENTER_SELECTION,"Sex");

cteateCell(wb,row1,(short)5,HSSFCellStyle.ALIGN_CENTER_SELECTION, "Status");

cteateCell(wb,row1,(short)6,HSSFCellStyle.ALIGN_CENTER_SELECTION,"A1-C"); cteateCell(wb,row1,(short)7,HSSFCellStyle.ALIGN_CENTER_SELECTION,"A1-T"); cteateCell(wb,row1,(short)8,HSSFCellStyle.ALIGN_CENTER_SELECTION,"A2-A"); cteateCell(wb,row1,(short)9,HSSFCellStyle.ALIGN_CENTER_SELECTION,"A2-G");

int ii=0;

try

{

int i=1;

ii=res.getMetaData().getColumnCount();

while(res.next())

{

i++;

HSSFRow row2=sheet.createRow((short)i);

for(int j=0;j<ii;j++)

{

String ss="";

if(res.getString(j+1)==null)

ss="空 null";

else

ss=res.getString(j+1);

cteateCell(wb,row2,(short)j,

HSSFCellStyle.ALIGN_CENTER_SELECTION,ss);

}

}

catch(SQLException e)

{

e.printStackTrace();

}

}

private void cteateCell(HSSFWorkbook wb,HSSFRow row,short col,short align,

String val)

{

HSSFCell cell=row.createCell(col);

cell.setEncoding(HSSFCell.ENCODING_UTF_16);

cell.setCellValue(val);

HSSFCellStyle cellstyle=wb.createCellStyle();

cellstyle.setAlignment(align);

cell.setCellStyle(cellstyle);

}

public void writeExcel(String filename) throws Exception

{

FileOutputStream fileout=new FileOutputStream(filename+".xls");

wb.write(fileout);

fileout.flush();

fileout.close();

}

}

原文:http://my.oschina.net/yangzhiyuan/blog/214131

时间: 2024-10-06 19:58:04

APACHE POI教程的相关文章

SpringBoot图文教程9—SpringBoot 导入导出 Excel 「Apache Poi」

摘自:https://www.cnblogs.com/bingyang-py/p/12407675.html 有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2—日志的使用「logback」「log4j」 SpringBoot图文教程3—「‘初恋’情结」集成Jsp SpringBoot图文

Apache POI系列教程之一:poi入门教程

一 POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能.自2009-09-28后,推出了3.5版本,提供了对Office2007的支持: POI支持Excel.Word等等,详细看官方文档下图中部分:点击打开链接 二 基础定义的东西没有必要写了 2.1 poi入门:点击打开链接  2.2   poi3.8组件研究1-9系列:点击打开链接  推荐 2.3 poi要理清组件(HSSF,XSSF

Apache POI - Java Excel APIs

文档来源:https://www.yiibai.com/apache_poi/ POI 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件.这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文件的开源库.它包含类和方法对用户输入数据或文件到MS Office文档进行解码. Apache POI的API,它是至关重要的工作,使用Java程序操作Excel文件有下面几个类和方

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

Apache POI – Reading and Writing Excel file in Java

来源于:https://www.mkyong.com/java/apache-poi-reading-and-writing-excel-file-in-java/ In this article, we will discuss about how to read and write an excel file using Apache POI 1. Basic definitions for Apache POI library This section briefly describe a

apache poi 生成excel

package com.coracle.yk.xmanager.util.poi; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.

(5) 如何用Apache POI操作Excel文件-----发现Apache的POI的Bug后,如何给Apache的POI报Bug?

在我上篇文章中,(4) 如何用Apache POI操作Excel文件-----发现了POI-3.12一个回归,通过测试POI-3.12的版本,我发现了一个bug,那么发现bug后,该如何处理.我们有2种处理方式,首先我们到Apache POI的bug库里面搜索,看别人有没有创建类似的bug,如果有创建的,这个是最好的结果,我们只需要关注这个bug什么时候被修复.如果没有搜索不到,这个时候我们就需要给Apache POI报bug了.那么,如何给Apache报Bug? 第一步: 打开https://

(6) 如何用Apache POI操作Excel文件-----POI-3.10的一个和注解(comment)相关的另外一个bug

如果POI-3.10往一个工作表(sheet)里面插入数据的话,需要注意了,其有一个不太被容易发现的bug. 被插入的工作表(sheet)里面的单元格没有包含任何的注解(comment)的时候,插入一行数据,不会有任何问题.但是如果被插入的工作表(sheet)里面的单元格只要包含任何的注解(comment)的时候,这个时候插入一行数据的时候,就会破坏这个文件.当程序执行完后,如果打开被插入数据的Excel文件,我们将会发现,其会弹出下面的对话框. 程序代码如下, package com.tibc

(1) 如何用Apache POI操作Excel文件-----入门

Apache POI项目的目标就是可以用Java API来创建和维护各种Office文件(MS Word,MS PowerPoint和MS Excel). 本系列文章主要是针对Excel文件的操作.对于Excel的操作,Apache POI提供两种模型:HSSF和XSSF. 其区别,请参考下面的图1.截止到2015年5月28日,当前的最新版本是3.12. 具体信息,我们可以访问其官方网站:http://poi.apache.org/ 1.下面是用Apache POI创建一个工作薄的基本的代码 i