POI操作Execl

1  POI介绍与相关jar包

JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI 。jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel。而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel。 JXL的官网为:http://www.andykhan.com/jexcelapi

POI全称 Poor Obfuscation Implementation,直译为“可怜的模糊实现”,利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能。官网:http://poi.apache.org ,POI支持office的所有版本,并且在接下来的演示中需要从前端页面导入用户上传的版本不确定的excel文件,所以选择POI来讲解。

在官网中下载jar包以及源码包:

下载完后,打开“poi-bin-3.10.1-20140818”获取操作excel需要的jar包,并将这些jar包复制到项目中。对于只操作2003 及以前版本的excel,只需要poi-3.10.1-20140818.jar ,如果需要同时对2007及以后版本进行操作则需要复制  poi-ooxml-3.10.1-20140818.jar,poi-ooxml-schemas-3.10.1-20140818.jar,以及复制在ooxml-lib目录下的xmlbeans-2.6.0.jar,dom4j-1.6.1.jar。

在“poi-bin-3.10.1-20140818\poi-3.10.1\docs\apidocs”目录中,点击“index.html”查看POI api文档,我们可以查询POI中所有这些对象的属性和方法。

2  POI与Excel

(03版) xls

(1)、 Excel 的工作簿对应POI的HSSFWorkbook对象;

(2)、 Excel 的工作表对应POI的HSSFSheet对象;

(3)、 Excel 的行对应POI的HSSFRow对象;

(4)、 Excel 的单元格对应POI的HSSFCell对象。

(07版) xlsx

(1) Excel 的工作簿对应POI的XSSFWorkbook对象;

(2) Excel 的工作表对应POI的XSSFSheet对象;

(3) Excel 的行对应POI的XSSFRow对象;

(4)Excel 的单元格对应POI的XSSFCell对象。

3  API

3.1 格式化Excel

在POI中可以利用格式化对象来格式化excel文档;也即设置excel内容的样式。POI中主要的格式化对象常用的有合并单元格、设置单元格字体、边框,背景颜色等。

合并单元格

在POI中有一个CellRangeAddress对象,中文直译是 单元格范围地址,主要用于在单元格的合并上,这个对象的构造方法CellRangeAddress(int firstRow, int lastRow, int firstCol, int lastCol) 有4个参数,分别表示(起始行号,终止行号, 起始列号,终止列号), 设置这个对象中要合并的单元格范围后,工作表对象sheet调用方法addMergedRegion(CellRangeAddress region) ,将上述设置的CellRangeAddress对象作为参数传入即可合并单元格。

【注意:上图中合并单元格后,单元格的名称是第一个单元格;即上面中合并了第二行的第二列到第五列,合并后的单元格叫B2,而其它被合并的单元格已经无效了,不能对无效单元格设置值。如果进行了设置将不显示。】

设置单元格样式

首先要设置单元格样式则要先初始化POI中的单元格样式对象HSSFCellStyle,然后在样式对象中设置不同的样式(内容位置、字体、背景、颜色、边框等)。单元格样式是由工作簿workbook创建的,一个工作簿可以创建多个样式。

① 设置单元格内容位置;设置水平位置 setAlignment(short align) ,设置垂直位置setVerticalAlignment(short align)

② 设置单元格字体;POI中的字体对象为HSSFFont,字体是由工作簿创建,可以用于多个单元格上。

③ 设置单元格背景色。

  4 POI案例

    工具: myeclipse2015, mysql,tomcat6.0

    技术支持: struts2 hibernate3.6,spring3版本

    需求实现: execl的导入并且保存到数据库;从数据库中生成execl表, 前端界面可以下载!

      

