利用Apache POI操作Excel文档

本文介绍使用Apache POI库在Java中操作Excel文档的方法,包括创建样式、插入文本、图片和图形等。通过示例代码展示了如何美化Excel表格并添加多媒体元素。

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

众所周知,EXCEL是微软 的office套件里的一个产品,使用比较广泛,由于微软产品的特殊性,JAVA标准库里面并没有提供操作EXCEL文档的类,可是在程序开发过程中,如果能将数据输出成一个电子表格的形式,那将有利于用户分析和查看数据.

 虽然标准类库没有提供操作方法,但是得益于JAVA是开源的,所以我们可以找到第三方的开源的类库来进行EXCEL的读写操作.我们选用apache的POI库来进行EXCEL的操作.

 在POI里面,它把很多EXCEL里面的元素都对象化了,很符合的JAVA的编程风格.

 在使用POI之前,我们得下载一个POI的库,我们可以去apache的网站上去下载,目前最新的版本是3.0.1,

下载后,把它加入到 classpath中就可以使用它了.

下面我们就来看一下最简单的一个例子,生成我们第一个EXCEL文档.
  1. /*
  2. * Test2.java
  3. *
  4. * To change this template, choose Tools | Template Manager
  5. * and open the template in the editor.
  6. */

  7. package test1;

  8. import java.io.FileOutputStream;
  9. import org.apache.poi.hssf.usermodel.HSSFCell;
  10. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  11. import org.apache.poi.hssf.usermodel.HSSFFont;
  12. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  13. import org.apache.poi.hssf.usermodel.HSSFRow;
  14. import org.apache.poi.hssf.usermodel.HSSFSheet;
  15. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  16. import org.apache.poi.hssf.util.HSSFColor;

  17. /**
  18. *
  19. * @author hadeslee
  20. */
  21. public class Test2{
  22.  
  23.   /** Creates a new instance of Test2 */
  24.   public Test2() {
  25.   }
  26.   public static void main(String[] args)throws Exception {
  27.       //声明一个工作薄
  28.       HSSFWorkbook wb=new HSSFWorkbook();
  29.       //生成一个表格
  30.       HSSFSheet sheet=wb.createSheet("表格1");
  31.       //生成一个列
  32.       HSSFRow row=sheet.createRow(0);
  33.       //生成一个样式
  34.       HSSFCellStyle style=wb.createCellStyle();
  35.       //设置这些样式
  36.       style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  37.       style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  38.       style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  39.       style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  40.       style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  41.       style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  42.       style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  43.       //生成一个字体
  44.       HSSFFont font=wb.createFont();
  45.       font.setColor(HSSFColor.VIOLET.index);
  46.       font.setFontHeightInPoints((short)16);
  47.       font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  48.       //把字体应用到当前的样式
  49.       style.setFont(font);
  50.       //填充单元格
  51.       for(short i=0;i<5;i++){
  52.           //声明一个单元格
  53.           HSSFCell cell=row.createCell(i);
  54.           //设置单元格的字符值
  55.           cell.setCellValue(new HSSFRichTextString("第"+i+"列"));
  56.           //设置单元格的样式
  57.           cell.setCellStyle(style);
  58.       }
  59.       FileOutputStream fout=new FileOutputStream("我的第一个EXCEL.xls");
  60.       //输出到文件
  61.       wb.write(fout);
  62.       fout.close();
  63.   }
  64. }

这个例子比起别的入门例子,可能会复杂一些,因为里面应用到了样式和字体,但是这些对于我们美化EXCEL是

很重要的,EXCEL里面大部份都是插入字符串,但是我们也可以插入图片或者图形或者格式化的日期以及时
间,至于如何插入这些,我们下次再讲.:)

