【springmvc+mybatis项目实战】杰信商贸-24.神奇的POI

本文详细介绍了如何使用POI库进行出货表数据的导出,包括从数据库表中取出数据并将其打印到Excel电子表格中。重点讨论了如何优化代码以减少内存消耗,以及如何为Excel单元格添加样式,如字体大小和样式。同时,文章还提供了一系列关于数据处理和格式化的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务:构建出货表
功能:
对购销合同进行月统计,按船期进行统计。
我们看看我们的出货表最终是什么样的:


可以看到我们的出货表所拥有的列的属性包含了以下几个表的信息:合同表、货物表、生产厂家表、附件表。关联了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的开发步骤如下:
[java]  view plain copy
  1. package cn.edu.hpu.jk.test;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.OutputStream;  
  7.   
  8. import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
  9. import org.apache.poi.ss.usermodel.Cell;  
  10. import org.apache.poi.ss.usermodel.Row;  
  11. import org.apache.poi.ss.usermodel.Sheet;  
  12. import org.apache.poi.ss.usermodel.Workbook;  
  13. import org.junit.Test;  
  14.   
  15.   
  16. public class testPOIDemo {  
  17.     @Test  
  18.     public void HSSF()throws IOException{  
  19.         //第一步:创建一个工作簿excel文件  
  20.         Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本  
  21.           
  22.         //第二步:创建一个工作表sheet  
  23.         Sheet sheet=wb.createSheet();  
  24.           
  25.         //第三步:创建一个行对象(我们放在第4行)  
  26.         Row nRow=sheet.createRow(3);//从0开始  
  27.           
  28.         //第四步:创建一个单元格对象,指定列  
  29.         //createCell参数有两个,一个是第几列一个是参数类型,  
  30.         //这里我们使用默认参数类型  
  31.         Cell nCell=nRow.createCell(2);  
  32.           
  33.         //第五步:给单元格设置内容  
  34.         nCell.setCellValue("技术部门发红利");  
  35.           
  36.         //第六步:保存  
  37.         OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));  
  38.         wb.write(os);  
  39.           
  40.         //第七步:关闭  
  41.         os.close();  
  42.           
  43.     }  
  44. }  

我们测试这个方法,运行完毕之后,我们在F盘发现了这个文件

然后点开之后,发现内容和我们设想的一模一样


POI测试成功!


我们想修饰一下字体怎么办?在这里修改一下代码:
[java]  view plain copy
  1. @Test  
  2. public void HSSFstyle()throws IOException{  
  3.     Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本  
  4.     Sheet sheet=wb.createSheet();  
  5.     Row nRow=sheet.createRow(3);//从0开始  
  6.     Cell nCell=nRow.createCell(2);  
  7.     nCell.setCellValue("技术部门发红利");  
  8.       
  9.     //创建单元格样式(样式整个工作簿通用)  
  10.     CellStyle titleStyle=wb.createCellStyle();  
  11.       
  12.     //创建一个字体对象  
  13.     Font titleFont=wb.createFont();  
  14.     titleFont.setFontName("微软雅黑");          //设置字体  
  15.     titleFont.setFontHeightInPoints((short)26); //设置字大小  
  16.       
  17.     titleStyle.setFont(titleFont);  
  18.       
  19.     nCell.setCellStyle(titleStyle);  
  20.       
  21.     OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));  
  22.     wb.write(os);  
  23.     os.close();  
  24.       
  25. }  

然后运行,发现我们的excel内容中的字体大小和字体样式已经发生改变



我们现在又想在下面添加一段文字,并且这段文字是一个网址,而且字体是罗马字体(Times New Roman)