导出核心代码:    

 1 //execl表导出
 2      public void  doExportExcel() throws Exception{
 3         userlist= userService.findObjects();
 4         HttpServletResponse res= ServletActionContext.getResponse();
 5         res.setContentType("application/x-execl");
 6         res.setHeader("Content-Disposition", "attachment;filename= "+new String("用户表.xls".getBytes(), "ISO-8859-1"));
 7         ServletOutputStream outputStream = res.getOutputStream();
 8         userService.exportExcel(userlist,outputStream);
 9
10         if(outputStream != null){
11             outputStream.close();
12         }
13
14
15      }
 1 public class UserexeclUntils {
 2
 3     //导出execl
 4     public  static  void exportExcel(List<User> userlist,
 5             ServletOutputStream outputStream) {
 6       // 1 创建工作簿
 7
 8         HSSFWorkbook workbook=new HSSFWorkbook();
 9         //1.1创建合并单元格
10
11         CellRangeAddress cellrangeaddress=new CellRangeAddress(0,0,0,4);//起始行, 结束行, 起始列,结束列
12
13         //1.2 创建头标题样式
14         HSSFCellStyle style1=cellStyle(workbook,(short) 16);
15         //1.3 创建列表题样式
16         HSSFCellStyle style2=cellStyle(workbook,(short) 13);
17
18          // 2   创建工作表
19         HSSFSheet sheet=workbook.createSheet("用户表");
20         sheet.addMergedRegion(cellrangeaddress);
21         //设置工作表行宽样式
22         sheet.setDefaultColumnWidth(25);
23       // 3,4  创建行和列
24
25         //第一行
26         HSSFRow row=sheet.createRow(0);
27         HSSFCell cell=row.createCell(0);
28         cell.setCellStyle(style1);
29         cell.setCellValue("用户列表");
30
31         //创建第二行
32         HSSFRow row1=sheet.createRow(1);
33         String[] values={"用户名","账号","所属部门","性别","电子邮箱"};
34         for(int i=0;i<values.length;i++){
35             HSSFCell ce=row1.createCell(i);
36             ce.setCellStyle(style2);
37             ce.setCellValue(values[i]);
38
39         }
40
41
42         //迭代用户信息
43         User u=null;
44         if(userlist!=null){
45         for(int j=0;j<userlist.size();j++){
46             u=userlist.get(j);
47             //创建行
48             HSSFRow hssfRow=sheet.createRow(j+2);
49             //创建列
50             HSSFCell cell11=hssfRow.createCell(0);
51             cell11.setCellValue(u.getName());
52             HSSFCell cell12=hssfRow.createCell(1);
53             cell12.setCellValue(u.getAccount());
54             HSSFCell cell13=hssfRow.createCell(2);
55             cell13.setCellValue(u.getDept());
56             HSSFCell cell14=hssfRow.createCell(3);
57             cell14.setCellValue(u.isGender()?"男":"女");
58             HSSFCell cell15=hssfRow.createCell(4);
59             cell15.setCellValue(u.getEmail());
60         }
61        }
62         //将工作簿写到输出流
63         try {
64             workbook.write(outputStream);
65         } catch (Exception e) {
66             e.printStackTrace();
67         }
68
69
70     }
71
72     public static HSSFCellStyle cellStyle(HSSFWorkbook workbook,short size){
73
74         HSSFCellStyle style =workbook.createCellStyle();
75         style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
76         style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中!
77
78
79         HSSFFont font= workbook.createFont();
80         font.setFontHeightInPoints(size);
81         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
82         //
83         style.setFont(font);
84            return style;
85     }
86
87
88 }

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

        导入核心代码:

 1  //execl表导入
 2     @Override
 3     public void doImportExcel(File userExcel, String userExcelFileName) {
 4         //获取文件输出流
 5         FileInputStream fileInputStream;
 6         Workbook workbook;
 7         try {
 8             fileInputStream = new FileInputStream(userExcel);
 9             boolean is03execl=userExcelFileName.matches("^.+\\.(?i)(xls)$");
10             //创建工作簿
11              workbook=is03execl?new HSSFWorkbook(fileInputStream):new XSSFWorkbook(fileInputStream);
12              //获取工作表
13              Sheet sheet=workbook.getSheetAt(0);
14              User u=null;
15              if(sheet.getPhysicalNumberOfRows()>2){
16                  //说明存在用户数据,迭代保存到数据库
17                  for(int i=2;i<sheet.getPhysicalNumberOfRows();i++){
18                      u=new User();
19                      //获取第i行
20                      Row row=sheet.getRow(i);
21                     u.setName(row.getCell(0).getStringCellValue());
22                     u.setAccount(row.getCell(1).getStringCellValue());
23                     u.setDept(row.getCell(2).getStringCellValue());
24                     u.setGender(row.getCell(3).getStringCellValue().equals("男"));
25
26                     String mobile="";
27                     try{
28                         mobile= row.getCell(4).getStringCellValue();
29
30                     }catch(Exception e){
31                         mobile=BigDecimal.valueOf(row.getCell(4).getNumericCellValue()).toString();
32                     }
33
34                     u.setMobile(mobile);
35                     u.setEmail(row.getCell(5).getStringCellValue());
36                     u.setBirthday(row.getCell(6).getDateCellValue());
37                     save(u);
38                  }
39
40              }
41
42         } catch (Exception e) {
43             // TODO Auto-generated catch block
44             e.printStackTrace();
45         }
46     }

