Как добавить пользовательский SheetDataWriter в Apache poi SXSSFWorkbook?

#java #apache-poi

#java #apache-poi

Вопрос:

Я просто хочу использовать свой собственный SheetDataWriter для перезаписи приведенного ниже метода

     /**
 * 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);
}
 

почему я хочу заменить это? Потому что я хочу выяснить, является ли размер кэша основной причиной замедления скорости записи из poi-sxssf-sheet???.gz чтобы poi-sxssf-template???.xlsx при высоком уровне совпадения (apache jmeter: 50 пользователей, 6 циклов, объем оперативной памяти 20).
Но вопрос в том, как использовать мой собственный SheetDataWriter при инициализации SXSSFWorkbook?

Ответ №1:

Вы спрашиваете, как переопределить методы в Java ? Кажется, это очень простой вопрос.

У вас может быть свой собственный SXSSFWorkbook класс, который расширяет default SXSSFWorkbook и переопределяет protected 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());

 }
}
 

Комментарии:

1. так мило с вашей стороны. Это действительно основной вопрос Java, виню себя в том, что я не внимательно прочитал код poi.