Java导出网页表格Excel过程详解

将网页中的table数据,导出到excel表格,可以使用java POI实现。

  java poi是java中操作excel的工具,支持excel的导入与导出,一般有三种形式:

    1.HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;

    2.XSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx;

    3.SXSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx;

首先对这三种方式进行一个对比:

  1.HSSFWorkbook

    是poi导出最常用的方式,但是此种方式的对导出excel的行数是有限制的,导出的行数最多为65536行,超出后系统就会报错,因为行数不足七万行,所以一般不会发生内存不足的情况(OOM)。

  2.XSSFWorkbook

    这种形式是为了突破HSSFWorkbook的65535行局限,其对应的是excel2007(1048576行,16384列),扩展名为".xlsx",最多可以导出104万行,不过这样就伴随一个问题---OOM内存溢出,是因为导出过程中创建的book、sheet、row、cell等都是存在内存的,没有进行持久化,所以导致的内存不足。

  3.SXSSFWorkbook

    poi从3.8版本开始,提供了一种基于XSSF的低内存占用的SXSSF方式。对于大型excel文件的创建,最重要的问题就是解决内存溢出。其实,就算是生成很小的excel(如几MB大小)用到的内存是远大于文件实际的size的,另外如果单元格还设置各种样式格式(如行高、列宽、字体颜色等),那占用的内存就更多了。而SXSSFWorkbook正是针对这一问题产生的,他的原理也很简单,用硬盘空间换内存(就像HashMap的空间换时间一样)。

    SXSSFWorkbook是stream版本的XSSFWorkbook,他只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里(windows系统是写入到C盘根目录的temp路径下),被写入硬盘里的rows是不可见的,只有还存在内存里的才可以被访问到。

    SXSSF与XSSF对比:

    a.在一个时间点上,只可以访问一定数量的数据。

    b.不再支持Sheet.clone()、不再支持公式的求值。

    c.在使用excel模板下载数据时不能动态改变表头,因为这种方式已经提前把excel写入硬盘,是访问不到的。

    当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。

下面是在工作中用到的案例,将网页中展示的数据导出到excel中,因为数据量不大,所以使用的是HSSFWorkbook。

1.首先引入poi的maven依赖:

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>3.17</version>
 </dependency>