````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````

时间: 2024-10-13 11:47:02

POI操作Execl的相关文章

java使用POI操作excel文件,实现批量导出,和导入

一.POI的定义 JAVA中操作Excel的有两种比较主流的工具包: JXL 和 POI .jxl 只能操作Excel 95, 97, 2000也即以.xls为后缀的excel.而poi可以操作Excel 95及以后的版本,即可操作后缀为 .xls 和 .xlsx两种格式的excel. POI全称 Poor Obfuscation Implementation,直译为"可怜的模糊实现",利用POI接口可以通过JAVA操作Microsoft office 套件工具的读写功能.官网:htt

(5) 如何用Apache POI操作Excel文件-----发现Apache的POI的Bug后,如何给Apache的POI报Bug?

在我上篇文章中,(4) 如何用Apache POI操作Excel文件-----发现了POI-3.12一个回归,通过测试POI-3.12的版本,我发现了一个bug,那么发现bug后,该如何处理.我们有2种处理方式,首先我们到Apache POI的bug库里面搜索,看别人有没有创建类似的bug,如果有创建的,这个是最好的结果,我们只需要关注这个bug什么时候被修复.如果没有搜索不到,这个时候我们就需要给Apache POI报bug了.那么,如何给Apache报Bug? 第一步: 打开https://

poi操作Excel工具类

在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.写入Excel.合并Excel的功能.

利用POI操作不同版本word文档中的图片以及创建word文档

我们都知道要想利用java对office操作最常用的技术就应该是POI了,在这里本人就不多说究竟POI是什么和怎么用了.先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写入数据和向外导出数据并且保存到数据库中这些类似的操作,由于业务上的需要需要利用POI去读取word中的图片,并且去把图片去保存为一个file文件.查了Apache公司提供的api帮助文档,再网友的一些线索,本人也总结了几中对不同word版本(.doc或者是.docx结尾)对于文件中所含图片的操作方式,希望

数据字典生成工具之旅(4):NPOI操作EXECL

这篇会介绍NPOI读写EXECL,读写EXECL的组件很多,可以使用微软自己的COM组件EXECL.exe读写,不过这种方式限制很大. 1:客户环境必须装Office(虽然现在机子上不装Office的几乎没有吧) 2:EXECL读写完毕后EXECL还有进程还留在后台  ,内存回收不了 基于以上的原因,就采用了开源组件NPOI进行操作了. 阅读目录 NPOI简介 简单示例 NPOI在本工具的使用及总结 工具源代码下载 学习使用 回到顶部 NPOI简介 1.Excel表格叫做工作表:WorkBook

JAVA使用POI操作excel

这里提一下,java操作excel的组件除了apache的poi,还有jexcelapi(jxl),其中poi组件的获取地址为poi.apache.org. poi组件中常用的类有HSSFworkbook表示一个完整的excel表格,HSSFsheet表示excel中的一个工作薄,HSSFRow表示工作薄中的一行,HSSFCell表示一个单元格 下面是一个简单的写入的demo public static void main(String [] args){ try { HSSFWorkbook

POI操作Excel详解,HSSF和XSSF两种方式

HSSF方式: package com.tools.poi.lesson1; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.

利用POI操作不同版本号word文档中的图片以及创建word文档

我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写入数据和向外导出数据而且保存到数据库中这些类似的操作,因为业务上的须要须要利用POI去读取word中的图片,而且去把图片去保存为一个file文件.查了Apache公司提供的api帮助文档,再网友的一些线索,本人也总结了几中对不同word版本号(.doc或者是.docx结尾)对于文件里所含图片的操作方

POI 操作Excel 异常org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a c

POI 操作Excel 出现如下异常 org.apache.poi.openxml4j.exceptions.invalidformatexception: package should contain a content type part 代码如下 public boolean parseToExcel(String oldFileName,String newFileName){ Map<Object,Object> map = new HashMap<Object,Object&