java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了。于是乎我在学会用Java在后台利用Apache poi 生成excel文档提供前台下载之后就想着来写一篇姊妹篇啦。

在生成Excel文档的时候我采用了和生成Word时的不同方法,Apache poi。它是用Java编写的免费开源的跨平台的 Java API,提供API给Java程式对Microsoft Office格式档案读和写的功能。想要实现这个功能,就按照下面的步骤来做吧,为了方便起见,我直接拿项目中遇到的实例来举例说明,是的,我在写这篇博客的时候同时也在完成手上的项目。

step1:创建xls格式的模板

表头含有我的甲方信息就打码了,可以看到我搞了一个空的模板文件,现在有很多东西需要在后台填入

8081857d46221a644442c70c3f0b54d4.png

step2:前台触发事件

搞一个按钮,用户点击的时候用javascript的window.location.href将页面重定向到你处理下载的URL去

比方说,这是我项目的前台,看到那个表面质量按钮吗,来看一下当它被点击的时候调用的函数

e889bfccfb1140930be38c22004e1714.png

function exportBatch() {

//get请求,可以传递参数,比方说我这里就传了一堆卷号,我只生成传过去的这堆卷号的检验记录

//参数rollNumbers的细节就不展示了,业务相关

window.location.href = '../ir/exportSurface?rollNumberList=' + rollNumbers;

}

有朋友可能想用什么Ajax来发送请求,我反正是没搞出来,挺麻烦的,网上找的相关解决方案也都比较蛋疼,因此不传什么复杂的敏感的参数,就这么写就可以。

step3:后台处理

首先你当然要把Apache poi那一套东西引入你的项目啦,我的项目是Maven项目,添加依赖很容易

org.apache.poi

poi

3.14

然后,为了方便导出Excel,在项目中建了一个ExcelUtils工具类,后面给出源码,这么一来导出Excel会变得更简单。ExcelUtils里面rXogrNBYP除了一些既定的方法外,还有就是你具体怎么去操作模板的方法了。当然你用的少的话可以不用我这工具类,而是在你需要的时候import相关的类,然后在你处理的时候就把操作模板的逻辑写进去也可以。但我这个项目很多次用到导出Excel,所以抽象出一个工具类是很有必要的,符合设计模式。

我的项目是基于SpringMVC的,来看看我后台接收到请求以后做了些什么吧

Controller:

/***

* 批量导出表面质量检验记录

*

* @return

* @throws Exception

*/

@RequestMapping(value = "exportSurface", method = RequestMethod.GET)

@ResponseBody