昨天,我们看了一下POI操作EXCEL的简单例子,我们只是插入了一些字符串而已,但是现实的应用中,经常需要在EXCEL中插入图片或者图形.这个时候,应该怎么办呢,我们先看一下下面的例子
  1. /*
  2. * Test3.java
  3. *
  4. * To change this template, choose Tools | Template Manager
  5. * and open the template in the editor.
  6. */

  7. package test1;

  8. import java.awt.image.BufferedImage;
  9. import java.io.ByteArrayOutputStream;
  10. import java.io.FileOutputStream;
  11. import java.net.URL;
  12. import javax.imageio.ImageIO;
  13. import org.apache.poi.hssf.usermodel.HSSFCell;
  14. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  15. import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  16. import org.apache.poi.hssf.usermodel.HSSFFont;
  17. import org.apache.poi.hssf.usermodel.HSSFPatriarch;
  18. import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  19. import org.apache.poi.hssf.usermodel.HSSFRow;
  20. import org.apache.poi.hssf.usermodel.HSSFSheet;
  21. import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
  22. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  23. import org.apache.poi.hssf.util.HSSFColor;

  24. /**
  25. *
  26. * @author hadeslee
  27. */
  28. public class Test3 {
  29.  
  30.   /** Creates a new instance of Test3 */
  31.   public Test3() {
  32.   }
  33.   public static void main(String[] args)throws Exception {
  34.       //声明一个工作薄
  35.       HSSFWorkbook wb=new HSSFWorkbook();
  36.       //生成一个表格
  37.       HSSFSheet sheet=wb.createSheet("表格1");
  38.       //生成一个列
  39.       HSSFRow row=sheet.createRow(0);
  40.       //生成一个样式
  41.       HSSFCellStyle style=wb.createCellStyle();
  42.       //设置这些样式
  43.       style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  44.       style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  45.       style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  46.       style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  47.       style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  48.       style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  49.       style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  50.       //生成一个字体
  51.       HSSFFont font=wb.createFont();
  52.       font.setColor(HSSFColor.VIOLET.index);
  53.       font.setFontHeightInPoints((short)16);
  54.       font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  55.       //把字体应用到当前的样式
  56.       style.setFont(font);
  57.       //声明一个画图的顶级管理
  58.       HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  59.       //填充单元格
  60.       for(short i=0;i<5;i++){
  61.           //声明一个单元格
  62.           HSSFCell cell=row.createCell(i);
  63.           switch(i){
  64.               case 0:
  65.                   //设置普通文本
  66.                   cell.setCellValue(new HSSFRichTextString("普通文本"));
  67.                   break;
  68.               case 1:
  69.                   //设置为形状
  70.                   HSSFClientAnchor a1 = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
  71.                   HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
  72.                   //这里可以设置形状的样式
  73.                   shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
  74.                   
  75.                   break;
  76.               case 2:
  77.                   //设置为布尔量
  78.                   cell.setCellValue(true);
  79.                   break;
  80.               case 3:
  81.                   //设置为double值
  82.                   cell.setCellValue(12.5);
  83.                   break;
  84.               case 4:
  85.                   //设置为图片]
  86.                   URL url=Test3.class.getResource("hello.jpg");
  87.                   insertImage(wb,patriarch,getImageData(ImageIO.read(url)),0,4,1);
  88.                   break;
  89.                   
  90.           }
  91.           
  92.           //设置单元格的样式
  93.           cell.setCellStyle(style);
  94.       }
  95.       FileOutputStream fout=new FileOutputStream("我的第一个EXCEL.xls");
  96.       //输出到文件
  97.       wb.write(fout);
  98.       fout.close();
  99.   }
  100.   //自定义的方法,插入某个图片到指定索引的位置
  101.   private static void insertImage(HSSFWorkbook wb,HSSFPatriarch pa,byte[] data,int row,int column,int index){
  102.       int x1=index*250;
  103.       int y1=0;
  104.       int x2=x1+255;
  105.       int y2=255;
  106.       HSSFClientAnchor anchor = new HSSFClientAnchor(x1,y1,x2,y2,(short)column,row,(short)column,row);
  107.       anchor.setAnchorType(2);
  108.       pa.createPicture(anchor , wb.addPicture(data,HSSFWorkbook.PICTURE_TYPE_JPEG));
  109.   }
  110.   //从图片里面得到字节数组
  111.   private static  byte[] getImageData(BufferedImage bi){
  112.       try{
  113.           ByteArrayOutputStream bout=new ByteArrayOutputStream();
  114.           ImageIO.write(bi,"PNG",bout);
  115.           return bout.toByteArray();
  116.       }catch(Exception exe){
  117.           exe.printStackTrace();
  118.           return null;
  119.       }
  120.   }
  121. }

POI里面处理图形或者图片的主要类是HSSFPatriarch,它负责管理一个表格里面所有的图片和图形,并且只能创建一个,如果你应用程序后来又创建了一个,那么将使以前创造的HSSFPatriarch所管理的图片和图形清除,所以一定要保留HSSFPatriarch的引用直到最后.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值