欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Apache POI详解

程序员文章站 2022-05-26 17:35:33
一 :简介 开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库中,操作Excel目前有两个框架,一个是apache 的poi, 另一个是 Java Excel Apache POI 简介是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给 ......

一 :简介


  开发中经常会设计到excel的处理,如导出excel,导入excel到数据库中,操作excel目前有两个框架,一个是apache 的poi, 另一个是 java excel

  apache poi 简介是用java编写的免费开源的跨平台的 java api,apache poi提供api给java程式对microsoft office(excel、word、powerpoint、visio等)格式档案读和写的功能。poi为“poor obfuscation implementation”的首字母缩写,意为“可怜的模糊实现”。

  官方主页: http://poi.apache.org/index.html
  api文档: http://poi.apache.org/apidocs/index.html

  java excel是一开放源码项目,通过它java开发人员可以读取excel文件的内容、创建新的excel文件、更新已经存在的excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 poi-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选。

  由于apache poi 在项目中用的比较多,本篇博客只讲解apache poi,不讲jxl

二:apache poi常用的类


  hssf - 提供读写microsoft excel xls格式档案的功能。
  xssf - 提供读写microsoft excel ooxml xlsx格式档案的功能。
  hwpf - 提供读写microsoft word doc97格式档案的功能。
  xwpf - 提供读写microsoft word doc2003格式档案的功能。
  hslf - 提供读写microsoft powerpoint格式档案的功能。
  hdgf - 提供读microsoft visio格式档案的功能。
  hpbf - 提供读microsoft publisher格式档案的功能。
  hsmf - 提供读microsoft outlook格式档案的功能。


  在开发中我们经常使用hssf用来操作excel处理表格数据,对于其它的不经常使用。

  hssf 是horrible spreadsheet format的缩写,通过hssf,你可以用纯java代码来读取、写入、修改excel文件。hssf 为读取操作提供了两类api:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

 

常用的类和方法


hssfworkbook :工作簿,代表一个excel的整个文档
  hssfworkbook(); // 创建一个新的工作簿
  hssfworkbook(inputstream inputstream); // 创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿
  hssfsheet createsheet(string sheetname); 创建一个新的sheet
  hssfsheet getsheet(string sheetname); 通过名称获取sheet
  hssfsheet getsheetat(int index); // 通过索引获取sheet,索引从0开始
  hssfcellstyle createcellstyle(); 创建单元格样式
  int getnumberofsheets(); 获取sheet的个数
  setactivesheet(int index); 设置默认选中的工作表
  write();
  write(file newfile);
  write(outputstream stream);
hssfsheet:工作表
  hssfrow createrow(int rownum); 创建新行,需要指定行号,行号从0开始
  hssfrow getrow(int index); 根据索引获取指定的行
  int addmergedregion(cellrangeaddress region); 合并单元格
  cellrangeaddress(int firstrow, int lastrow, int firstcol, int lastcol); 单元格范围, 用于合并单元格,需要指定要合并的首行、最后一行、首列、最后一列。
  autosizecolumn(int column); 自动调整列的宽度来适应内容
  getlastrownum(); 获取最后的行的索引,没有行或者只有一行的时候返回0
  setcolumnwidth(int columnindex, int width); 设置某一列的宽度,width=字符个数 * 256,例如20个字符的宽度就是20 * 256
hssfrow :行
  hssfcell createcell(int column); 创建新的单元格
  hssfcell setcell(shot index);
  hssfcell getcell(shot index);
  setrowstyle(hssfcellstyle style); 设置行样式
  short getlastcellnum(); 获取最后的单元格号,如果单元格有第一个开始算,lastcellnum就是列的个数
  setheightinpoints(float height); 设置行的高度
hssfcell:单元格
  setcellvalue(string value); 设置单元格的值
  setcelltype(); 设置单元格类型,如 字符串、数字、布尔等
  setcellstyle(); 设置单元格样式
  string getstringcellvalue(); 获取单元格中的字符串值
  setcellstyle(hssfcellstyle style); 设置单元格样式,例如字体、加粗、格式化
  setcellformula(string formula); 设置计算公式,计算的结果作为单元格的值,也提供了异常常用的函数,如求和"sum(a1,c1)"、日期函数、字符串相关函数、countif和sumif函数、随机数函数等
hssfcellstyle :单元格样式
  setfont(font font); 为单元格设置字体样式
  setalignment(horizontalalignment align); // 设置水平对齐方式
  setverticalalignment(verticalalignment align); // 设置垂直对齐方式
  setfillpattern(fillpatterntype fp);
  setfillforegroundcolor(short bg); 设置前景色
  setfillbackgroundcolor(short bg); 设置背景颜色
hssffont:字体
  setcolor(short color); // 设置字体颜色
  setbold(boolean bold); // 设置是否粗体
  setitalic(boolean italic); 设置倾斜
  setunderline(byte underline); 设置下划线
