利用poi导出复杂样式的excel表格的实现。

我们要实现的效果是:

我们利用提前设计好模板样式,再在模板中填充数据的方式。

首先,pom.xml引入poi。

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>3.9</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml</artifactId>
  9. <version>3.9</version>
  10. </dependency>

然后,编写代码部分。

  1.   @RequestMapping("/print")
  2. public void print(String param,HttpServletResponse response, HttpServletRequest request) throws Exception{
  3.  
  4. //获取模板存放的路径
  5. String path=request.getSession().getServletContext().getRealPath("/")+"/ExcelTemplate/";
  6. InputStream is=new FileInputStream(new File(path+"表单模板.xls"));
  7.  
  8. HSSFWorkbook wb=new HSSFWorkbook(is);
  9. HSSFSheet sheet = wb.getSheetAt();
  10.  
  11. Row nRow=null;
  12. Cell nCell=null;
  13.  
  14. //行号
  15. int rowNo=;
  16. //列号
  17. int colNo=;
  18.  
  19. //获取模板上的第六行单元格样式
  20. nRow=sheet.getRow();
  21. //内容样式
  22. nCell=nRow.getCell();
  23. CellStyle textStartStyle=nCell.getCellStyle();
  24. nCell=nRow.getCell();
  25. CellStyle textCenterStyle=nCell.getCellStyle();
  26. nCell=nRow.getCell();
  27. CellStyle textEndStyle=nCell.getCellStyle();
  28.  
  29. //大标题================================================
  30. nRow=sheet.getRow(rowNo++); //获取第一行对象
  31. nCell=nRow.getCell(colNo); //获取第一个单元格对象
  32. nCell.setCellValue("入流入库单");
  33. //获取第二行
  34. colNo=;
  35. nRow=sheet.getRow(rowNo++);
  36. nCell=nRow.getCell(colNo++);//第二行第二列
  37. nCell.setCellValue("测试客户");
  38. nCell=nRow.getCell(colNo+=);//第二行第四列
  39. nCell.setCellValue("2018-09-18");
  40. //获取第三行
  41. colNo=;
  42. nRow=sheet.getRow(rowNo++);
  43. nCell=nRow.getCell(colNo++);//第三行第二列
  44. nCell.setCellValue("豫A 123");
  45. nCell=nRow.getCell(colNo+=);//第三行第四列
  46. nCell.setCellValue("-18");
  47. //获取第四行
  48. colNo=;
  49. nRow=sheet.getRow(rowNo++);
  50. nCell=nRow.getCell(colNo++);//第四行第二列
  51. nCell.setCellValue("郑州");
  52. nCell=nRow.getCell(colNo+=);//第四行第四列
  53. nCell.setCellValue("漯河");
  54.  
  55. //插入行
  56. for(int j=;j<;j++){
  57. colNo=;
  58. rowNo++;
  59. sheet.shiftRows(rowNo, sheet.getLastRowNum(), ,true,false);
  60. nRow=sheet.createRow(rowNo);
  61.  
  62. nCell=nRow.createCell(colNo++);
  63. nCell.setCellValue("");
  64. nCell.setCellStyle(textCenterStyle);
  65.  
  66. nCell=nRow.createCell(colNo++);
  67. nCell.setCellValue("小苹果");
  68. nCell.setCellStyle(textCenterStyle);
  69.  
  70. nCell=nRow.createCell(colNo++);
  71. nCell.setCellValue("1kg/袋");
  72. nCell.setCellStyle(textCenterStyle);
  73.  
  74. nCell=nRow.createCell(colNo++);
  75. nCell.setCellValue("");
  76. nCell.setCellStyle(textCenterStyle);
  77.  
  78. nCell=nRow.createCell(colNo++);
  79. nCell.setCellValue("");
  80. nCell.setCellStyle(textCenterStyle);
  81.  
  82. nCell=nRow.createCell(colNo++);
  83. nCell.setCellValue("仓库1");
  84. nCell.setCellStyle(textCenterStyle);
  85.  
  86. nCell=nRow.createCell(colNo++);
  87. nCell.setCellValue("beizhu");
  88. nCell.setCellStyle(textEndStyle);
  89.  
  90. }
  91.  
  92. //换行
  93. rowNo++;
  94.  
  95. //获取第六行
  96. nRow=sheet.getRow(rowNo++);
  97. nCell=nRow.getCell();
  98. nCell.setCellValue("");
  99. nCell=nRow.getCell();
  100. nCell.setCellValue("");
  101.  
  102. //下载
  103. DownloadUtil dUtil=new DownloadUtil();
  104. ByteArrayOutputStream os=new ByteArrayOutputStream();
  105. wb.write(os);
  106. dUtil.download(os, response, "测试单.xls");
  107. os.flush();
  108. os.close();
  109. }

