解决方法:

使用easyexcel解决超大数据量的导入导出xlsx文件

easyexcel最大支持行数 1048576。

官网地址:

https://alibaba-easyexcel.github.io/

GitHub地址:

https://github.com/alibaba/easyexcel

使用示例:

Java数据类【重点是属性上的注解】:

package com.proengine.domain.man.partner.bean;

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.proengine.domain.common.enums.PromotionStatusEnum;
import com.proengine.sdk.enums.PromotionSubTypeEnum; import java.math.BigDecimal;
import java.util.Date; /**
* @Author: SXD
* @Description:
* @Date: create in 2019/9/26 11:43
*/
@ColumnWidth(25)
public class ProSkuSearchInfoDisplay { /**
* 促销ID
*/
@ExcelProperty(value = "促销编码",index = 6)
private String proId; /**
* 参与类型
*/
@ExcelIgnore
private Integer itemType; /**
* 商品sku 或 商品mc
* DB查询出来的值
*/
@ExcelIgnore
private String itemCode; /**
* 商品sku
* 最终结果值
*/
@ExcelProperty(value = "商品sku",index = 0)
private Long sku; /**
* 物料编码
*/
@ExcelProperty(value = "物料编码",index = 1)
private String matnrCode; /**
* 商品名称
*/
@ExcelProperty(value = "商品名称",index = 2)
private String skuName; /**
* 国条码
*/
@ExcelProperty(value = "国条码",index = 3)
private String barCode;
/**
* 商品MC
* 最终结果值
*/
@ExcelProperty(value = "商品MC",index = 4)
private String skuMc; /**
* 商品MC Name
*/
@ExcelIgnore
private String skuMcName; /**
* 促销档期
*/
@ExcelProperty(value = "促销档期",index = 5)
private String proSchedule; /**
* 促销编码
*/
@ExcelIgnore
private String proCode; /**
* 促销名称
*/
@ExcelProperty(value = "促销名称",index =7)
private String proName; /**
* 促销详情
*/
@ColumnWidth(50)
@ExcelProperty(value = "促销详情",index =8)
private String proDetail; /**
* 促销类型
*/
@ExcelIgnore
private Integer proType; /**
* 促销子类型
*/
@ExcelIgnore
private Integer proSubType; /**
* 促销类型名称
*/
@ExcelProperty(value = "促销类型",index =9)
private String proTypeName; /**
* 促销售价 单位:分
*/
@ExcelProperty(value = "促销售价",index =10)
private Double proPrice; /**
* 促销折扣值
* 仅单品促销实际应用本字段
* 单品直降 101 skuPrice-rewardValue = proPrice
* 单品特价 102 proPrice = rewardValue
* 单品折扣 103 skuPrice*(rewardValue/10000) = proPrice
*/
@ExcelIgnore
private Long rewardValue; /**
* 商品原价 单位:分
*/
@ExcelProperty(value = "商品原价",index =11)
private Double skuPrice; /**
* 促销状态
*/
@ExcelIgnore
private Integer proStatus; /**
* 促销状态名称
*/
@ExcelProperty(value = "促销状态",index =12)
private String proStatusName; /**
* PO订单号 暂无
* 采销系统相关
*/
@ExcelIgnore
private String poOrderCode; /**
* STO订单号 暂无
* 采销系统相关
*/
@ExcelIgnore
private String stoOrderCode; /**
* 预期到店日 暂无
* 采销系统相关
*/
@ExcelIgnore
private Date expectedDate; /**
* 促销开始时间
*/
@ExcelProperty(value = "促销开始时间",index =13)
private Date proStartTime; /**
* 促销结束时间
*/
@ExcelProperty(value = "促销结束时间",index =14)
private Date proEndTime; /**
* 单品 三种折扣 计算促销价格
*/
public void calcuProPrice(){ if (skuPrice != null){
if (proSubType == PromotionSubTypeEnum.SINGLE_CUT_PRICE.getValue()){
proPrice = skuPrice-rewardValue;
}
if (proSubType == PromotionSubTypeEnum.SINGLE_SPECIAL_PRICE.getValue()){
proPrice = (double)rewardValue;
}
if (proSubType == PromotionSubTypeEnum.SINGLE_REBATE.getValue()){
proPrice = skuPrice - BigDecimal.valueOf(skuPrice).subtract(BigDecimal.valueOf(rewardValue * skuPrice).divide(BigDecimal.valueOf(10000), 2, BigDecimal.ROUND_HALF_UP)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
}
} } /**
* 组装最终展示数据
*/
public void assembleParams(){
proTypeName = PromotionSubTypeEnum.getDesc(proSubType);
proStatusName = PromotionStatusEnum.getDesc(proStatus);
proPrice = proPrice != null ? proPrice/(double)100 : null;
skuPrice = skuPrice != null ? skuPrice/(double)100 : null;
} public String getBarCode() {
return barCode;
} public void setBarCode(String barCode) {
this.barCode = barCode;
} public String getProTypeName() {
return proTypeName;
} public void setProTypeName(String proTypeName) {
this.proTypeName = proTypeName;
} public String getProStatusName() {
return proStatusName;
} public void setProStatusName(String proStatusName) {
this.proStatusName = proStatusName;
} public Date getProStartTime() {
return proStartTime;
} public void setProStartTime(Date proStartTime) {
this.proStartTime = proStartTime;
} public Date getProEndTime() {
return proEndTime;
} public void setProEndTime(Date proEndTime) {
this.proEndTime = proEndTime;
} public Long getRewardValue() {
return rewardValue;
} public void setRewardValue(Long rewardValue) {
this.rewardValue = rewardValue;
} public String getProId() {
return proId;
} public void setProId(String proId) {
this.proId = proId;
} public Long getSku() {
if (sku == null){
setSkuFromItemCode();
}
return sku;
} public void setSkuFromItemCode(){
setSku(Long.parseLong(itemCode));
} public void setSku(Long sku) {
this.sku = sku;
} public Integer getItemType() {
return itemType;
} public void setItemType(Integer itemType) {
this.itemType = itemType;
} public String getItemCode() {
return itemCode;
} public void setItemCode(String itemCode) {
this.itemCode = itemCode;
} public String getMatnrCode() {
return matnrCode;
} public void setMatnrCode(String matnrCode) {
this.matnrCode = matnrCode;
} public String getSkuName() {
return skuName;
} public void setSkuName(String skuName) {
this.skuName = skuName;
} public String getSkuMc() {
return skuMc;
} public void setSkuMc(String skuMc) {
this.skuMc = skuMc;
} public String getSkuMcName() {
return skuMcName;
} public void setSkuMcName(String skuMcName) {
this.skuMcName = skuMcName;
} public String getProSchedule() {
return proSchedule;
} public void setProSchedule(String proSchedule) {
this.proSchedule = proSchedule;
} public String getProCode() {
return proCode;
} public void setProCode(String proCode) {
this.proCode = proCode;
} public String getProName() {
return proName;
} public void setProName(String proName) {
this.proName = proName;
} public String getProDetail() {
return proDetail;
} public void setProDetail(String proDetail) {
this.proDetail = proDetail;
} public Integer getProType() {
return proType;
} public void setProType(Integer proType) {
this.proType = proType;
} public Integer getProSubType() {
return proSubType;
} public void setProSubType(Integer proSubType) {
this.proSubType = proSubType;
} public Double getProPrice() {
return proPrice;
} public void setProPrice(Double proPrice) {
this.proPrice = proPrice;
} public Double getSkuPrice() {
return skuPrice;
} public void setSkuPrice(Double skuPrice) {
this.skuPrice = skuPrice;
} public Integer getProStatus() {
return proStatus;
} public void setProStatus(Integer proStatus) {
this.proStatus = proStatus;
} public String getPoOrderCode() {
return poOrderCode;
} public void setPoOrderCode(String poOrderCode) {
this.poOrderCode = poOrderCode;
} public String getStoOrderCode() {
return stoOrderCode;
} public void setStoOrderCode(String stoOrderCode) {
this.stoOrderCode = stoOrderCode;
} public Date getExpectedDate() {
return expectedDate;
} public void setExpectedDate(Date expectedDate) {
this.expectedDate = expectedDate;
}
}

生成xlsx文件:

private static final String UPLOAD_TEMP_FILE_NAME = "导出xlsx文件-%s.xlsx";

