开发中经常会设计到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
在开发中我们经常使用HSSF用来操作Excel处理表格数据,对于其它的不经常使用。
HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
常用的类和方法
Excel中的工作簿、工作表、行、单元格中的关系:
首先引入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();
}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/
*请认真填写需求信息,我们会在24小时内与您取得联系。