其中,"表单模板.xls"是提前设计维护好的excel,例如:

该模板放置路径,与代码中需要一致,例如存放地址为:

download.java工具类内容如下:

  1. package cn.tf.jk.util;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.File;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7.  
  8. import javax.servlet.ServletOutputStream;
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. public class DownloadUtil {
  12.  
  13. /**
  14. * @param filePath 要下载的文件路径
  15. * @param returnName 返回的文件名
  16. * @param response HttpServletResponse
  17. * @param delFlag 是否删除文件
  18. */
  19. protected void download(String filePath,String returnName,HttpServletResponse response,boolean delFlag){
  20. this.prototypeDownload(new File(filePath), returnName, response, delFlag);
  21. }
  22.  
  23. /**
  24. * @param file 要下载的文件
  25. * @param returnName 返回的文件名
  26. * @param response HttpServletResponse
  27. * @param delFlag 是否删除文件
  28. */
  29. protected void download(File file,String returnName,HttpServletResponse response,boolean delFlag){
  30. this.prototypeDownload(file, returnName, response, delFlag);
  31. }
  32.  
  33. /**
  34. * @param file 要下载的文件
  35. * @param returnName 返回的文件名
  36. * @param response HttpServletResponse
  37. * @param delFlag 是否删除文件
  38. */
  39. public void prototypeDownload(File file,String returnName,HttpServletResponse response,boolean delFlag){
  40. // 下载文件
  41. FileInputStream inputStream = null;
  42. ServletOutputStream outputStream = null;
  43. try {
  44. if(!file.exists()) return;
  45. response.reset();
  46. //设置响应类型 PDF文件为"application/pdf",WORD文件为:"application/msword", EXCEL文件为:"application/vnd.ms-excel"。
  47. response.setContentType("application/octet-stream;charset=utf-8");
  48.  
  49. //设置响应的文件名称,并转换成中文编码
  50. //returnName = URLEncoder.encode(returnName,"UTF-8");
  51. returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必须和页面编码一致,否则乱码
  52.  
  53. //attachment作为附件下载;inline客户端机器有安装匹配程序,则直接打开;注意改变配置,清除缓存,否则可能不能看到效果
  54. response.addHeader("Content-Disposition", "attachment;filename="+returnName);
  55.  
  56. //将文件读入响应流
  57. inputStream = new FileInputStream(file);
  58. outputStream = response.getOutputStream();
  59. int length = ;
  60. int readLength=;
  61. byte buf[] = new byte[];
  62. readLength = inputStream.read(buf, , length);
  63. while (readLength != -) {
  64. outputStream.write(buf, , readLength);
  65. readLength = inputStream.read(buf, , length);
  66. }
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. } finally {
  70. try {
  71. outputStream.flush();
  72. } catch (IOException e) {
  73. e.printStackTrace();
  74. }
  75. try {
  76. outputStream.close();
  77. } catch (IOException e) {
  78. e.printStackTrace();
  79. }
  80. try {
  81. inputStream.close();
  82. } catch (IOException e) {
  83. e.printStackTrace();
  84. }
  85. //删除原文件
  86.  
  87. if(delFlag) {
  88. file.delete();
  89. }
  90. }
  91. }
  92.  
  93. /**
  94. * by tony 2013-10-17
  95. * @param byteArrayOutputStream 将文件内容写入ByteArrayOutputStream
  96. * @param response HttpServletResponse 写入response
  97. * @param returnName 返回的文件名
  98. */
  99. public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException{
  100. response.setContentType("application/octet-stream;charset=utf-8");
  101. returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必须和页面编码一致,否则乱码
  102. response.addHeader("Content-Disposition", "attachment;filename=" + returnName);
  103. response.setContentLength(byteArrayOutputStream.size());
  104.  
  105. ServletOutputStream outputstream = response.getOutputStream(); //取得输出流
  106. byteArrayOutputStream.writeTo(outputstream); //写到输出流
  107. byteArrayOutputStream.close(); //关闭
  108. outputstream.flush(); //刷数据
  109. }
  110. }

前端调用:

  1. var url = "newOrderCtrl/print";
  2. postHref(url,param);//param是传输过去的参数,如果没有的话可以为空

