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

发布时间 - 2026-01-11 01:06:29    点击率:

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

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

step1:创建xls格式的模板

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

step2:前台触发事件

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

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

function exportBatch() { 
    //get请求,可以传递参数,比方说我这里就传了一堆卷号,我只生成传过去的这堆卷号的检验记录 
    //参数rollNumbers的细节就不展示了,业务相关 
    window.location.href = '../ir/exportSurface?rollNumberList=' + rollNumbers; 
  } 

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

step3:后台处理

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

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

然后,为了方便导出Excel,在项目中建了一个ExcelUtils工具类,后面给出源码,这么一来导出Excel会变得更简单。ExcelUtils里面除了一些既定的方法外,还有就是你具体怎么去操作模板的方法了。当然你用的少的话可以不用我这工具类,而是在你需要的时候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<String, Object> map = new HashMap<String, Object>(); 
    map.put("sequence", "0001");//mock编号 
    map.put("date", DateUtils.toDateStr(new Date(), DateUtils.DEFAULT_DATE_PATTERN_CHINESE)); 
    map.put("chetaihao", "1#");//mock车台号 
    map.put("productName", "预应力钢绞线");//mock品名 
    map.put("specification", "规格");//mock规格 
    map.put("memo", "备注");//mock备注 
    map.put("inspectRecordBizList", inspectRecodeBizList); 
    ExcelUtils.exportInspectionRecordSurface(request, response, map); 
  } 

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

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; 
  } 
 
  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_CENTER); 
    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:启动项目,然后测试一下,看!完美的导出了。。。有图为证

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

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


# apache poi生成excel  # apache poi excel  # apache poi 操作excel  # Java使用Apache POI操作Excel详解  # Java使用apache poi操作excel的方式  # Java使用Apache.POI中HSSFWorkbook导出到Excel的实现方法  # Java通过apache poi生成excel实例代码  # Java使用Apache POI库读取Excel表格文档的示例  # 使用 Apache POI 在 Java 中写入&  # 我在  # 文档  # 填入  # 博客  # 自己的  # 的是  # 是在  # 放在  # 有很多  # 就不  # 我只  # 也在  # 很有  # 我这  # 但我  # 些什么  # 它是  # 很容易  # 要把  # 说我 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: JavaScript如何实现错误处理_try...catch如何捕获异常?  如何为不同团队 ID 动态生成多个独立按钮  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何利用DOS批处理实现定时关机操作详解  如何用IIS7快速搭建并优化网站站点?  装修招标网站设计制作流程,装修招标流程?  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Python高阶函数应用_函数作为参数说明【指导】  如何在Windows 2008云服务器安全搭建网站?  JavaScript如何实现音频处理_Web Audio API如何工作?  jQuery validate插件功能与用法详解  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  图册素材网站设计制作软件,图册的导出方式有几种?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  如何在建站之星网店版论坛获取技术支持?  Laravel中的withCount方法怎么高效统计关联模型数量  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel怎么清理缓存_Laravel optimize clear命令详解  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  Laravel怎么为数据库表字段添加索引以优化查询  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  在线制作视频网站免费,都有哪些好的动漫网站?  phpredis提高消息队列的实时性方法(推荐)  北京专业网站制作设计师招聘,北京白云观官方网站?  用v-html解决Vue.js渲染中html标签不被解析的问题  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  深圳网站制作的公司有哪些,dido官方网站?  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Linux系统命令中screen命令详解  如何在Ubuntu系统下快速搭建WordPress个人网站?  Linux系统运维自动化项目教程_Ansible批量管理实战  如何在景安云服务器上绑定域名并配置虚拟主机?  Python3.6正式版新特性预览  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  创业网站制作流程,创业网站可靠吗?  如何用好域名打造高点击率的自主建站?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  html5的keygen标签为什么废弃_替代方案说明【解答】  利用python获取某年中每个月的第一天和最后一天