hssfname:名称
hssfdataformat :日期格式化
hssfheader : sheet的头部
hssffooter :sheet的尾部
hssfdateutil :日期工具
hssfprintsetup :打印设置
hssferrorconstants:错误信息表


excel中的工作簿、工作表、行、单元格中的关系:

一个excel文件对应于一个workbook(hssfworkbook),
一个workbook可以有多个sheet(hssfsheet)组成,
一个sheet是由多个row(hssfrow)组成,
一个row是由多个cell(hssfcell)组成


三:基础示例


首先引入apache poi的依赖

1 <dependency> 
2 <groupid>org.apache.poi</groupid> 
3 <artifactid>poi</artifactid> 
4 <version>3.8</version> 
5 </dependency>

 


示例一:在桌面上生成一个excel文件

 

 1 public static void createexcel() throws ioexception{
 2 // 获取桌面路径
 3 filesystemview fsv = filesystemview.getfilesystemview();
 4 string desktop = fsv.gethomedirectory().getpath();
 5 string filepath = desktop + "/template.xls";
 6 
 7 file file = new file(filepath);
 8 outputstream outputstream = new fileoutputstream(file);
 9 hssfworkbook workbook = new hssfworkbook();
10 hssfsheet sheet = workbook.createsheet("sheet1");
11 hssfrow row = sheet.createrow(0);
12 row.createcell(0).setcellvalue("id");
13 row.createcell(1).setcellvalue("订单号");
14 row.createcell(2).setcellvalue("下单时间");
15 row.createcell(3).setcellvalue("个数");
16 row.createcell(4).setcellvalue("单价");
17 row.createcell(5).setcellvalue("订单金额");
18 row.setheightinpoints(30); // 设置行的高度
19 
20 hssfrow row1 = sheet.createrow(1);
21 row1.createcell(0).setcellvalue("1");
22 row1.createcell(1).setcellvalue("no00001");
23 
24 // 日期格式化
25 hssfcellstyle cellstyle2 = workbook.createcellstyle();
26 hssfcreationhelper creationhelper = workbook.getcreationhelper();
27 cellstyle2.setdataformat(creationhelper.createdataformat().getformat("yyyy-mm-dd hh:mm:ss"));
28 sheet.setcolumnwidth(2, 20 * 256); // 设置列的宽度
29 
30 hssfcell cell2 = row1.createcell(2);
31 cell2.setcellstyle(cellstyle2);
32 cell2.setcellvalue(new date());
33 
34 row1.createcell(3).setcellvalue(2);
35 
36 
37 // 保留两位小数
38 hssfcellstyle cellstyle3 = workbook.createcellstyle();
39 cellstyle3.setdataformat(hssfdataformat.getbuiltinformat("0.00"));
40 hssfcell cell4 = row1.createcell(4);
41 cell4.setcellstyle(cellstyle3);
42 cell4.setcellvalue(29.5);
43 
44 
45 // 货币格式化
46 hssfcellstyle cellstyle4 = workbook.createcellstyle();
47 hssffont font = workbook.createfont();
48 font.setfontname("华文行楷");
49 font.setfontheightinpoints((short)15);
50 font.setcolor(hssfcolor.red.index);
51 cellstyle4.setfont(font);
52 
53 hssfcell cell5 = row1.createcell(5);
54 cell5.setcellformula("d2*e2"); // 设置计算公式
55 
56 // 获取计算公式的值
57 hssfformulaevaluator e = new hssfformulaevaluator(workbook);
58 cell5 = e.evaluateincell(cell5);
59 system.out.println(cell5.getnumericcellvalue());
60 
61 
62 workbook.setactivesheet(0);
63 workbook.write(outputstream);
64 outputstream.close();
65 }

 

 

示例2:读取excel,解析数据

 1 public static void readexcel() throws ioexception{
 2 filesystemview fsv = filesystemview.getfilesystemview();
 3 string desktop = fsv.gethomedirectory().getpath();
 4 string filepath = desktop + "/template.xls";
 5 
 6 fileinputstream fileinputstream = new fileinputstream(filepath);
 7 bufferedinputstream bufferedinputstream = new bufferedinputstream(fileinputstream);
 8 poifsfilesystem filesystem = new poifsfilesystem(bufferedinputstream);
 9 hssfworkbook workbook = new hssfworkbook(filesystem);
10 hssfsheet sheet = workbook.getsheet("sheet1");
11 
12 int lastrowindex = sheet.getlastrownum();
13 system.out.println(lastrowindex);
14 for (int i = 0; i <= lastrowindex; i++) {
15 hssfrow row = sheet.getrow(i);
16 if (row == null) { break; }
17 
18 short lastcellnum = row.getlastcellnum();
19 for (int j = 0; j < lastcellnum; j++) {
20 string cellvalue = row.getcell(j).getstringcellvalue();
21 system.out.println(cellvalue);
22 }
23 }
24 
25 bufferedinputstream.close();
26 }

 

