Я могу сгенерировать файл отчета 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();*/