整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Apache POI使用详解(看完这篇基本上能应付工

Apache POI使用详解(看完这篇基本上能应付工作中常用的excel)

号主要用于分享企业中常用的技术,更加侧重于实用,欢迎关注,便于浏览其它更多实用的历史文章。

一 :简介

开发中经常会设计到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的依赖

<dependency> 
 <groupId>org.apache.poi</groupId> 
 <artifactId>poi</artifactId> 
 <version>3.8</version> 
</dependency>

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

public static void createExcel() throws IOException{
	// 获取桌面路径
	FileSystemView fsv=FileSystemView.getFileSystemView();
	String desktop=fsv.getHomeDirectory().getPath();
	String filePath=desktop + "/template.xls";
	
	File file=new File(filePath);
	OutputStream outputStream=new FileOutputStream(file);
	HSSFWorkbook workbook=new HSSFWorkbook();
	HSSFSheet sheet=workbook.createSheet("Sheet1");
	HSSFRow row=sheet.createRow(0);
	row.createCell(0).setCellValue("id");
	row.createCell(1).setCellValue("订单号");
	row.createCell(2).setCellValue("下单时间");
	row.createCell(3).setCellValue("个数");
	row.createCell(4).setCellValue("单价");
	row.createCell(5).setCellValue("订单金额");
	row.setHeightInPoints(30); // 设置行的高度
	
	HSSFRow row1=sheet.createRow(1);
	row1.createCell(0).setCellValue("1");
	row1.createCell(1).setCellValue("NO00001");
	
	// 日期格式化
	HSSFCellStyle cellStyle2=workbook.createCellStyle();
	HSSFCreationHelper creationHelper=workbook.getCreationHelper();
	cellStyle2.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
	sheet.setColumnWidth(2, 20 * 256); // 设置列的宽度
	
	HSSFCell cell2=row1.createCell(2);
	cell2.setCellStyle(cellStyle2);
	cell2.setCellValue(new Date());
	
	row1.createCell(3).setCellValue(2);
	
	
	// 保留两位小数
	HSSFCellStyle cellStyle3=workbook.createCellStyle();
	cellStyle3.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
	HSSFCell cell4=row1.createCell(4);
	cell4.setCellStyle(cellStyle3);
	cell4.setCellValue(29.5);
	
	
	// 货币格式化
	HSSFCellStyle cellStyle4=workbook.createCellStyle();
	HSSFFont font=workbook.createFont();
	font.setFontName("华文行楷");
	font.setFontHeightInPoints((short)15);
	font.setColor(HSSFColor.RED.index);
	cellStyle4.setFont(font);
	
	HSSFCell cell5=row1.createCell(5);
	cell5.setCellFormula("D2*E2"); // 设置计算公式
	
	// 获取计算公式的值
	HSSFFormulaEvaluator e=new HSSFFormulaEvaluator(workbook);
	cell5=e.evaluateInCell(cell5);
	System.out.println(cell5.getNumericCellValue());
	
	workbook.setActiveSheet(0);
	workbook.write(outputStream);
	outputStream.close();
}

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

public static void readExcel() throws IOException{
	FileSystemView fsv=FileSystemView.getFileSystemView();
	String desktop=fsv.getHomeDirectory().getPath();
	String filePath=desktop + "/template.xls";
	
	FileInputStream fileInputStream=new FileInputStream(filePath);
	BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
	POIFSFileSystem fileSystem=new POIFSFileSystem(bufferedInputStream);
	HSSFWorkbook workbook=new HSSFWorkbook(fileSystem);
	HSSFSheet sheet=workbook.getSheet("Sheet1");
	
	int lastRowIndex=sheet.getLastRowNum();
	System.out.println(lastRowIndex);
	for (int i=0; i <=lastRowIndex; i++) {
		HSSFRow row=sheet.getRow(i);
		if (row==null) { break; }
		
		short lastCellNum=row.getLastCellNum();
		for (int j=0; j < lastCellNum; j++) {
			String cellValue=row.getCell(j).getStringCellValue();
			System.out.println(cellValue);
		}
	}
	
	
	bufferedInputStream.close();
}

四:Java Web 中导出和导入Excel

1、导出示例

@SuppressWarnings("resource")
@RequestMapping("/export") 
public void exportExcel(HttpServletResponse response, HttpSession session, String name) throws Exception { 
	
	String[] tableHeaders={"id", "姓名", "年龄"}; 
	
	HSSFWorkbook workbook=new HSSFWorkbook();
	HSSFSheet sheet=workbook.createSheet("Sheet1");
	HSSFCellStyle cellStyle=workbook.createCellStyle(); 
	cellStyle.setAlignment(HorizontalAlignment.CENTER); 
	cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
	
	Font font=workbook.createFont(); 
	font.setColor(HSSFColor.RED.index); 
	font.setBold(true);
	cellStyle.setFont(font);
	
	// 将第一行的三个单元格给合并
	sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2));
	HSSFRow row=sheet.createRow(0);
	HSSFCell beginCell=row.createCell(0);
	beginCell.setCellValue("通讯录");	
	beginCell.setCellStyle(cellStyle);
	
	row=sheet.createRow(1);
	// 创建表头
	for (int i=0; i < tableHeaders.length; i++) {
		HSSFCell cell=row.createCell(i);
		cell.setCellValue(tableHeaders[i]);
		cell.setCellStyle(cellStyle); 
	}
	
	List<User> users=new ArrayList<>();
	users.add(new User(1L, "张三", 20));
	users.add(new User(2L, "李四", 21));
	users.add(new User(3L, "王五", 22));
	
	for (int i=0; i < users.size(); i++) {
		row=sheet.createRow(i + 2);
		
		User user=users.get(i);
		row.createCell(0).setCellValue(user.getId()); 
		row.createCell(1).setCellValue(user.getName()); 
		row.createCell(2).setCellValue(user.getAge()); 
	}
	
	OutputStream outputStream=response.getOutputStream(); 
	response.reset(); 
	response.setContentType("application/vnd.ms-excel"); 
	response.setHeader("Content-disposition", "attachment;filename=template.xls"); 
	workbook.write(outputStream);
	outputStream.flush(); 
	outputStream.close();
}