jquery中postHref:

  1. function postHref(url,param){
  2. if(param && url){
  3. var form = $("<form>"); //定义一个form表单
  4. form.attr('style','display:none'); //在form表单中添加查询参数
  5. form.attr('method','post');
  6. form.attr('action',url);
  7. var $param = $("<input type='text' name='param' />");
  8. $param.attr('value',JSON.stringify(param));
  9. form.append($param);
  10.  
  11. form.appendTo('body');
  12. form.css('display','none');
  13. form.submit();
  14. }else{
  15. console.log("url或param为空!");
  16. return false;
  17. }
  18. }

参考地址:https://blog.csdn.net/sdksdk0/article/details/53393453

源码下载地址:https://github.com/sdksdk0/JK

使用apache的poi来实现数据导出到excel的功能——方式一的更多相关文章

  1. 使用apache的poi来实现数据导出到excel的功能——方式二

    此次,介绍利用poi与layui table结合导出excel.这次不需要从数据库中查询出来的数据进行每一行的拼接那么麻烦,我们这次将标题定义一个id值,对应从数据库中查找出来的字段名即可. 1.po ...

  2. Java利用Apache POI将数据库数据导出为excel

    将数据库中的数据导出为excel文件,供其他人查看 public class POITest { public static void main(String[] args) { POITest te ...

  3. 使用POI把查询到的数据表数据导出到Excel中,一个表一个sheet.最详细!!!

    一.需求 我们会遇到开发任务: 经理:小王,你来做一下把数据库里的数据导出到Excel中,一个表是一个sheet,不要一个表一个Excel. 小王:好的,经理.(内心一脸懵逼) 二.前期准备 首先我们 ...

  4. struts2结合poi-3.7实现数据导出为excel

    我们在处理数据的时候,有可能要将数据导出到excel文件中,那么java中是怎么实现的呢?apache开发的poi就可以帮我们实现啦,它也是开源的代码,导入相应的jar包,就可以轻松实现,下面让我们来 ...

  5. 大批量数据导出到Excel的实现

    在平时的项目中,将数据导出到Excel的需求是很常见的,在此对一些常见的方法做以总结,并提供一种大数据量导出的实现. OLEDB   使用OLEDB可以很方便导出Excel,思路很简单,处理时将Exc ...

  6. 学习笔记 DataGridView数据导出为Excel

    DataGridView数据导出为Excel   怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...

  7. 将C1Chart数据导出到Excel

    大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...

  8. vb.net-三种将datagridview数据导出为excel文件的函数

    第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll  office.dll #Region "导出excel函数 ...

  9. 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm

    using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...

随机推荐

  1. Java版SockeDemo案例,有很详细的注释

    一般是用一个线程池来处理接受到的请求 直接上代码(一) ServerThread层 import java.io.BufferedReader; import java.io.InputStreamR ...

  2. eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南

    eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...

  3. Eclipse Paho MQTT Utility

    下载地址: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho. ...

  4. poj 1753 Flip Game(暴力枚举)

    Flip Game   Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 52279   Accepted: 22018 Des ...

  5. hdu 4734 F(x)(数位dp+优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题意:我们定义十进制数x的权值为f(x) = a(n)*2^(n-1)+a(n-1)*2(n-2 ...

  6. 【Offer】[52] 【两个链表的第一个公共结点】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入两个链表,找出它们的第一个公共结点.下图中6为公共结点:  牛客网刷题地址 思路分析 如果两个链表有公共节点,那么公共节点出现在两 ...

  7. Java网络编程 -- Netty入门

    Netty简介 Netty是一个高性能,高可扩展性的异步事件驱动的网络应用程序框架,它极大的简化了TCP和UDP客户端和服务器端网络开发.它是一个NIO框架,对Java NIO进行了良好的封装.作为一 ...

  8. MariaDB数据库自学一

    在CentOS下安装Mariadb 数据库,命令: yum -y mariadb mariadb.server 等待几分钟后就可以自动完成安装了,然后启动对应的服务: systemctl  start ...

  9. 获得本机IP和访问服务的端口号(Java)

    1. //获取本机ip地址 InetAddress addr = InetAddress.getLocalHost(); String ip=addr.getHostAddress().toStrin ...

  10. 洛谷 P1219八皇后

    把全部,在这251秒,赌上! ——<游戏人生zero> 题目:https://www.luogu.org/problem/P1219 八皇后是一道非常非常非常经典的深搜+回溯的题目. 这道 ...