java POI教程

更新时间:2023-09-03 02:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

java对excel、数据库的操作

AURISOFT

POI报表

--用POI与Excel交互

java对excel、数据库的操作

第一章 POI简介

--Jakata Poi HSSF:纯java的Excel解决方案

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

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

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

POI可以到http://www.77cn.com.cn下载到。实际运行时,需要有poi包就可以了。HSSF提供给用户使用的对象在http://www.77cn.com.cnermodel包中,主要部分包括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 http://www.77cn.com.cnermodel.HSSFCell;

import http://www.77cn.com.cnermodel.HSSFCellStyle; import http://www.77cn.com.cnermodel.HSSFDataFormat; import http://www.77cn.com.cnermodel.HSSFFont; import http://www.77cn.com.cnermodel.HSSFRow; import http://www.77cn.com.cnermodel.HSSFSheet; import http://www.77cn.com.cnermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor;

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

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

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 文件(不是空文件) 。在此基础 上,我们可以进一步看其它的

例子。 import http://www.77cn.com.cnermodel.*; 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);3

java对excel、数据库的操作

通过这个例子,我们可以清楚的看到xls文件从大到小包括了HSSFWorkbook HSSFSheet HSSFRow HSSFCell这样几个对象。我们可以在cell中设置各种类型的值。

尤其要注意的是如果你想正确的显示非欧美的字符时,尤其象中日韩这样的语言,必须设置编码为16位的即是HSSFCell.ENCODING_UTF_16,才能保证字符的高8位不被截断而引起编码失真形成乱码。

其他测试可以通过参考examples包中的测试例子掌握poi的详细用法,包括字体的设置,cell大小和低纹的设置等。需要注意的是POI是一个仍然在完善中的公开代码的项目,所以有些功能正在不断的扩充。 感觉上面的操作比较的繁琐,然后就自己写了一个方法。这个方法不需要事先创建row

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

short col

应该是你的cell单元格的位置也就是列号; short align 应该是你的对齐方式;

String val

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

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

java对excel、数据库的操作

这里面我们还要介绍一个经常会遇到的问题,就是怎么来冻结一个窗口。poi也为我们集成

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

二、方法createFreezepane;有2个参数。前一个参数代表列;后一个参数代表行。 上边的代码对应的excel文件如下:

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

然后我们来看一个完整的STRUTS的小例子,在这个例子里面我们要做的事情是要模拟移动公司的网上营业厅里面的一个功能,我们要把一个客户当月的通话记录和各种信息查询出

然后就是我们具体的代码实现了。

java对excel、数据库的操作

连接数据库的SQLBean,这个bean和我们之前在分页里面用到的bean是一样的。

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