 private File createXlsxFile2(List<ProSkuSearchInfoDisplay> list,String recordKey){
String filePath = getFilePath(recordKey); ExcelWriter excelWriter = EasyExcel.write(filePath, ProSkuSearchInfoDisplay.class).build();
WriteSheet writeSheet = EasyExcel.writerSheet("促销商品数据").build();
excelWriter.write(list, writeSheet);
/// 千万别忘记finish 会帮忙关闭流
excelWriter.finish(); return new File(filePath);
} /**
* 获取临时文件路径
* @return
*/
private String getFilePath(String recordKey){
String path = ProExportSkuDataJob.class.getResource("/").getPath()+String.format(UPLOAD_TEMP_FILE_NAME, recordKey.substring(recordKey.lastIndexOf(":")+1));
DpeLogUtil.info("dpePartner#ProExportSkuDataJob createFilePath={"+path+"}");
return path;
}

使用过程中报异常和处理的方法:

https://www.cnblogs.com/sxdcgaq8080/p/11791900.html

【Easyexcel】java导入导出超大数据量的xlsx文件 解决方法的更多相关文章

  1. PHP实时生成并下载超大数据量的EXCEL文件

    最近接到一个需求,通过选择的时间段导出对应的用户访问日志到excel中, 由于用户量较大,经常会有导出50万加数据的情况.而常用的PHPexcel包需要把所有数据拿到后才能生成excel, 在面对生成 ...

