Как получить экспорт JasperReport в формат Excel, сгенерированный с использованием кода Java, в кодированную строку base64 и декодировать его - PullRequest
0 голосов
/ 28 января 2019

Я могу сгенерировать файл отчета Jasper и экспортировать его в файл Excel при сохранении его на диск (он работает, как и ожидалось, при правильном отображении данных).Если вместо файла в качестве вывода, если я использую ByteArrayOutputStream в качестве вывода, я получаю байтовый массив.Если я кодирую поток в Base64, а затем декодирую его и сохраняю строку в файле xlsx, он показывает поврежденные данные.

{
//some code....
ReportService reportService = new ReportService();
JasperPrint jp = rawreport.getReport();
data = reportService.getReportXlsx(jp);//function defined below
BASE64Encoder base64Encoder = new BASE64Encoder();
String encckycstr = base64Encoder.encodeBuffer(data);
//If I put encckycstr into a new text file and save it has xlsx
String destinationPath = "E:\\Destination\\data.xls";
//decode Base64 String to image
FileOutputStream fos = new FileOutputStream(destinationPath); 
byte[] bytes = new BASE64Decoder().decodeBuffer(encckycstr);
fos.write(bytes);
fos.close();
//when I open data.xls, it doesnt open in excel or openoffice calc.
//some code.....

}

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Locale;

import org.springframework.stereotype.Service;

import com.ibm.icu.text.DecimalFormat;
import com.ibm.icu.text.NumberFormat;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
import net.sf.jasperreports.engine.util.DefaultFormatFactory;
import net.sf.jasperreports.engine.util.DurationNumberFormat;
import net.sf.jasperreports.engine.xml.JRGenericPrintElementParameterFactory.Parameter;
import net.sf.jasperreports.export.SimpleExporterInput;
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
import net.sf.jasperreports.export.SimpleXlsxReportConfiguration;

public byte[] getReportXlsx(final JasperPrint jp) throws JRException, 
IOException {
    JRXlsxExporter xlsxExporter = new JRXlsxExporter();
    final byte[] rawBytes;

    //for byte array export
    try(ByteArrayOutputStream xlsReport = new ByteArrayOutputStream()){
        jp.setProperty(net.sf.jasperreports.engine.JRParameter.IS_IGNORE_PAGINATION, "true");
        xlsxExporter.setExporterInput(new SimpleExporterInput(jp));
        xlsxExporter.setExporterOutput(new SimpleOutputStreamExporterOutput(xlsReport));
        SimpleXlsxReportConfiguration xlsxreportConfig = new SimpleXlsxReportConfiguration();
        xlsxreportConfig.setSheetNames(new String[] { "Some Report" });
        xlsxreportConfig.setRemoveEmptySpaceBetweenRows(true);
        xlsxreportConfig.setForcePageBreaks(false);
        xlsxreportConfig.setWrapText(false);
        xlsxreportConfig.setCollapseRowSpan(true);
        xlsxExporter.setConfiguration(xlsxreportConfig);
        xlsxExporter.exportReport();

        rawBytes = xlsReport.toByteArray();
    }

//The excel file is generated and can be opened if I give filename string as input to SimpleOutputStreamExporterOutput 
//which I believe uses file stream internally, but not when using ByteArrayOutputStream as input as used above

    /*JRXlsxExporter xlsexporter = new JRXlsxExporter();
    xlsexporter.setExporterInput(new SimpleExporterInput(jp));
    xlsexporter.setExporterOutput(new SimpleOutputStreamExporterOutput("Somedatareport.xlsx"));
    SimpleXlsxReportConfiguration xlsxreportConfig = new SimpleXlsxReportConfiguration();
    xlsxreportConfig.setSheetNames(new String[] { "Some Report" });
    xlsxreportConfig.setRemoveEmptySpaceBetweenRows(true);
    xlsxreportConfig.setForcePageBreaks(false);
    xlsxreportConfig.setWrapText(false);
    xlsxreportConfig.setCollapseRowSpan(true);
    xlsexporter.setConfiguration(xlsxreportConfig);
    xlsexporter.exportReport();*/
...