2、导入示例

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

<dependency>
	<groupId>commons-fileupload</groupId>
	<artifactId>commons-fileupload</artifactId>
	<version>1.3</version>
</dependency>

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

<bean name="multipartResolver" 
 	class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
	<property name="defaultEncoding" value="UTF-8" />
</bean>

3、index.jsp

<a href="/Spring-Mybatis-Druid/user/export">导出</a> <br/>
<form action="/Spring-Mybatis-Druid/user/import" enctype="multipart/form-data" method="post">
	<input type="file" name="file"/> 
	<input type="submit" value="导入Excel">
</form>

4、解析上传的.xls文件

@SuppressWarnings("resource")
@RequestMapping("/import")
public void importExcel(@RequestParam("file") MultipartFile file) throws Exception{
	InputStream inputStream=file.getInputStream();
	BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);
	POIFSFileSystem fileSystem=new POIFSFileSystem(bufferedInputStream);
	HSSFWorkbook workbook=new HSSFWorkbook(fileSystem);
	//HSSFWorkbook workbook=new HSSFWorkbook(file.getInputStream());
	HSSFSheet sheet=workbook.getSheetAt(0);
	
	int lastRowNum=sheet.getLastRowNum();
	for (int i=2; i <=lastRowNum; i++) {
		HSSFRow row=sheet.getRow(i);
		int id=(int) row.getCell(0).getNumericCellValue();
		String name=row.getCell(1).getStringCellValue();
		int age=(int) row.getCell(2).getNumericCellValue();
		
		System.out.println(id + "-" + name + "-" + age);
	}
}

导出效果:

导入效果:

实战录》导语

云端卫士《实战录》栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,2017年我们将一如既往地为朋友们奉献更多优质内容。本期分享人为云端卫士安全运营工程师史怀周,主要介绍Java中多重格式报表导出方案比较。

系统中经常存在导出报告的需求,而导出的框架五花八门,该如何选择呢?

本文对几种常见的框架进行比较,希望可以在遇到导出需求时,为你提供一些参考。常见的导出格式包括Word、 Excel和PDF等,下面针对对这三种格式进行说明。

Word

Word一般用于导出包含图片,表格等的分析汇总类报告。