四:java web 中导出和导入excel


1、导出示例

 1 @suppresswarnings("resource")
 2 @requestmapping("/export") 
 3 public void exportexcel(httpservletresponse response, httpsession session, string name) throws exception { 
 4 
 5 string[] tableheaders = {"id", "姓名", "年龄"}; 
 6 
 7 hssfworkbook workbook = new hssfworkbook();
 8 hssfsheet sheet = workbook.createsheet("sheet1");
 9 hssfcellstyle cellstyle = workbook.createcellstyle(); 
10 cellstyle.setalignment(horizontalalignment.center); 
11 cellstyle.setverticalalignment(verticalalignment.center);
12 
13 font font = workbook.createfont(); 
14 font.setcolor(hssfcolor.red.index); 
15 font.setbold(true);
16 cellstyle.setfont(font);
17 
18 // 将第一行的三个单元格给合并
19 sheet.addmergedregion(new cellrangeaddress(0, 0, 0, 2));
20 hssfrow row = sheet.createrow(0);
21 hssfcell begincell = row.createcell(0);
22 begincell.setcellvalue("通讯录");    
23 begincell.setcellstyle(cellstyle);
24 
25 row = sheet.createrow(1);
26 // 创建表头
27 for (int i = 0; i < tableheaders.length; i++) {
28 hssfcell cell = row.createcell(i);
29 cell.setcellvalue(tableheaders[i]);
30 cell.setcellstyle(cellstyle); 
31 }
32 
33 list<user> users = new arraylist<>();
34 users.add(new user(1l, "张三", 20));
35 users.add(new user(2l, "李四", 21));
36 users.add(new user(3l, "王五", 22));
37 
38 for (int i = 0; i < users.size(); i++) {
39 row = sheet.createrow(i + 2);
40 
41 user user = users.get(i);
42 row.createcell(0).setcellvalue(user.getid()); 
43 row.createcell(1).setcellvalue(user.getname()); 
44 row.createcell(2).setcellvalue(user.getage()); 
45 }
46 
47 outputstream outputstream = response.getoutputstream(); 
48 response.reset(); 
49 response.setcontenttype("application/vnd.ms-excel"); 
50 response.setheader("content-disposition", "attachment;filename=template.xls");
51 
52 workbook.write(outputstream);
53 outputstream.flush(); 
54 outputstream.close();
55 }

 

2、导入示例


  1、使用springmvc上传文件,需要用到commons-fileupload

  

1 <dependency>
2 <groupid>commons-fileupload</groupid>
3 <artifactid>commons-fileupload</artifactid>
4 <version>1.3</version>
5 </dependency>

 

  2、需要在spring的配置文件中配置一下multipartresolver

1 <bean name="multipartresolver" 
2 class="org.springframework.web.multipart.commons.commonsmultipartresolver"> 
3 <property name="defaultencoding" value="utf-8" />
4 </bean>

 

  3、index.jsp

1 <a href="/spring-mybatis-druid/user/export">导出</a> <br/>
2 
3 <form action="/spring-mybatis-druid/user/import" enctype="multipart/form-data" method="post">
4     <input type="file" name="file"/> 
5     <input type="submit" value="导入excel">
6 </form>

 

  4、解析上传的.xls文件

 

 1 @suppresswarnings("resource")
 2 @requestmapping("/import")
 3 public void importexcel(@requestparam("file") multipartfile file) throws exception{
 4 inputstream inputstream = file.getinputstream();
 5 bufferedinputstream bufferedinputstream = new bufferedinputstream(inputstream);
 6 poifsfilesystem filesystem = new poifsfilesystem(bufferedinputstream);
 7 hssfworkbook workbook = new hssfworkbook(filesystem);
 8 //hssfworkbook workbook = new hssfworkbook(file.getinputstream());
 9 hssfsheet sheet = workbook.getsheetat(0);
10 
11 int lastrownum = sheet.getlastrownum();
12 for (int i = 2; i <= lastrownum; i++) {
13 hssfrow row = sheet.getrow(i);
14 int id = (int) row.getcell(0).getnumericcellvalue();
15 string name = row.getcell(1).getstringcellvalue();
16 int age = (int) row.getcell(2).getnumericcellvalue();
17 
18 system.out.println(id + "-" + name + "-" + age);
19 }
20 }

 

项目示例代码下载地址:

http://download.csdn.net/detail/vbirdbest/9861536

 

————————————————
版权声明:本文为csdn博主「vbirdbest」的原创文章,遵循 cc 4.0 by-sa 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/vbirdbest/article/details/72870714