该怎么做呢?代码修改如下:
[java]  view plain copy
  1. //带格式  
  2. @Test  
  3. public void HSSFstyle()throws IOException{  
  4.     Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本  
  5.     Sheet sheet=wb.createSheet();  
  6.     Row nRow=sheet.createRow(3);//从0开始  
  7.     Cell nCell=nRow.createCell(2);  
  8.     nCell.setCellValue("技术部门发红利");  
  9.       
  10.     //创建单元格样式(样式整个工作簿通用)  
  11.     CellStyle titleStyle=wb.createCellStyle();  
  12.       
  13.     //创建一个字体对象  
  14.     Font titleFont=wb.createFont();  
  15.     titleFont.setFontName("微软雅黑");          //设置字体  
  16.     titleFont.setFontHeightInPoints((short)26); //设置字大小  
  17.       
  18.     titleStyle.setFont(titleFont);  
  19.       
  20.     nCell.setCellStyle(titleStyle);  
  21.       
  22.     //再创建一个单元格  
  23.     Row xRow=sheet.createRow(4);  
  24.     Cell xCell=xRow.createCell(3);  
  25.     xCell.setCellValue("www.baidu.com");  
  26.       
  27.     CellStyle textStyle=wb.createCellStyle();  
  28.     Font textFont=wb.createFont();  
  29.     textFont.setFontName("Times News Roman");  
  30.     textFont.setFontHeightInPoints((short)12);  
  31.       
  32.     textStyle.setFont(textFont);  
  33.       
  34.     xCell.setCellStyle(textStyle);  
  35.       
  36.     OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));  
  37.     wb.write(os);  
  38.     os.close();  
  39.       
  40. }  

我们再去F盘下查看,发现最终的效果是:


生成成功!


但是,上面的代码是存在问题的
1)POI创建的这些对象统统在内存中
2)行对象,列对象,样式对象,字体对象重复创建

我们先来解决第2个问题,我们来精简代码:
[java]  view plain copy
  1. //带格式精简  
  2. @Test  
  3. public void HSSFstyleMore()throws IOException{  
  4.     Workbook wb=new HSSFWorkbook();//HSSF操作Excel2003以下版本  
  5.     Sheet sheet=wb.createSheet();  
  6.       
  7.     //创建一个单元格  
  8.     Row nRow=sheet.createRow(3);//从0开始  
  9.     Cell nCell=nRow.createCell(2);  
  10.     nCell.setCellValue("技术部门发红利");  
  11.       
  12.     //创建单元格样式  
  13.     CellStyle tStyle=wb.createCellStyle();  
  14.     Font nFont=wb.createFont();  
  15.     nCell.setCellStyle(this.titleStyle(wb,tStyle,nFont));  
  16.       
  17.     //再创建一个单元格  
  18.     nRow=sheet.createRow(4);  
  19.     nCell=nRow.createCell(3);  
  20.     nCell.setCellValue("www.baidu.com");  
  21.       
  22.     //创建单元格样式  
  23.     tStyle=wb.createCellStyle();  
  24.     nFont=wb.createFont();  
  25.     nCell.setCellStyle(this.textStyle(wb,tStyle,nFont));  
  26.       
  27.     OutputStream os=new FileOutputStream(new File("F:\\testPOI.xls"));  
  28.     wb.write(os);  
  29.     os.close();  
  30. }  
  31.   
  32.   
  33. //标题样式  
  34. public CellStyle titleStyle(Workbook wb,CellStyle tStyle,Font nFont){  
  35.     nFont.setFontName("微软雅黑");          //设置字体  
  36.     nFont.setFontHeightInPoints((short)26); //设置字大小  
  37.       
  38.     tStyle.setFont(nFont);  
  39.     return tStyle;  
  40. }  
  41.   
  42.   
  43. //内容样式  
  44. public CellStyle textStyle(Workbook wb,CellStyle tStyle,Font nFont){  
  45.     nFont.setFontName("Times News Roman");  
  46.     nFont.setFontHeightInPoints((short)12);  
  47.       
  48.     tStyle.setFont(nFont);  
  49.     return tStyle;  
  50. }  

重复样式得以利用,这样不仅内存省了,而且我们的代码看起来十分规正。

POI入门结束,我们下一篇来正式开始完成我们的出货表导出功能的编写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值