简述JavaWeb项目,如何处理EXCEL表格的相关业务

因为现在正在做的一个项目,是从零开始的,所以任何工具类的代码都需要自己重新再写。而以前只写接口的项目都很成熟,一些常用的功能都已经封装好,需要用的时候直接调用即可,即便是有改动也只是参数上的改动,比如判断NULL值的工具类,比如时间类型转换的工具类等等。
而这次的项目涉及了EXCEL表格的模板下载和导入模板数据的修改功能,而这些功能在以前一般都是直接调用的。这次要自己写,所以就干脆就写一篇博客以做总结,给同样需要写原生的EXCEL功能的你做一个参考。

对于处理EXCEL业务,我选择了Apache的POI框架。当然还有其他框架可以做为业务支持,比如阿里的EasyExcel。

首先从一个整体视角来看一看POI框架的结构模型:

HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。

可以看到POI是可以处理全套的Microsoft Office格式档案读和写的功能的。在这里我们主要讨论的是HSSF这一层,因为它主要处理EXCEL的格式档案的功能。

对于Web项目的EXCEL功能这一块儿,比较基础的完整业务闭环是:下载EXCEL模板–>在模板里填充数据–>导入填充了数据的EXCEL文件–>后台获取表格内的数据做业务处理。所以先来看看EXCEL表格的下载功能如何实现。

	public void write(OutputStream stream) throws IOException {try (POIFSFileSystem fs = new POIFSFileSystem()) {write(fs);fs.writeFilesystem(stream);}}

这是POI框架的下载方法。可以看到该方法的参数需要一个输出流。而对于web项目,输出流可以来自ServletResponse接口。

OutputStream output = response.getOutputStream();

一行代码就可以得到一个输出流的对象。需要注意的是,这里需要对响应的部分参数做一个设定,具体需要设定的内容是:

response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("模板名.xls", "utf-8"));// 设置跨域允许访问头
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");

设置好之后就可以调用write方法执行下载了。

接下来是对于EXCEL模板表格的样式处理。
先来看一看HSSF的结构模型:

HSSFWorkbook excel文档对象
HSSFSheet excel的sheet
HSSFRow excel的行
HSSFCell excel的单元格
HSSFFont excel字体
HSSFName 名称
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表

HSSFSheet 就是一个EXCEL表格对象,可以通过createSheet方法来获得。

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(String sheetname);

方法参数可填可不填,如果填了就表示EXCEL的名字,如图所示:
在这里插入图片描述
有了HSSFSheet对象之后,可以通过它来创建HSSFRow(行):

 HSSFRow row= sheet.createRow(int rownum);

参数表示是表格的第几行,0表示第一行,逐行加1,以此类推。
有了HSSFRow 对象之后,可以通过它来获得列对象,也就是HSSFCell :

HSSFCell cell= row.createCell(int column);

同样的,参数表示是一行里的第几列,0表示第一列,逐行加1,以此类推。
每一个HSSFCell 对象就表示每一个类,而EXCEL一行里面一般有多列,因此一般会用此方法创建很多个列对象。

给对应的列填充数据,需要使用setCellValue方法:

cell.setCellValue(String value)

到这一步,一个简单的带有数据的EXCEL表格就创建好了。

通过它的write方法,就完成了指定格式的EXCEL的模板表格下载功能。

接下来是EXCEL表格的导入功能。
我们需要用一个MultipartFile参数对象来接住EXCEL表格,之后需要把它转换成EXCEL的对象,即上面提到的HSSFSheet对象。因为POI对于EXCEL的操作,是一环套一环的,而HSSFSheet是最上面的一环,只有通过它,才能往下一步步的操控每一行和每一列的数据。

把MultipartFile对象转换成HSSFSheet对象,POI框架提供了几个步骤:

//获取输入流
InputStream inputStream = MultipartFile.getInputStream();
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(inputStream);
HSSFWorkbook wb = new HSSFWorkbook(poifsFileSystem);//获取sheet
HSSFSheet sheet = wb.getSheetAt(int index);

怎么理解最后这一行代码呢?
它可以看做可能会同时导入好几个EXCEL表格,后面的参数就是这个EXCEL集合的下标。0表示第一个表格,往后加1。
如果不想通过下标取得EXCEL对象,还可以通过表格的名字来获取:

HSSFSheet sheet = wb.getSheet(String name);

用这个方法的前提是EXCEL的表格是取了名字的。

当获取了表格对象HSSFSheet 之后,就可以通过它的对应方法来操作整个EXCEL表格了。

还有HSSFFont、HSSFCellStyle 等设置表格样式的类,因为比较繁琐,需求也都不同,就不做一一讨论了,查询一下框架手册就很容易上手。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部