  2. PHP 实时生成并下载超大数据量的 Excel 文件

    //另外由于excel数据是从数据库里逐步读出然后写入输出流的所以需要将PHP的执行时间设长一点 //(默认30秒)set_time_limit(0)不对PHP执行时间做限制. set_time_li ...

  3. 使用Layui、Axios、Springboot(Java) 实现EasyExcel的导入导出(浏览器下载)

    实现EasyExcel的导入导出(浏览器下载) 实现三个按钮的功能,但是却花费了一天的时间包括总结. 使用到的技术:springboot layui axios EasyExcel mybatis-p ...

  4. 使用VUE+SpringBoot+EasyExcel 整合导入导出数据

    使用VUE+SpringBoot+EasyExcel 整合导入导出数据 创建一个普通的maven项目即可 项目目录结构 1 前端 存放在resources/static 下 index.html &l ...

  5. easyExcel用于导入导出

    1.添加依赖: <!-- 现在已经更新到1.1.2-beta5 --> <dependency> <groupId>com.alibaba</groupId& ...

  6. 用NPOI实现导入导出csv、xls、xlsx数据功能

    用NPOI实现导入导出csv.xls.xlsx数据功能   直接上代码 首先定义一个接口   如果需要直接操作文件的话,就自己在封装一次 然后定义csv类的具体实现 这个需要引入命名空间LumenWo ...

  7. oracle创建表空间、创建用户、授权角色和导入导出用户数据

    使用数据库管理员身份登录 -- log as sysdba sqlplus / as sysdba; 创建临时表空间 -- create temporary tablespace create tem ...

  8. Mysql导入导出大量数据的方法、备份恢复办法

    经常使用PHP+Mysql的朋友一般都是通过phpmyadmin来管理数据库的.日常的一些调试开发工作,使用phpmyadmin确实很方便.但是当我们需要导出几百兆甚至几个G的数据库时,phpmyad ...

  9. c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出

    c# .Net :Excel NPOI导入导出操作教程之读取Excel文件信息及输出 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using S ...

随机推荐

  1. 调试接口你还在用postman吗

    作者 | 陈凯玲 来源 | my.oschina.net/keking/blog/3104972 接口调试是每个软件开发从业者必不可少的一项技能,一个项目的的完成,可能接口测试调试的时间比真正开发写代 ...

  2. 安装keepalived OpenSSL is not properly installed on your system. !!!

    错误信息: configure: error: !!! OpenSSL is not properly installed on your system. !!! !!! Can not includ ...

  3. Android中几种常用的定时器和延时方法

    通过实际项目的练习,掌握了几种android基本定时器和延时的用法,这里我想总结一下作为自己的收获,下面列出的是比较简洁的模式,方便简单地在程序中直接调用. 一.三种常用的定时器 1.Handler类 ...

  4. 投色子--html demo

    这是之前客户想要看的一个效果,不知道放在博客里面有没有关系,当做备份吧. <!DOCTYPE HTML> <html> <head> <meta charse ...

  5. length()返回当前字符串的字符个数

    package seday01;/** * int length() * 返回当前字符串的字符个数 * @author xingsir * */public class LengthDemo { pu ...

  6. Java日期时间API系列3-----Jdk7及以前的日期时间类的不方便使用问题

    使用Java日期时间类,每个人都很熟悉每个项目中必不可少的工具类就是dateutil,包含各种日期计算,格式化等处理,而且常常会遇到找不到可用的处理方法,需要自己新增方法,处理过程很复杂. 1.Dat ...

  7. 解决mac睡眠唤醒/插拔之后,外接显示器无法点亮/无信号问题

    问题现象 mac盖上盖子唤醒或者里临时拔出数据线,再重新连接之后,经常出现下面问题: [系统偏好设置]-[显示器]仍可以识别外接显示器: 外接显示器会提示无信号输入 解决方法 方法一 通过[系统偏好设 ...

  8. 从HTML开始

    <html>:做网页,是一种超文本标记语言. 超文本:既有添加文本的能力,还可以添加图片,视频等多媒体元素. 标记:由标签组成.不同的标签有不同的效果.        开始标签,结束标签. ...

  9. 0基础入门学习Python(第1-2章)

    第一章:就这么愉快的开始吧 1.1获取Python Python3.7 1.2从idle启动 Python 3.7.3 (default, Mar 27 2019, 09:23:39)[Clang 1 ...

  10. js的运用

    JS数组的4种声明方法: //第一种 ,,,,] console.log(A) //第二种 var B=new Array(); B[]= B[]= B[]= console.log(B)//第三种 ...