public void exportSurface(HttpServletRequest request,

HttpServletResponse response) throws Exception {

//参数获取及处理,业务相关不展示

//把要填写的数据放在一个map里

Map map = new HashMap();

map.put("sequence", "0001");//mock编号

map.put("date", DateUtils.toDateStr(new Date(), DateUtils.DEFAULT_DATE_PATTERN_CHINES

最后调用ExcelUtils里的相关导出方法,这个方法是自定义的,它定义的是怎样去操作模板

自定义的方法:

public static void exportInspectionRecordSurface(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {

//模板的路径,这个在自己的项目中很容易弄错,相对位置一定要写对啊

String prXogrNBYPsth = request.getRealPath("/") + INSPECTIONRECORD_SURFACE_TEMPLET_PATH;

Workbook webBook = readExcel(psth);

createCellStyle(webBook);

Sheet sheet = webBook.getSheetAt(0);

//开始操作模板,找到某行某列(某个cell),需要注意的是这里有个坑,行和列的计数都是从0开始的

//一次数据插入的位置不对,别灰心,多试几次就好啦,你要是能看懂我下面的代码,数据插在了什么位置,你就明白了

int rows = 1;

Row row = sheet.getRow(rows);

row.createCell(1).setCellValue((String) map.get("sequence"));

row.createCell(3).setCellValue((String) map.get("date"));

row.createCell(9).setCellValue((String) map.get("chetaihao"));

rows = 2;

row = sheet.getRow(rows);

row.createCell(1).setCellValue((String) map.get("productName"));

row.createCell(3).setCellValue((String) map.get("specification"));

row.createCell(9).setCellValue((String) map.get("memo"));

//检验记录的插入业务相关,不展示,其实就是for循环在合适的行合适的列插入一个个对象的属性即可,你这么聪明,没问题的

writeExcel(response, webBook, "表面质量检验记录");

}

ExcelUtils:

//这里得有你自己的package名

import org.apache.poi.hssf.usermodel.HSSFCellStyle;

import org.apache.poi.hssf.usermodel.HSSFFont;

import org.apache.poi.hssf.usermodel.HSSFRichTextString;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.apache.poi.ss.usermodel.*;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.*;

import java.net.URLEncoder;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

/**

* Created by bwju on 2016/12/06.

*/

public class ExcelUtils {

private static final String INSPECTIONRECORD_SURFACE_TEMPLET_PATH = "/asserts/templete/InspectionRecordSurface.xls";

private static HSSFCellStyle cellstyle = null;

public static void exportInspectionRecordSurface(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {

//实现上文里有,改个函数名,写你的操作模板函数吧!

}

private static Workbook readExcel(String filePath) {

InputStream in = null;

Workbook work = null;

try {

in = new FileInputStream(filePath);

work = new HSSFWorkbook(in);

} catch (FileNotFoundException e) {

System.out.println("文件路径错误");

e.printStackTrace();

} catch (IOException e) {

System.out.println("文件输入流错误");

e.printStackTrace();

}

return work;

}rXogrNBYP

private static void writeExcel(HttpServletResponse response, Workbook work, String fileName) throws IOException {

OutputStream out = null;

try {

out = response.getOutputStream();

response.setContentType("application/ms-excel;charset=UTF-8");

response.setHeader("Content-Disposition", "attachment;filename="

.concat(String.valueOf(URLEncoder.encode(fileName + ".xls", "UTF-8"))));

work.write(out);

} catch (IOException e) {

System.out.println("输出流错误");

e.printStackTrace();

} finally {

out.close();

}

}

private static Cell setCellStyleWithStyleAndValue(CellStyle style, Cell cell, String value) {

cell.setCellStyle(style);

cell.setCellValue(value);

return cell;

}

private static Cell setCellStyleWithValue(Cell cell, String value) {

cell.setCellStyle(cellstyle);

cell.setCellValue(value);

return cell;

}

private static Cell setCellStyleWithStyleAndValue(CellStyle style, Cell cell, RichTextString value) {

cell.setCellStyle(style);

cell.setCellValue(value);

return cell;

}

private static Cell setCellStyleWithValue(Cell cell, int value) {

cell.setCellStyle(cellstyle);

cell.setCellValue(value);

return cell;

}

private static Cell setCellStyleWithValue(Cell cell, double value) {

cell.setCellStyle(cellstyle);

cell.setCellValue(value);

return cell;

}

private static HSSFCellStyle createCellStyle(Workbook wb) {

cellstyle = (HSSFCellStyle) wb.createCellStyle();

cellstyle.setAlignment(HSSFCellStyle.ALIGN_CENwww.cppcns.comTER);

cellstyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

cellstyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

cellstyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

cellstyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

cellstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

return cellstyle;

}

}

step4:启动项目,然后测试一下,看!完美的导出了。。。有图为证

30c3e095af80f8f3900cb461f77ea925.png

嗯嗯,文章写到这里就结束啦,Apache poi还提供了很多API在本例中为得到展示,比如能够指定样式等等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

本文标题: java后台利用Apache poi 生成excel文档提供前台下载示例

本文地址: http://www.cppcns.com/ruanjian/java/190786.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔php漏洞,[安全预警]关于最近宝塔闹得很厉害的PMA漏洞BUG

文章前言在2020年8月23日的下午有个憨憨管理在我群艾特全员 说宝塔爆出漏洞了赶快更新吧!影响机器需同时满足以下所有条件1、软件版本为Linux面板7.4.2 或者Windows面板6.8.02、开放888且未配置http认证,3、安装了phpmyadmin,mysql数据库不受…

求十个学生的平均成绩java,JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。...

JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。mip版 关注:116 答案:3 悬赏:30解决时间 2021-01-26 06:39已解决2021-01-25 17:54声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。JAVA知识最佳答案2021-01-25 18:12public class S…

php伪静态限制网页播放视频,学习猿地-php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法:首先判断文件是否存在;然后设置存在则不rewirte,不存在且符合规则才rewrite;最后修改htaccess文件即可。具体问题:PHP伪静态后不能访问纯html文件.htaccess文件RewriteEngine onRew…

oracle binary_integer pls_integer,oracle中binaryinteger与plsinteger的区别

oracle中binaryinteger与plsinteger的区别 Oracle 中 Binary_Integer 与 Pls_Integer 的区别Binary_Integer 与 Pls_Integer 都是整型类型. Binary_Integer 类型变量值计算是由 Oracle 来执行,不会出现溢出,但是执行速度较慢,因为它是由 Orac…

梁单元分析matlab,[FEM][有限元][编程][Matlab][Code by myself] 2D Timoshenko梁单元

(有空和小伙伴一起写写有限元程序)程序作者 ( Author )JiDong Cui (崔济东)1, XueLong Shen (沈雪龙)21.广州容柏生建筑结构设计事务所;2.华南理工大学建筑设计研究院基本概念 ( Concept )欧拉梁单元基于一定的假设(Kirchhoff假设),在梁的高度远小于其跨…

oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)

oracle的伪列以及伪表oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Oracle完成的。Oracle目前有以下伪列:一、伪列&#…

linux运行搜狗拼音,Linux 搜狗输入法的安装(Ubuntu版)

1、首先从搜狗官网下载搜狗输入法Linux版本的安装包2、按ctrl alt T 打开Linux终端3、安装搜狗输入法: sudo dkpg -i xxx.deb, 如果报错,主要是由于两个原因:a、权限不够,可以通过获取root权限,命令‘su’;…

2023年腾讯云轻量应用服务器测评2核2G4M带宽

腾讯云轻量应用服务器测评2核2G4M带宽88元一年,2核CPU、2G内存、3M带宽,腾讯云轻量应用服务器(Tencent Cloud Lighthouse)是一款开箱即用的云服务器产品,面向轻量应用场景,旨在为中小企业和开发者提供便捷高…

linux tcp连接计算机,计算机基础知识——linux socket套接字tcp连接分析

2016.7.4今天晚上对项目顶层文件(daemon)进行了分析,对其中的TCP连接进行具体的代码级分析。1、需求分析首先得知道我们这里为什么要用TCP连接,我们的整个测试系统是由上位机作为客户端,发送测试文件,测试命令给我们测试程序上&am…

定时器驱动数码管c语言程序,74hc595驱动数码管时间程序

74hc595驱动数码管时间程序这里是电路图:下面是51单片机驱动74hc595芯片的程序:#include //包含51单片机的头文件#include#define uint unsigned int#define uchar unsigned char//sbit sin_595 P1^0;//sbit rclk_595 P…

石油大学c语言考试答案,中石油华东2012春《C语言》在线答案

);! X" l4 d0 m5 T0 A 满分:2 分* }4 x X$ a& t, l% i3. 当对两个字符串进行比较时,应该使用的函数是A. strcat, y, Z- S p t! k! GB. strcmp2 } R% s8 P* Z/ yC. strcpy, i$ q. b5 P8 m j v1 k3 H2 W3 mD. strlen* I B S…

c语言中怎么暂停一个一个游戏,求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束...

求助:最近在linux下用c语言写了一个贪吃蛇程序,有几个问题,第一:贪吃蛇怎么实现暂停,第二:有时候同时输入上下左右中的两个键就会直接游戏结束/*以下是主要的逻辑代码,还有些.c和.h就没发了*/#i…

android view显示隐藏动画效果,Android 根据手势顶部View自动展示与隐藏效果

首先来看一下效果:大体思路如下:总体布局用了一个自定义的ViewGroup,里面包了两个View(top View,bottomView)我在bottomView里放了ViewPager,里面又有Fragment,Fragment里放的是ListView原理:Vi…

android点击地址调用地图,Android 实现点击按钮 调用手机外部地图导航

//弹出Dialog 选择外部地图private void setMap(){final Dialog dianew AlertDialog.Builder(mContext).create();View viewLayoutInflater.from(mContext).inflate(R.layout.dialog_map, null);dia.show();dia.getWindow().setContentView(view);TextView tv_baidu(TextView) …

android webservices 返回多行多列数据,NoahWeb实现表格多行多列

用NoahWeb的表现层指令可以在动态生成的页面中非常容易的实现多行多列的表格。在正式学习以前我们需要先来了解一下怎么用NoahWeb的表现层来做动态内容显示。在NoahWeb设计器中新建或打开一项目以后,在Macromedia Dreamweaver MX 2004中新建了一个“空页面”&#x…

android程序 美食分享,下厨房Android产品分析

下厨房产品宣传图一、产品概况1、产品简介下厨房菜谱是一款简单实用的美食应用,可以帮助用户寻找想吃的美食,搜索精美食谱,使用购买清单选购食材,与朋友分享自己制作的美食。2、主要竞品美食杰、豆果美食、好豆菜谱、香哈菜谱。二…

html实现图片加载动画效果,HTML5+javascript实现图片加载进度动画效果

在网上找资料的时候,看到网上有图片加载进度的效果,手痒就自己也写了一个。图片加载完后,隐藏loading效果。想看加载效果,请ctrelF5强制刷新或者清理缓存。效果预览:0%代码如下:HTML5javascript实现图片加载…

html5开发app的缺点,全解HTML 5在移动Web应用的优劣势

关于HTML5HTML5具有语义学、本地存储、设备访问、连接性、多媒体、平面和三维效果、性能和集成和CSS3八大技术特征。让Web应用进入无插件时代,在功能和性能上逼近桌面应用。促使应用Web化,实现跨平台。HTML5规范草案将于2012年发布候选推荐版&#xff0c…

html怎么加断点快捷键,HTML添加断点 - osc_vyztkm1b的个人空间 - OSCHINA - 中文开源技术交流社区...

###1.前言 很多时候,页面的dom元素是动态添加的,而我们不知道具体是哪段js代码在操作这个dom元素,所以需要进行断点,对相应的dom元素进行断点监听,这样才能找出相关的js代码。在浏览器的调试工具中,切到ele…

html5 canvas 图像预览,html5-canvas 加载并显示图像

示例加载图像并将其放置在画布上var image new Image(); // 请参阅有关创建图像的注释image.src "imageURL";image.onload function(){ctx.drawImage(this,0,0);}创建图像有几种创建图像的方法new Image()document.createElement("img")作为HTML正文的…