Connection con=null; Statement sta=null; public SQLBean() { try { Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); con=DriverManager.getConnection(url,"sa",""); sta=con.createStatement(); } catch(Exception e) { e.printStackTrace(); } } public ResultSet select(String selects) throws Exception { return sta.executeQuery(selects); } } 为了体现 MVC 模式,我们在这里面引入了一个存储数据的 Bean。EntityBean.java package bean; public class EntityBean { private String sjhm; private String qssj; private String ctlx; private String zhf;

private String hjlx; private String thsc; private String jbhf; private String zjls;

private String dfhm; private String thdd; private String chf;

public EntityBean(String sjhm,String hjlx,String dfhm,String qssj, String thsc,String thdd,String ctlx,String jbhf, String chf,String zhf){ this.sjhm=sjhm; this.hjlx=hjlx; this.dfhm=dfhm; this.qssj=qssj; this.thsc=thsc; this.thdd=thdd; this.ctlx=ctlx; this.jbhf=jbhf; this.chf=chf; this.zhf=zhf; } public String getChf() { return chf; } public void setChf(String chf) { this.chf = chf; } public String getCtlx() { return ctlx;7

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

} public void setCtlx(String ctlx) { this.ctlx = ctlx; } public String getDfhm() { return dfhm; } public void setDfhm(String dfhm) { this.dfhm = dfhm; } public String getHjlx() { return hjlx; } public void setHjlx(String hjlx) { this.hjlx = hjlx; } public String getJbhf() { return jbhf; } public void setJbhf(String jbhf) { this.jbhf = jbhf; } public String getQssj() { return qssj; } public void setQssj(String qssj) { this.qssj = qssj; } public String getSjhm() { return sjhm; } public void setSjhm(String sjhm) { this.sjhm = sjhm; } public String getThdd() { return thdd; } public void setThdd(String thdd) { this.thdd = thdd; } public String getThsc() { return thsc; } public void setThsc(String thsc) {

java对excel、数据库的操作

然后让我们来看看SearchAction,他的主要功能把数据库里的数据提取出来,然后封装到

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

while(res.next()){ String sjhm = res.getString("sjhm"); String hjlx = res.getString("hjlx"); String dfhm = res.getString("dfhm"); String qssj = res.getString("qssj"); String thsc = res.getString("thsc"); String thdd = res.getString("thdd"); String ctlx = res.getString("ctlx"); String jbhf = res.getString("jbhf"); String chf = res.getString("chf"); String zhf = res.getString("zhf"); http://www.77cn.com.cn("开始封装数据:手机号码="+sjhm+"呼叫类型" +hjlx+"对方号码"+dfhm+"起始时间"+qssj+"通话时间" +thsc+"通话地点"+thdd+"长途类型"+ctlx+"基本话费" +jbhf+"常话费"+chf+"总话费"+zhf+"总纪录"+i); EntityBean eb = new EntityBean(sjhm,hjlx,dfhm,qssj,thsc,thdd,ctlx,jbhf,chf,zhf); list.add(eb); } res.close(); } catch(Exception e){ e.printStackTrace(); } request.setAttribute("result",list); return mapping.findForward("success"); } } 显示页面 detail.jsp <%@ page contenttype="text/html; charset=gb2312" language="java"%> <%@ taglib uri="http://www.77cn.com.cn/struts/tags-bean" prefix="bean"%> <%@ taglib uri="http://www.77cn.com.cn/struts/tags-html" prefix="html"%> <%@ taglib uri="http://www.77cn.com.cn/struts/tags-logic" prefix="logic"%> <html> <head> <title>显示查询结果</title> </head> <body> <div align="center"> <table border="1" align="center"> <tr> <td colspan="10" align="center"><html:link page="/down.do">点击生成 excel 文件 </html:link></td> </tr>10

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

<tr> <td colspan="10" align="center"> 总 纪 录 数 : <bean:size name="result"/><bean:write name="zj" /></td> </tr> <tr> <td> <p align="center">手机号码</p> </td> <td> <p align="center">呼叫类型</p> </td> <td> <p align="center">对方号码</p> </td> <td> <p align="center">起始时间</p> </td> <td> <p align="center">通话时间</p> </td> <td> <p align="center">通话地点</p> </td> <td> <p align="center">长途类型</p> </td> <td> <p align="center">基本话费</p> </td> <td> <p align="center">长话费</p> </td> <td> <p align="center">总话费</p> </td> </tr> <logic:iterate id="res" name="result"> <tr> <td> <div align="center"><bean:write name="res" property="sjhm" /></div> </td> <td> id="zj"

java对excel、数据库的操作

模拟效果图:

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

当我们点击生成 excel 文件这个超链接的时候,会找到这个 DownAction package action; import java.io.OutputStream; import java.sql.ResultSet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import bean.ExcelBean; import bean.SQLBean; public class DownAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { SQLBean sq = new SQLBean(); String sql = "select * from detial"; try { String fname = "detial";// Excel 文件名 OutputStream os = response.getOutputStream();// 取得输出流 response.reset();// 清空输出流 response.setHeader("Content-disposition", "attachment; filename="

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

+ fname + ".xls"); // 设定输出文件头,该方法有两个参数,分别表示应答头的名字和值。 response.setContentType("application/msexcel"); // 定义输出类型 ResultSet res = sq.select(sql); ExcelBean eb = new ExcelBean(); eb.createFixationSheet(res, os);// 调用生成 excel 文件 bean res.close(); } catch (Exception e) { System.out.println(e); } return mapping.findForward("display"); } } 在这个 action 里面我们调用了 ExcelBean package bean; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.sql.ResultSet; import java.sql.SQLException; import http://www.77cn.com.cnermodel.HSSFCell; import http://www.77cn.com.cnermodel.HSSFCellStyle; import http://www.77cn.com.cnermodel.HSSFRow; import http://www.77cn.com.cnermodel.HSSFSheet; import http://www.77cn.com.cnermodel.HSSFWorkbook; import org.apache.poi.hssf.util.Region; public class ExcelBean { private HSSFWorkbook wb=null; public ExcelBean() { wb=new HSSFWorkbook(); } public void createFixationSheet(ResultSet res,OutputStream os) throws IOException { HSSFSheet sheet=wb.createSheet("new sheet"); wb.setSheetName(0,"话费详单",HSSFWorkbook.ENCODING_UTF_16); HSSFRow row=sheet.createRow((short)0); sheet.createFreezePane(0,1);14

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

cteateCell(wb,row,(short)0,"手机号码"); cteateCell(wb,row,(short)1,"呼叫类型"); cteateCell(wb,row,(short)2,"对方号码"); cteateCell(wb,row,(short)3,"起始时间"); cteateCell(wb,row,(short)4,"通话时间"); cteateCell(wb,row,(short)5,"通话地点"); cteateCell(wb,row,(short)6,"长途类型");

cteateCell(wb,row,(short)7,"基本话费"); cteateCell(wb,row,(short)8,"长话费"); cteateCell(wb,row,(short)9,"总话费"); int ii=0; try { int i=0; 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,ss); } } } catch(SQLException e) { e.printStackTrace(); } wb.write(os); os.flush(); os.close(); } private void cteateCell(HSSFWorkbook wb,HSSFRow row,short col,String val) { HSSFCell cell=row.createCell(col); cell.setEncoding(HSSFCell.ENCODING_UTF_16); cell.setCellValue(val); HSSFCellStyle cellstyle=wb.createCellStyle(); cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER_SELECTION);

