POI是干什么的呢?首先先从我们的业务下手,来逐渐里了解和掌握POI。
业务:构建出货表
功能:
对购销合同进行月统计,按船期进行统计。
我们看看我们的出货表最终是什么样的:
可以看到我们的出货表所拥有的列的属性包含了以下几个表的信息:合同表、货物表、生产厂家表、附件表。关联了4张表。
通过冗余设计只需要从合同、货物表中获取数据,取数据更加方便,代码更加简单。
那我们怎么从数据库表中取出要打印的数据呢?
分析表格,发现客户名称和订单号都是重复的,这里就无需在合同表中反复取数据,所以我们来循环货物表的信息更能方便实现打印数据。
最后我们的内容要放置在excel电子表格中来进行打印(客户要求),我们应该怎么做?
JAVA语言操作excel有两种主流方式:
1.POI:是Apache它是用来操作Office所有的软件(excel/word/ppt/...),而且支持所有版本。
2.JXL:它是用来操作excel,只支持2003以下版本,而2007以上版本不支持。
早期微软Office系列,当时使用OLE2文档结构(纯2进制的文件,文件头都有规范的)。
微软在开发office2007版本时,做了一个重大的改革,重写了office。使用OOXML文档结构。现在excel文件实际上是一个XML格式文件。
POI支持OLE2格式文件,还支持OOXML,而且在OOXML格式文件时做了很大的优化。JXL只支持OLE2格式文件。
为什么POI比JXL出现早但是JXL还能起来呢?,因为POI有个致命弱点,当数据超大(海量数据),性能及其降低。在POI没有进行革新之前,JXL出现了,它解决了数据量大时性能的问题,所以JXL火了一段时间。但是POI在高版本时迎头追上,加了一个补丁---OOXML支持,解决大数量时性能的问题。
POI的官方网站是http://poi.apache.org/index.html POI全方位的操作
JXL的网站是http://www.andykhan.com/jexcelapi/index.html JXL 导入导出
我们下面先做一个POI的小例子,看看POI怎么玩(POI入门)
我们之前已经引入了POI所需要的Jar包:poi-3.9.jar、poi-ooxml-3.9.jar、poi-ooxml-schemas-3.9.jar
我们完成这样一个内容的Excel文件主要需要以下步骤:
第一步:创建excel文件,称作“工作簿”(workbook)
第二步:Excel文件在创建时,会默认创建3个工作表sheet
第三步:定位行
第四步:定位列,获得单元格
第五步:填写内容
第六步:保存,关闭文件
那POI的开发步骤如下:
我们测试这个方法,运行完毕之后,我们在F盘发现了这个文件
然后点开之后,发现内容和我们设想的一模一样
然后运行,发现我们的excel内容中的字体大小和字体样式已经发生改变
我们现在又想在下面添加一段文字,并且这段文字是一个网址,而且字体是罗马字体(Times New Roman)
该怎么做呢?代码修改如下:
但是,上面的代码是存在问题的
1)POI创建的这些对象统统在内存中
2)行对象,列对象,样式对象,字体对象重复创建
我们先来解决第2个问题,我们来精简代码:
重复样式得以利用,这样不仅内存省了,而且我们的代码看起来十分规正。
业务:构建出货表
功能:
对购销合同进行月统计,按船期进行统计。
我们看看我们的出货表最终是什么样的:
可以看到我们的出货表所拥有的列的属性包含了以下几个表的信息:合同表、货物表、生产厂家表、附件表。关联了4张表。
通过冗余设计只需要从合同、货物表中获取数据,取数据更加方便,代码更加简单。
那我们怎么从数据库表中取出要打印的数据呢?
分析表格,发现客户名称和订单号都是重复的,这里就无需在合同表中反复取数据,所以我们来循环货物表的信息更能方便实现打印数据。
最后我们的内容要放置在excel电子表格中来进行打印(客户要求),我们应该怎么做?
JAVA语言操作excel有两种主流方式:
1.POI:是Apache它是用来操作Office所有的软件(excel/word/ppt/...),而且支持所有版本。
2.JXL:它是用来操作excel,只支持2003以下版本,而2007以上版本不支持。
早期微软Office系列,当时使用OLE2文档结构(纯2进制的文件,文件头都有规范的)。
微软在开发office2007版本时,做了一个重大的改革,重写了office。使用OOXML文档结构。现在excel文件实际上是一个XML格式文件。
POI支持OLE2格式文件,还支持OOXML,而且在OOXML格式文件时做了很大的优化。JXL只支持OLE2格式文件。
为什么POI比JXL出现早但是JXL还能起来呢?,因为POI有个致命弱点,当数据超大(海量数据),性能及其降低。在POI没有进行革新之前,JXL出现了,它解决了数据量大时性能的问题,所以JXL火了一段时间。但是POI在高版本时迎头追上,加了一个补丁---OOXML支持,解决大数量时性能的问题。
POI的官方网站是http://poi.apache.org/index.html POI全方位的操作
JXL的网站是http://www.andykhan.com/jexcelapi/index.html JXL 导入导出
我们下面先做一个POI的小例子,看看POI怎么玩(POI入门)
我们之前已经引入了POI所需要的Jar包:poi-3.9.jar、poi-ooxml-3.9.jar、poi-ooxml-schemas-3.9.jar
我们小例子需求:给工作部写一个内容,内容写在Excel中,具体内容是"技术部门发红利"。效果类似于:
我们完成这样一个内容的Excel文件主要需要以下步骤:
第一步:创建excel文件,称作“工作簿”(workbook)
第二步:Excel文件在创建时,会默认创建3个工作表sheet
第三步:定位行
第四步:定位列,获得单元格
第五步:填写内容
第六步:保存,关闭文件
那POI的开发步骤如下:
package cn.edu.hpu.jk.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.junit.Test;
public class testPOIDemo {
@Test
public void HSSF()throws IOException{
//第一步:创建一个工作簿excel文件
Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本
//第二步:创建一个工作表sheet
Sheet sheet=wb.createSheet();
//第三步:创建一个行对象(我们放在第4行)
Row nRow=sheet.createRow(3);//从0开始
//第四步:创建一个单元格对象,指定列
//createCell参数有两个,一个是第几列一个是参数类型,
//这里我们使用默认参数类型
Cell nCell=nRow.createCell(2);
//第五步:给单元格设置内容
nCell.setCellValue("技术部门发红利");
//第六步:保存
OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));
wb.write(os);
//第七步:关闭
os.close();
}
}
我们测试这个方法,运行完毕之后,我们在F盘发现了这个文件
然后点开之后,发现内容和我们设想的一模一样
POI测试成功!
@Test
public void HSSFstyle()throws IOException{
Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本
Sheet sheet=wb.createSheet();
Row nRow=sheet.createRow(3);//从0开始
Cell nCell=nRow.createCell(2);
nCell.setCellValue("技术部门发红利");
//创建单元格样式(样式整个工作簿通用)
CellStyle titleStyle=wb.createCellStyle();
//创建一个字体对象
Font titleFont=wb.createFont();
titleFont.setFontName("微软雅黑"); //设置字体
titleFont.setFontHeightInPoints((short)26); //设置字大小
titleStyle.setFont(titleFont);
nCell.setCellStyle(titleStyle);
OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));
wb.write(os);
os.close();
}
然后运行,发现我们的excel内容中的字体大小和字体样式已经发生改变
我们现在又想在下面添加一段文字,并且这段文字是一个网址,而且字体是罗马字体(Times New Roman)
该怎么做呢?代码修改如下:
//带格式
@Test
public void HSSFstyle()throws IOException{
Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本
Sheet sheet=wb.createSheet();
Row nRow=sheet.createRow(3);//从0开始
Cell nCell=nRow.createCell(2);
nCell.setCellValue("技术部门发红利");
//创建单元格样式(样式整个工作簿通用)
CellStyle titleStyle=wb.createCellStyle();
//创建一个字体对象
Font titleFont=wb.createFont();
titleFont.setFontName("微软雅黑"); //设置字体
titleFont.setFontHeightInPoints((short)26); //设置字大小
titleStyle.setFont(titleFont);
nCell.setCellStyle(titleStyle);
//再创建一个单元格
Row xRow=sheet.createRow(4);
Cell xCell=xRow.createCell(3);
xCell.setCellValue("www.baidu.com");
CellStyle textStyle=wb.createCellStyle();
Font textFont=wb.createFont();
textFont.setFontName("Times News Roman");
textFont.setFontHeightInPoints((short)12);
textStyle.setFont(textFont);
xCell.setCellStyle(textStyle);
OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));
wb.write(os);
os.close();
}
我们再去F盘下查看,发现最终的效果是:
但是,上面的代码是存在问题的
1)POI创建的这些对象统统在内存中
2)行对象,列对象,样式对象,字体对象重复创建
我们先来解决第2个问题,我们来精简代码:
//带格式精简
@Test
public void HSSFstyleMore()throws IOException{
Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本
Sheet sheet=wb.createSheet();
//创建一个单元格
Row nRow=sheet.createRow(3);//从0开始
Cell nCell=nRow.createCell(2);
nCell.setCellValue("技术部门发红利");
//创建单元格样式
CellStyle tStyle=wb.createCellStyle();
Font nFont=wb.createFont();
nCell.setCellStyle(this.titleStyle(wb,tStyle,nFont));
//再创建一个单元格
nRow=sheet.createRow(4);
nCell=nRow.createCell(3);
nCell.setCellValue("www.baidu.com");
//创建单元格样式
tStyle=wb.createCellStyle();
nFont=wb.createFont();
nCell.setCellStyle(this.textStyle(wb,tStyle,nFont));
OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));
wb.write(os);
os.close();
}
//标题样式
public CellStyle titleStyle(Workbook wb,CellStyle tStyle,Font nFont){
nFont.setFontName("微软雅黑"); //设置字体
nFont.setFontHeightInPoints((short)26); //设置字大小
tStyle.setFont(nFont);
return tStyle;
}
//内容样式
public CellStyle textStyle(Workbook wb,CellStyle tStyle,Font nFont){
nFont.setFontName("Times News Roman");
nFont.setFontHeightInPoints((short)12);
tStyle.setFont(nFont);
return tStyle;
}
重复样式得以利用,这样不仅内存省了,而且我们的代码看起来十分规正。
POI入门结束,我们下一篇来正式开始完成我们的出货表导出功能的编写。
转载请注明出处:http://blog.csdn.net/acmman/article/details/48678599