1.JACOB

jacob的原理是使用自带的DLL动态链接库,通过JNDI的方式实现对COM程序的调用。它要求主机必须是Windows平台,当大量请求同时操作时,有一定几率做成office资源的死锁。种种情况都是我们不能接受的,所以适用面不广。

2.java2word

java2word是通过java api调用MS Office文档的组件。可以实现打开文档,创建文档,插入图片,创建表格等多种操作。但同样的,必须要在Windows平台上才能使用。所以也不纳入考虑范围。

3.POI

POI出了可以导出Excel,还可以导出Word。相信很多人压根没有想到,但是POI对word的支持十分有限,不能设置样式。如果导出的报表格式比较复杂,这种方案也是爱莫能助的。

4.FreeMarker

Freemarker是模板工具,而word是文档,两者如何搭配呢?其实很简单。word允许通过Office转换成标准XML格式,而word中的内容就是一个个的xml标签。

所以我们可以先用office制作word模板,另存为xml之后,将其中的需要动态生成的部分改成变量,再通过freemarker生成即可(注意生成的文件后缀名要改为.doc或.docx)。而word中的图片该怎么处理呢?word中的图片是以base64存储的,所以只要将图片转换为base64,然后放在对应的变量上就可以了。

这种方式的最大缺点是word转为xml格式后,结构相对复杂,模板的制作比较麻烦。但综合来说,这是最佳的Word导出方案。

Excel

Excel通常用来导出数据类型的报表。比如某段时间内的DDoS攻击流量汇总等。Excel的导出比较常见,网上案例也比较多,大部分都使用JXL或POI这两个工具。

1.JXL

JXL对中文支持很好,且操作简单。支持图片和图表,但是支持有限,而且图片只支持PNG格式。大数据量Excel导出时的效率较差。

2.POI

POI在Excel导出中应该是最常用的方案了。它对Excel的很全面,支持使用公式、宏。对格式支持很好,可以任意定义单元格的格式。同时在大数据量Excel的生成上,效率很高。

PDF1.jasper report

jasper report是比较常用的一种生成PDF的方式。它的设计思路是先生成模板,再将数据嵌入模板中。它的缺点是模板生成复杂,规则众多,需要借助IDE的可视化工具进行编辑,入门和使用都比较困难。

2.itext

iText是十分好用的一个PDF开源软件。支持使用图片、HTML页面和直接用Java代码等多种方式生成PDF。IText的API很丰富,对PDF的格式支持很好。iText有一个显著的缺点,对HTML的格式要求特别严格,且无法识别很多html的tag和attribute,无法识别css,需要使用API函数来设置样式。如果想要使用HTML直接生成PDF,IText的缺点确认是让人抓狂。在HTML上画样式要比使用API一行一行绘制PDF样式简单的多。怎么办呢?如果你有一个可访问的页面地址,你可以试试使用下面的方式。

3.iText+phantomjs

PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。PhantomJS可以用于页面自动化,网络监测,网页截屏,以及无界面测试等。我们可以通过它对要生成PDF的URL截屏,然后将图片转成PDF。这种方式的缺点是,生成的PDF内的文字全部不可选中,没办法复制其中内容。

4.iText+flying sauser

flying sauser是基于IText的一个开源软件。它解决了iText对HTML支持弱的痛点。而且生成的PDF内容全部可以选中复制。缺点是它仍然对HTML格式要求严格。

文件开头必须是

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

所有的标签必须闭合。特殊字符需要使用<![CDATA[]]>括起来。但和前面几种方案比起来,这仍然算是比较优秀的解决方案了。b( ̄▽ ̄)d

下是江西教育考试院公布的江西省2020年具备高职单招资格的学校名单,共计62所,供大家参考:

序号 高校名称 高校招生简章网址

1江西科技学院http://zjc.jxut.edu.cn/ygzs.htm

2南昌理工学院http://zsb.nut.edu.cn

3江西服装学院http://bm.jift.edu.cn/dz/

4南昌工学院http://zsb.ncpu.edu.cn/

5江西工程学院http://zsc.jxue.edu.cn

6江西应用科技学院http://www.jxcsedu.com/zhaosheng/

