设为首页 收藏本站
查看: 658|回复: 0

[经验分享] 利用Apache POI操作Excel文档

[复制链接]

尚未签到

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

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

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

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

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

下面我们就来看一下最简单的一个例子,生成我们第一个EXCEL文档.

  • /*
  • * Test2.java
  • *
  • * To change this template, choose Tools | Template Manager
  • * and open the template in the editor.
  • */

  • package test1;

  • import java.io.FileOutputStream;
  • import org.apache.poi.hssf.usermodel.HSSFCell;
  • import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  • import org.apache.poi.hssf.usermodel.HSSFFont;
  • import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  • 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;

  • /**
  • *
  • * @author hadeslee
  • */
  • public class Test2{
  •  
  •   /** Creates a new instance of Test2 */
  •   public Test2() {
  •   }
  •   public static void main(String[] args)throws Exception {
  •       //声明一个工作薄
  •       HSSFWorkbook wb=new HSSFWorkbook();
  •       //生成一个表格
  •       HSSFSheet sheet=wb.createSheet("表格1");
  •       //生成一个列
  •       HSSFRow row=sheet.createRow(0);
  •       //生成一个样式
  •       HSSFCellStyle style=wb.createCellStyle();
  •       //设置这些样式
  •       style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  •       style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  •       style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  •       style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  •       style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  •       style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  •       style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  •       //生成一个字体
  •       HSSFFont font=wb.createFont();
  •       font.setColor(HSSFColor.VIOLET.index);
  •       font.setFontHeightInPoints((short)16);
  •       font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  •       //把字体应用到当前的样式
  •       style.setFont(font);
  •       //填充单元格
  •       for(short i=0;i<5;i++){
  •           //声明一个单元格
  •           HSSFCell cell=row.createCell(i);
  •           //设置单元格的字符值
  •           cell.setCellValue(new HSSFRichTextString("第"+i+"列"));
  •           //设置单元格的样式
  •           cell.setCellStyle(style);
  •       }
  •       FileOutputStream fout=new FileOutputStream("我的第一个EXCEL.xls");
  •       //输出到文件
  •       wb.write(fout);
  •       fout.close();
  •   }
  • }


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

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

昨天,我们看了一下POI操作EXCEL的简单例子,我们只是插入了一些字符串而已,但是现实的应用中,经常需要在EXCEL中插入图片或者图形.这个时候,应该怎么办呢,我们先看一下下面的例子

  • /*
  • * Test3.java
  • *
  • * To change this template, choose Tools | Template Manager
  • * and open the template in the editor.
  • */

  • package test1;

  • import java.awt.image.BufferedImage;
  • import java.io.ByteArrayOutputStream;
  • import java.io.FileOutputStream;
  • import java.net.URL;
  • import javax.imageio.ImageIO;
  • import org.apache.poi.hssf.usermodel.HSSFCell;
  • import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  • import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
  • import org.apache.poi.hssf.usermodel.HSSFFont;
  • import org.apache.poi.hssf.usermodel.HSSFPatriarch;
  • import org.apache.poi.hssf.usermodel.HSSFRichTextString;
  • import org.apache.poi.hssf.usermodel.HSSFRow;
  • import org.apache.poi.hssf.usermodel.HSSFSheet;
  • import org.apache.poi.hssf.usermodel.HSSFSimpleShape;
  • import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  • import org.apache.poi.hssf.util.HSSFColor;

  • /**
  • *
  • * @author hadeslee
  • */
  • public class Test3 {
  •  
  •   /** Creates a new instance of Test3 */
  •   public Test3() {
  •   }
  •   public static void main(String[] args)throws Exception {
  •       //声明一个工作薄
  •       HSSFWorkbook wb=new HSSFWorkbook();
  •       //生成一个表格
  •       HSSFSheet sheet=wb.createSheet("表格1");
  •       //生成一个列
  •       HSSFRow row=sheet.createRow(0);
  •       //生成一个样式
  •       HSSFCellStyle style=wb.createCellStyle();
  •       //设置这些样式
  •       style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
  •       style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  •       style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  •       style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  •       style.setBorderRight(HSSFCellStyle.BORDER_THIN);
  •       style.setBorderTop(HSSFCellStyle.BORDER_THIN);
  •       style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  •       //生成一个字体
  •       HSSFFont font=wb.createFont();
  •       font.setColor(HSSFColor.VIOLET.index);
  •       font.setFontHeightInPoints((short)16);
  •       font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  •       //把字体应用到当前的样式
  •       style.setFont(font);
  •       //声明一个画图的顶级管理器
  •       HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
  •       //填充单元格
  •       for(short i=0;i<5;i++){
  •           //声明一个单元格
  •           HSSFCell cell=row.createCell(i);
  •           switch(i){
  •               case 0:
  •                   //设置普通文本
  •                   cell.setCellValue(new HSSFRichTextString("普通文本"));
  •                   break;
  •               case 1:
  •                   //设置为形状
  •                   HSSFClientAnchor a1 = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );
  •                   HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);
  •                   //这里可以设置形状的样式
  •                   shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);
  •                   
  •                   break;
  •               case 2:
  •                   //设置为布尔量
  •                   cell.setCellValue(true);
  •                   break;
  •               case 3:
  •                   //设置为double值
  •                   cell.setCellValue(12.5);
  •                   break;
  •               case 4:
  •                   //设置为图片]
  •                   URL url=Test3.class.getResource("hello.jpg");
  •                   insertImage(wb,patriarch,getImageData(ImageIO.read(url)),0,4,1);
  •                   break;
  •                   
  •           }
  •           
  •           //设置单元格的样式
  •           cell.setCellStyle(style);
  •       }
  •       FileOutputStream fout=new FileOutputStream("我的第一个EXCEL.xls");
  •       //输出到文件
  •       wb.write(fout);
  •       fout.close();
  •   }
  •   //自定义的方法,插入某个图片到指定索引的位置
  •   private static void insertImage(HSSFWorkbook wb,HSSFPatriarch pa,byte[] data,int row,int column,int index){
  •       int x1=index*250;
  •       int y1=0;
  •       int x2=x1+255;
  •       int y2=255;
  •       HSSFClientAnchor anchor = new HSSFClientAnchor(x1,y1,x2,y2,(short)column,row,(short)column,row);
  •       anchor.setAnchorType(2);
  •       pa.createPicture(anchor , wb.addPicture(data,HSSFWorkbook.PICTURE_TYPE_JPEG));
  •   }
  •   //从图片里面得到字节数组
  •   private static  byte[] getImageData(BufferedImage bi){
  •       try{
  •           ByteArrayOutputStream bout=new ByteArrayOutputStream();
  •           ImageIO.write(bi,"PNG",bout);
  •           return bout.toByteArray();
  •       }catch(Exception exe){
  •           exe.printStackTrace();
  •           return null;
  •       }
  •   }
  • }


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-323824-1-1.html 上篇帖子: Tomcat与Apache的整和 下篇帖子: Apache Axis用户指南(1) (2)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表