当前位置: 首页 > 知识库问答 >
问题:

如何在Apache poi SXSSFWorkbook上添加自定义SheetDataWriter?

解宏扬
2023-03-14
    /**
 * Override this to translate (such as decrypt or expand) the file input stream
 * as it is being read from disk.
 * The default behavior is to to pass the stream through unmodified.
 *
 * @param fis  the stream to decorate
 * @return a decorated stream
 * @throws IOException
 * @see #decorateOutputStream(FileOutputStream)
 */
protected InputStream decorateInputStream(FileInputStream fis) throws IOException {
    return fis;
}

因为我想在设置compress:true时替换此方法

@Override
//GZIPInputStream default cache byte size is 512b
protected InputStream decorateInputStream(FileInputStream fis) throws IOException {
    return new GZIPInputStream(fis);
}

为什么我要换掉这个?因为我想弄清楚高速缓存大小是否是在高并发(apache jmeter:50个用户,6个循环,ramup 20)情况下减慢从POI-SXSSF-sheet???.gz到POI-SXSSF-template???.xlsx的写入速度的主要原因。但问题是在初始化SXSSFWorkbook时如何使用我自己的SheetDataWriter?

共有1个答案

史磊
2023-03-14

您是在问如何重写java中的方法吗?这似乎是一个很基本的问题。

您可以拥有自己的SXSSFWorkbook类,该类扩展默认的SXSSFWorkbook并覆盖受保护的SheetDataWriter createSheetDataWriter()。如果是压缩的临时文件,则可以返回扩展的GZipSheetDataWriter,它覆盖Protected InputStream decorateInputStream(FileInputStream fis)

完整的工作示例:

import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.*;

import java.util.zip.GZIPInputStream;

class OverrideSXSSFWorkbook {

 public static void main(String[] args) throws Exception {

  try (
   SXSSFWorkbook workbook = new MySXSSFWorkbook(); FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   workbook.setCompressTempFiles(true);

   Sheet sheet = workbook.createSheet();
   Row row;
   Cell cell;

   row = sheet.createRow(0);
   cell = row.createCell(0);
   cell.setCellValue("CellValue");
 
   workbook.write(fileout);
   workbook.close();
   workbook.dispose();

  }
 }
}

class MySXSSFWorkbook extends SXSSFWorkbook {

 @Override
 protected SheetDataWriter createSheetDataWriter() throws IOException {

  if(isCompressTempFiles()) {
   System.out.println("GZIPSheetDataWriter");
   //return new GZIPSheetDataWriter(getSharedStringSource());

   return new GZIPSheetDataWriter(getSharedStringSource()) {

    @Override
    protected InputStream decorateInputStream(FileInputStream fis) throws IOException {
     System.out.println("overridden decorateInputStream");
     return new GZIPInputStream(fis);
    }
   };

  }
  System.out.println("default SheetDataWriter");
  return new SheetDataWriter(getSharedStringSource());

 }
}
 类似资料:
  • 问题内容: 我在这张桌子上遇到麻烦 我想要一个外键约束,并且可以。然后,我还想向该属性添加一个约束,以便它只能采用值“ a”,“ d”和“ u”。我无法将字段设置为或。 谁能告诉我为什么这段代码在MySQL中不起作用? 问题答案: 正如我在本文中所解释的,从8.0.16版本开始,MySQL添加了对CHECK约束的支持: 以前,仅在使用BEFORE INSERT和BEFORE UPDATE触发器时才

  • 是否有一个时间格式来指定这样的日期序列到轴在D3和v4?

  • Thymeleaf有许多有用的实用程序,如或。我试图添加一个自定义的,但不知道如何注册这一点。

  • 问题内容: 我想向我的Web应用程序添加一个自定义的右键单击菜单。无需使用任何预建的库就可以做到吗?如果是这样,如何显示一个不使用第三方JavaScript库的简单自定义右键单击菜单? 我的目标是像Google文档那样。它允许用户右键单击并向用户显示他们自己的菜单。 注意: 我想学习如何制作自己的东西,而不是使用大多数人以来已经制作的东西,那些第三方库充斥着功能,而我只想要我需要的功能,因此我希望

  • 我想在向url发送请求时添加假用户代理。但它并没有添加假useragent,而是使用默认的useragent。

  • 我无法在gradle项目中添加自定义源代码集。如何初始化这里的版本号?我的gradle文件看起来像: