java的(SXSSF)EasyExcel阿里开源excel导出和XSSF导出简单示例

摘要:
2、 XSSF导出。

一、EasyExcel阿里开源excel导出(SXSSF)

参考链接:EasyExcel阿里开源excel导出

 1、建立映射到excel文件的映射类,然后get和set

import com.alibaba.excel.annotation.ExcelProperty;

public class DownloadAjgl {
    @ExcelProperty(value = "账套编码", index = 0)//可以只写列名,不写index会默认按照这个类的属性顺序来写到excel
    private String ztCode;
    @ExcelProperty(value = "账套名称", index = 1)
    private String ztName;
    @ExcelProperty("年份")
    private int year;
    @ExcelProperty("部门编码")
    private String bmCode;
    @ExcelProperty("部门名称")
    private String bmName;

    public String getZtCode() {
        return ztCode;
    }

    public void setZtCode(String ztCode) {
        this.ztCode = ztCode;
    }

    public String getZtName() {
        return ztName;
    }

    public void setZtName(String ztName) {
        this.ztName = ztName;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getBmCode() {
        return bmCode;
    }

    public void setBmCode(String bmCode) {
        this.bmCode = bmCode;
    }

    public String getBmName() {
        return bmName;
    }

    public void setBmName(String bmName) {
        this.bmName = bmName;
    }

   

}

2、controller里面

@GetMapping("/exportExcel")
    public void exportExcel(@RequestParam(value = "ztId") int ztId, HttpServletResponse response) throws IOException {

        List<Ajgl> ajglList =ajglRepository.findAllByZtId(ztId);
       
        if (ajglList.size() > 0) {
            response.setHeader("Content-Disposition", "attachment; filename=Ajgl.xlsx");
            // 响应类型,编码
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

 EasyExcel.write(response.getOutputStream(), DownloadAjgl.class).sheet("案卷导出模板").doWrite(data(ajglList));//data是把数据封装成映射类的自定义方法
            

        }
    }

3、前端跟下面  “二、XSSF导出。”一样

4、这点比较重要,如果不做的话会报错
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.alibaba.excel.exception.ExcelGenerateException: Can not close IO.] with root
cause
java.net.SocketTimeoutException: null

(我公司用window10的子系统ubuntu编译运行的)

需要在ubuntu运行几个命令

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install build-essential git unzip zip curl wget vim fontconfig ttf-dejavu fonts-dejavu

主要是第三个命令,只要第三个命令运行成功之后就不会报错了。

二、XSSF导出。

java代码

@GetMapping("/exportExcel")
    public void exportExcel(@RequestParam(value = "ztId") int ztId,
                            HttpServletResponse response) throws IOException {
   
    XSSFWorkbook xssfWorkbook = new XSSFWorkbook();
    XSSFSheet sheet = xssfWorkbook.createSheet("测试");
    XSSFRow row0 = sheet.createRow(0);
    row0.createCell(0).setCellValue("编码");
    row0.createCell(1).setCellValue("名称");
    List<Ce> ces = ceRepository.findAllByZtId(ztId);
    int num=0;
    for(var it : ces){
      num++;
      XSSFRow row = sheet.createRow(num);
      row.createCell(0).setCellValue(it.getCode());
      row.createCell(1).setCellValue(it.getName());
    }
   response.setHeader("Content-Disposition", "attachment; filename=Cs.xlsx");
     // 响应类型,编码
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    // 将指定的字节写入此输出流
    xssfWorkbook.write(response.getOutputStream());
    response.flushBuffer();
    xssfWorkbook.close();
}

在自定义的request.js中导出download

export const download = (path, name) => {
  const data = options('GET');
  fetch(backend(path), data)
    .then(response => response.blob())
    .then(blob => {
      var url = window.URL.createObjectURL(blob);
      var a = document.createElement('a');
      a.href = url;
      a.download = name;
      document.body.appendChild(a); // for firefox
      a.click();
      a.remove();
    });
};

前端代码:

<el-button type="warning" size="small" @click="exportExcel">导出</el-button>

.........

<script>
import {
  download as httpDownload,//下载必须的
  upload as uploadHeaders,
  get as httpGet,
  delete_ as httpDelete,
  PAGE_SIZE
} from "@/request";
.............

  methods: {
    exportExcel() {
       httpDownload(`/exportExcel/?ztId=${this.ztId}`, "Ajgl.xlsx");
    }
}
.....

 三、HSSFworkbook、XSSFworkbook、SXSSFworkbook区别总结

参考连接:HSSFworkbook,XSSFworkbook,SXSSFworkbook区别总结

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

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

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

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

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

从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的SXSSF方式。对于大型excel文件的创建,一个关键问题就是,要确保不会内存溢出。其实,就算生成很小的excel(比如几Mb),它用掉的内存是远大于excel文件实际的size的。如果单元格还有各种格式(比如,加粗,背景标红之类的),那它占用的内存就更多了。对于大型excel的创建且不会内存溢出的,就只有SXSSFWorkbook了。它的原理很简单,用硬盘空间换内存(就像hash map用空间换时间一样)。

SXSSFWorkbook是streaming版本的XSSFWorkbook,它只会保存最新的excel rows在内存里供查看,在此之前的excel rows都会被写入到硬盘里(Windows电脑的话,是写入到C盘根目录下的temp文件夹)。被写入到硬盘里的rows是不可见的/不可访问的。只有还保存在内存里的才可以被访问到。

SXSSF与XSSF的对比:

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

b. 不再支持Sheet.clone()

c. 不再支持公式的求值

d. 在使用Excel模板下载数据时将不能动态改变表头,因为这种方式已经提前把excel写到硬盘的了就不能再改了

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(无关)(额外)请求导出示例:

import {
  get as getToken
} from './token';

export const PAGE_SIZE = 20;

export const backend = (u) => `${process.env.VUE_APP_BASE_API}${u}`;

export const upload = () => {
  return {
    'Authorization': `Bearer ${getToken()}`
  }
}

export const options = (method) => {
  return {
    credentials: 'include',
    headers: {
      'Authorization': `Bearer ${getToken()}`,
      'Content-Type': 'application/json; charset=utf-8'
    },
    method
  };
};

export const get = (path) => fetch(backend(path), options('GET')).then((res) => res.status === 200 ?
  res.json() :
  res.json().then(err => {
    throw err;
  }));

export const delete_ = (path) => fetch(backend(path), options('DELETE')).then((res) => res.status === 200 ?
  res.json() :
  res.json().then(err => {
    throw err;
  }));

// https://github.github.io/fetch/#options
export const post = (path, body) => {
  const data = options('POST');
  data.body = JSON.stringify(body);
  return fetch(backend(path), data).then((res) => res.status === 200 ?
    res.json() :
    res.json().then(err => {
      throw err;
    }));
};

export const patch = (path, body) => {
  const data = options('PATCH');
  data.body = JSON.stringify(body);
  return fetch(backend(path), data).then((res) => res.status === 200 ?
    res.json() :
    res.json().then(err => {
      throw err;
    }));
};

export const put = (path, body) => {
  const data = options('PUT');
  data.body = JSON.stringify(body);
  return fetch(backend(path), data).then((res) => res.status === 200 ?
    res.json() :
    res.json().then(err => {
      throw err;
    }));
};


export const download = (path, name) => {
  const data = options('GET');
  fetch(backend(path), data)
    .then(response => response.blob())
    .then(blob => {
      var url = window.URL.createObjectURL(blob);
      var a = document.createElement('a');
      a.href = url;
      a.download = name;
      document.body.appendChild(a); // for firefox
      a.click();
      a.remove();
    });
};

使用例子:

.........
<script>
import {
  download as httpDownload,
  upload as uploadHeaders,
  get as httpGet,
  delete_ as httpDelete,
  PAGE_SIZE
} from "@/request";
...................

免责声明:文章转载自《java的(SXSSF)EasyExcel阿里开源excel导出和XSSF导出简单示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇通过 Javacore 了解线程运行状况新手小白必看,3种网页抓取方法。下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用POI导出excel基础篇

最近搞了下POI导出Excel,听说很多次,却是第一次搞。 在pom.xml中引入依赖 <dependency>   <groupId>org.apache.poi</groupId>   <artifactId>poi</artifactId>   <version>3.10-FI...

zuul隔离机制

文章转载自:https://blog.csdn.net/farsight1/article/details/80078099 ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高...

WeihanLi.Npoi 近期更新

WeihanLi.Npoi 近期更新 Intro 最近对我的 NPOI 扩展做了一些改变,一方面提高性能,一方面修复bug,增加一些新的功能来让它更加好用,前几天发布了 1.5.0 版本,下面来介绍一下最近的更新 默认导入/导出格式变更 在 1.5.0 版本中,将默认导入/导出的excel格式从 xlsx 改为 xls 以获得更好的性能,需要注意的是 xl...

图文并茂基于阿里云linux服务器部署nodejs项目并添加pm2守护nodejs项目运行进程(Linux version 4.19.81-17.1.al7.x86_64)

首先你要有一台LINIX服务器,登入以后按下面步骤执行命令,可查看系统版本以及配置 查看Linux 内核 通过 uname -a 命令查看系统位数是64位 x86_64表示64位系统, i686 i386表示32位系统 uname -a cat /proc/version 补充信息 -- 查看当前系统版本的详细信息 1.cat /etc/redh...

tp5.1 使用PhpSpreadsheet 读写excel

PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式,例如Excel和LibreOffice Calc。 官方文档:https://phpspreadsheet.readthedocs.io/en/latest/ php 版本要求 使用PhpSpreadsheet开发的PHP 7.2或更高版本。 其他...

Moco 详解

一、下载及安装: 运行环境: JAVA环境 linux 下载地址:https://github.com/dreamhead/moco 下载下来的是一个jar包,如:moco-runner-0.12.0-standalone.jar 把这个jar包上传到linux服务器上,然后在与moco-runner-0.12.0-standalone.jar同级的目...