2.然后写一个接口,接口只需要传过来想要导出数据的时间,在接口中首先去查数据库,查出指定时间段内的数据,然后再使用@RequestMapping("/orderExp @ResponseBody

public String exportExcel(String startTime,String endTime,HttpServletResponse response) throws IOException {
        List<store_order> list = emptySpecialStoreService.selectOrderbyTime(startTime, endTime);
    String fileName = "orderInfo"; //设置导出excel文件名称
    HSSFWorkbook workbook = new HSSFWorkbook(); //创建Excel工作薄对象
    HSSFSheet sheet = workbook.createSheet();  //创建工作表对象
    sheet.setColumnWidth(12,5000);   //设置表的最后一列第12列的宽度//设置表头字体样式
    HSSFFont font = workbook.createFont();
    font.setFontName("宋体");
    font.setFontHeightInPoints((short)10); //设置字号
    font.setBold(true);  //设置加粗

    //HSSFCellStyle cellStyle = workbook.createCellStyle(); //设置列字体,这里暂不设置

    HSSFRow row0 = sheet.createRow(0); //创建第一行,第一行为每一列的标题

    String[] cellTitle={"订单号","用户账号","商品名称","优惠前价格","优惠后价格","商品类型","KT币数量","收件人姓名","收件人地址","收件人手机号","商品来源","订单状态","创建时间"};
    for(int i=0;i<cellTitle.length;i++) {
       HSSFCell cell = row0.createCell(i);  //依次设置列标题
       cell.setCellValue(cellTitle[i]);
    }
    //表格中数据总共12列,循环新建一行,然后把对象中的值依次写入到这一行中的每一列
    for(int i=0;i<list.size();i++) {
      HSSFRow row = sheet.createRow(i+1);  //创建新的一行
      store_order order = list.get(i);

      HSSFCell cell0 = row.createCell(0); //依次为当前行的每一列添加数据
      cell0.setCellValue(order.getStore_order_id());

      HSSFCell cell1 = row.createCell(1);
      cell1.setCellValue(order.getUsercode());

      HSSFCell cell2 = row.createCell(2);
      cell2.setCellValue(order.getProduct_name());

      HSSFCell cell3 = row.createCell(3);
      cell3.setCellValue(order.getPrice_before());

      HSSFCell cell4 = row.createCell(4);
      cell4.setCellValue(order.getPrice_after());

      HSSFCell cell5 = row.createCell(5);
      cell5.setCellValue(order.getProduct_type());

      HSSFCell cell6 = row.createCell(6);
      cell6.setCellValue(order.getAmountKT());

      HSSFCell cell7 = row.createCell(7);
      cell7.setCellValue(order.getPeople_name());

      HSSFCell cell8 = row.createCell(8);
      cell8.setCellValue(order.getPeople_address());

      HSSFCell cell9 = row.createCell(9);
      cell9.setCellValue(order.getPeople_mobile());

      HSSFCell cell10 = row.createCell(10);
      cell10.setCellValue(order.getProduct_source());

      HSSFCell cell11 = row.createCell(11);
      cell11.setCellValue(order.getProduct_status());

      HSSFCell cell12 = row.createCell(12);
      cell12.setCellValue(order.getCreate_time());
    }

    OutputStream os = response.getOutputStream();
    response.reset(); //重置输出流
    //设置输出头文件
    response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"), "8859_1") + ".xls"); //.xls是excel文件的后缀
    //定义输出头类型
    response.setContentType("application/msexcel");
    workbook.write(os);
    os.close();

    System.out.println("导出完成=============");
    return "导出成功!";
  }

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

(0)

相关推荐

  • java利用url实现网页内容的抓取

    闲来无事,刚学会把git部署到远程服务器,没事做,所以简单做了一个抓取网页信息的小工具,里面的一些数值如果设成参数的话可能扩展性能会更好!希望这是一个好的开始把,也让我对字符串的读取掌握的更加熟练了,值得注意的是JAVA1.8 里面在使用String拼接字符串的时候,会自动把你要拼接的字符串用StringBulider来处理,大大优化了String 的性能,闲话不多说,show my XXX code- 运行效果: 首先打开百度百科,搜索词条,比如"演员",再按F12查看源码 然后抓取

  • 详解java实现简单扫码登录功能(模仿微信网页版扫码)

    java实现简单扫码登录功能 模仿微信pc网页版扫码登录 使用js代码生成qrcode二维码减轻服务器压力 js循环请求服务端,判断是否qrcode被扫 二维码超时失效功能 二维码被扫成功登录,服务端产生sessionId,传到页面使用js保存cookie 多线程 生成qrcode相关js jquery.qrcode.js 代码 页面div <div class="pc_qr_code"> <input type="hidden" id="

  • java通过Jsoup爬取网页过程详解

    这篇文章主要介绍了java通过Jsoup爬取网页过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一,导入依赖 <!--java爬虫--> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.3</version> </depe

  • Java实现微信网页授权的示例代码

    开发前的准备: 1.需要有一个公众号(我这里用的测试号),拿到AppID和AppSecret: 2.进入公众号开发者中心页配置授权回调域名.具体位置:接口权限-网页服务-网页账号-网页授权获取用户基本信息-修改 注意,这里仅需填写全域名(如www.qq.com.www.baidu.com),勿加 http:// 等协议头及具体的地址字段: 我们可以通过使用Ngrok来虚拟一个域名映射到本地开发环境,网址https://www.ngrok.cc/,大家自己去下载学习怎么使用 同时还需要扫一下这个二

  • java调用微信接口实现网页分享小功能

    本文实例为大家分享了java调用微信接口实现网页分享小功能的具体代码,供大家参考,具体内容如下 // 获取access_token  *注意* 经过实际开发测试,微信分享不支持跨域请求,因此获取access_token的请求必须从服务器发起,否则无法获取到access_token所以以下都是服务端操作 微信接口说明参考地址 参考文章:Java微信分享接口开发详解 一.微信util类 public class ShareConstants { //微信获取ticket的接口 public stat

  • JavaWeb项目打开网页出现Session Error的异常解决方案

    这篇文章主要介绍了JavaWeb项目打开网页出现Session Error的异常解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 找到web.xml配置的原始配置的位置: <servlet> <servlet-name>dwr-invoker</servlet-name> <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class&g

  • 详解JAVA抓取网页的图片,JAVA利用正则表达式抓取网站图片

    利用Java抓取网页上的所有图片: 用两个正则表达式: 1.匹配html中img标签的正则:<img.*src=(.*?)[^>]*?> 2.匹配img标签中得src中http路径的正则:http:\"?(.*?)(\"|>|\\s+) 实现: package org.swinglife.main; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream;

  • Java实现的简单网页截屏功能示例

    本文实例讲述了Java实现的简单网页截屏功能.分享给大家供大家参考,具体如下: package awtDemo; import java.awt.AWTException; import java.awt.Desktop; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.Robot; import java.

  • Java导出网页表格Excel过程详解

    将网页中的table数据,导出到excel表格,可以使用java POI实现. java poi是java中操作excel的工具,支持excel的导入与导出,一般有三种形式: 1.HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls: 2.XSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx: 3.SXSSFWorkbook:是操作Excel2007后的版本,扩展名是.xlsx: 首先对这三种方式进行一个对比: 1.HSSFWo

  • Java实现导出word表格的示例详解

    目录 目标 实现 依赖 模版 代码 目标 多级表头.分页.动态数据 实现 依赖 <!-- poi工具类--> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.0</version> </dependency> 模版 代码 TableData数据(模版对应的数据对象)

  • Java导出oracle表结构实例详解

     Java导出oracle表结构实例详解 最近用到的,因为plsql是收费的,不让用,找了很多方法终于发现了这个. 核心语句 SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, U.object_name), U.OBJECT_TYPE FROM USER_OBJECTS U where U.OBJECT_TYPE = 'TABLE' or U.OBJECT_TYPE = 'VIEW' or U.OBJECT_TYPE = 'INDEX' or U.OBJEC

  • Java并发编程预防死锁过程详解

    这篇文章主要介绍了Java并发编程预防死锁过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在java并发编程领域已经有技术大咖总结出了发生死锁的条件,只有四个条件都发生时才会出现死锁: 1.互斥,共享资源X和Y只能被一个线程占用 2.占有且等待,线程T1已经取得共享资源X,在等待共享资源Y的时候,不释放共享资源X 3.不可抢占,其他线程不能强行抢占线程T1占有的资源 4.循环等待,线程T1等待线程T2占有的资源,线程T2等待线程T1占有

  • JAVA DOM解析XML文件过程详解

    这篇文章主要介绍了JAVA DOM解析XML文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码如下 import java.io.IOException; import javax.xml.parsers.*; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.No

  • Android Studio3.2中导出jar包的过程详解

    1.)说明. 本项目是来自github上的一个项目roottools (https://github.com/Stericson/RootTools),这里只是想本地编译后输出下jar包供自己进行使用. 2.)操作步骤. 步骤1)按之前你熟悉的方式进行开发待输出为jar的项目. 步骤2) 一般的gradle设置,比如gradle版本,android sdk的编译,目标,最小要求版本..还有compileOptions的jdk版本设置等. 步骤3)gradle中的apply plugin设置: a

  • Java获取网页数据步骤方法详解

    在很多行业当中,我们需要对行业进行分析,就需要对这个行业的数据进行分类,汇总,及时分析行业的数据,对于公司未来的发展,有很好的参照和横向对比.面前通过网络进行数据获取是一个很有效而且快捷的方式. 首先我们来简单的介绍一下,利用java对网页数据进行抓取的一些步骤,有不足的地方,还望指正,哈哈.屁话不多说了. 其实一般分为以下步骤: 1:通过HttpClient请求到达某网页的url访问地址(特别需要注意的是请求方式) 2:获取网页源码 3:查看源码是否有我们需要提取的数据 4:对源码进行拆解,一

  • Springboot+Poi导入Excel表格实现过程详解

    导入表格的主要思路就是:首先从前端页面上传文件,这里先区分一下Multipartfile和File,前者代表的是HTML中form data方式上传的文件,后者是文件系统的抽象,前者信息较少,只有二进制数据+文件名称,所以我们一般先上传的Multipartfile文件要转换成File文件我们才可以读取文件的内容.下面一步一步的讲解 Tips: 1.先生成临时文件,同时记得使用transferTo()方法把MultipartFile文件类型转成File类型: File excelFile=exce

  • java 中JXL操作Excel实例详解

    JXL操作Excel 前言: jxl是一个韩国人写的java操作excel的工具, 在开源世界中,有两套比较有影响的API可 供使用,一个是POI,一个是jExcelAPI.其中功能相对POI比较弱一点.但jExcelAPI对中文支持非常好,API是纯Java的, 并不 依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件. 另外需要说明的是,这套API对图形和图表的支持很有限,而且 仅仅识别PNG格式. 使用如下: 搭建环境 将下载后的文件解包,得到jxl.jar

  • 通过Java添加Word文本框过程详解

    前言 在Word中,文本框是指一种可移动.可调节大小的文字或图形容器.我们可以向文本框中添加文字.图片.表格等对象,下面,将通过Java编程来实现添加以上对象到Word文本框. 使用工具:Free Spire.Doc for Java (免费版) Jar文件获取及导入: 方法1:通过官网下载获取jar包.下载后,解压文件,并将lib文件夹下的Spire.Doc.jar文件导入Java程序.(如下图) 方法2:通过maven仓库安装导入. Java代码示例 import com.spire.doc

随机推荐