7南昌职业大学http://zsb.nczyxy.com

8江西软件职业技术大学https://www.jxuspt.com/Z07_ZSJY/zhzoshengianjie.jsp

9江西医学高等专科学校http://zsjy.jxyxgz.cn/

10宜春幼儿师范高等专科学校http://www.gacycu.cn/newsshow.asp?id=1670

11江西师范高等专科学校http://www.jxsfgz.com/zsb

12上饶幼儿师范高等专科学校http://www.srygz.cn/nd.jsp?id=63

13抚州幼儿师范高等专科学校http://www.fzpec.cn/show-61-1398-1.html

14九江职业大学http://zsc.jjvu.jx.cn/index.aspx

15九江职业技术学院http://ddzs.zbrcw.cn/

16江西工业职业技术学院http://zsw.jxgzy.cn

17江西电力职业技术学院http://www.jxdlzy.com

18江西旅游商贸职业学院http://zsb.jxlsxy.com

19江西机电职业技术学院http://zs.jxjdxy.edu.cn/html/zhaoshengxinxi/index.html

20江西陶瓷工艺美术职业技术学院www.jxgymy.com

21江西环境工程职业学院www.jxhjxy.com

22江西信息应用职业技术学院http://www.jxcia.com

23江西工业工程职业技术学院http://www.jxgcxy.net

24江西交通职业技术学院https://zsb.jxjtxy.edu.cn

25江西艺术职业学院https://www.jxysedu.com

26江西财经职业学院http://www.jxvc.jx.cn/

27江西司法警官职业学院www.jxsfjy.cn

28江西应用技术职业学院http://www.jxyy.edu.cn/zsw/

29江西现代职业技术学院http://zsw.jxxdxy.edu.cn/

30江西外语外贸职业学院http://zs.jxcfs.com/

31江西工业贸易职业技术学院http://zsc.jxgmxy.com/

32江西应用工程职业学院http://zsc.jxatei.net/

33江西建设职业技术学院http://www.jxjsxy.edu.cn/news-list-zhaojshengfzhuanflany.html

34宜春职业技术学院http://zs.ycvc.jx.cn

35抚州职业技术学院http://www.fzjsxy.cn/

36江西生物科技职业学院http://zsw.jxswkj.com/ddzs.htm

37江西卫生职业学院http://zsw.jxhlxy.com.cn

38江西青年职业学院http://zs.jxqy.edu.cn/

39上饶职业技术学院http://zs.srzy.cn/news-list-zhaoshengjianzhang.html

40江西农业工程职业学院http://www.jxaevc.com

41江西科技职业学院http://www.jxkeda.com/

42江西航空职业技术学院http://www.jhxy.com.cn/?a=web.articles&uid=9059&id=3864

43赣西科技职业学院www.ganxidx.com

44江西制造职业技术学院http://www.jxmtc.com/

45江西工程职业学院http://www.jxrtvu.com/gczyxy/2020/0216/c185a19015/page.html

46江西泰豪动漫职业学院https://www.thdm.edu.cn/

47江西枫林涉外经贸职业学院http://www.fenglin.org

48江西传媒职业学院http://zsc.jxmvc.cn/

49江西冶金职业技术学院http://zs.jxyjxy.com/

50江西新能源科技职业学院http://www.tynxy.com/

51江西工商职业技术学院http://www.jxgsxy.net/Item/list.asp?id=351

52景德镇陶瓷职业技术学院http://www.jcivt.com/zsc/index.asp

53共青科技职业学院www.gqkj.com.cn

54江西水利职业学院https://mp.weixin.qq.com/s/FdP8ZOaXkwu3F0ry5mZLgg

55吉安职业技术学院http://www.japt.com.cn/zsxxw/info/1078/1262.htm

56江西洪州职业学院www.jxhzxy.com

57南昌影视传播职业学院http://www.ncyscb.com/

58赣南卫生健康职业学院http://zsjy.gnhvc.cn/zs.asp

59萍乡卫生职业学院http://www.pxhvc.com/

60江西婺源茶业职业学院http://jxtvc.com/Item/list.asp?id=1770

61江西经济管理干部学院http://zsb.jiea.cn/

62赣州职业技术学院http://www.gzpt.edu.cn/