java对excel、数据库的操作

我们看一下点击了,生成excel文件 的效果图

看看我们生成的excel文件

数据库表结构如下

java对excel、数据库的操作

JAVA 软件工程师教育系列教程

create database poi_mvc use poi_mvc create table detial( sjhm varchar(20), --手机号码 hjlx varchar(20), --呼叫类型 dfhm varchar(20), --对方号码 qssj varchar(20), --起始时间 thsc varchar(20), --通话时长 thdd varchar(20), --通话地点 ctlx varchar(20), --长途类型 jbhf varchar(20), --基本话费 chf varchar(20), --长话费 zhf varchar(20), --总话费 )

java对excel、数据库的操作

Jakarta_POI 使用Java读写Excel(97-2002)文件,可以满足大部分的需要。 因为刚好有一个项目使用到了这个工具,花了点时间顺便翻译了一下POI本身 带的一个Guide.有一些节减和修改,希望给使用这个项目的人一些入门帮助。 POI 下面有几个自项目:HSSF用来实现Excel 的读写.以下是HSSF的主页 http://www.77cn.com.cn/poi/hssf/index.html

下面的介绍是基于以下地址的翻译:

http://www.77cn.com.cn/poi/hssf/quick-guide.html

目前的版本为1.51应该是很长时间之内的一个稳定版,但HSSF提供的Sample不是基于 1.51所写,所以使用的时候需要适当的注意.

其实POI下面的几个子项目侧重不同读写 Word 的HDF正在开发当中. XML下的FOP(http://www.77cn.com.cn/fop/index.html) 可以输出pdf文件,也是比较好的一个工具

目录:

创建一个workbook 创建一个sheet 创建cells 创建日期cells 设定单元格格式

说明:

以下可能需要使用到如下的类

import http://www.77cn.com.cnermodel.HSSFCell;

import http://www.77cn.com.cnermodel.HSSFCellStyle; import http://www.77cn.com.cnermodel.HSSFDataFormat; import http://www.77cn.com.cnermodel.HSSFFont; import http://www.77cn.com.cnermodel.HSSFRow; import http://www.77cn.com.cnermodel.HSSFSheet; import http://www.77cn.com.cnermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor;

java对excel、数据库的操作

创建workbook

HSSFWorkbook wb = new HSSFWorkbook(); //使用默认的构造方法创建workbook

FileOutputStream fileOut = new FileOutputStream("workbook.xls"); //指定文件名 wb.write(fileOut); //输出到文件 fileOut.close();

创建一个sheet

HSSFWorkbook wb = new HSSFWorkbook();

HSSFSheet sheet1 = wb.createSheet("new sheet"); //workbook创建sheet

HSSFSheet sheet2 = wb.createSheet("second sheet"); //workbook创建另外的sheet

FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close();

创建cells

HSSFWorkbook wb = new HSSFWorkbook();

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

//注意以下的代码很多方法的参数是short 而不是int 所以需要做一次类型转换 HSSFRow row = sheet.createRow((short)0); //sheet 创建一行

HSSFCell cell = row.createCell((short)0); //行创建一个单元格 cell.setCellValue(1); //设定单元格的值

//值的类型参数有多中double ,String ,boolean, row.createCell((short)1).setCellValue(1.2);

row.createCell((short)2).setCellValue("This is a string"); row.createCell((short)3).setCellValue(true);

// Write the output to a file

FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close();

创建日期cells

HSSFWorkbook wb = new HSSFWorkbook();

本文来源:https://www.bwwdw.com/article/6yri.html

Top