JSD-9551 WebService开放
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

184 lines
7.4 KiB

/*
* Copyright (C), 2018-2022
* Project: starter
* FileName: XMLExporter
* Author: Louis
* Date: 2022/3/12 15:54
*/
package com.fr.plugin.tabledataservice.exporter;
import com.fanruan.api.report.export.BaseAppExporter;
import com.fr.base.ResultFormula;
import com.fr.base.Style;
import com.fr.general.GeneralUtils;
import com.fr.intelli.record.Focus;
import com.fr.intelli.record.Original;
import com.fr.io.core.ExporterUtils;
import com.fr.main.workbook.ResultWorkBook;
import com.fr.page.ClippedPageProvider;
import com.fr.page.PageSetProvider;
import com.fr.page.PaperSettingProvider;
import com.fr.page.ReportPageProvider;
import com.fr.plugin.tabledataservice.Constants;
import com.fr.plugin.tabledataservice.bean.ReportRequest;
import com.fr.record.analyzer.EnableMetrics;
import com.fr.report.cell.CellElement;
import com.fr.report.cell.cellattr.CellGUIAttr;
import com.fr.report.core.ReportUtils;
import com.fr.report.elementcase.ElementGetter;
import com.fr.stable.ColumnRow;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
import java.io.*;
import java.util.Iterator;
import java.util.List;
/**
* <Function Description><br>
* <数据导出功能XMLExporter>
* 参考TextExporter PageSetProvider CSVExporter ResultWorkBook WriteRWorkBook
*
* @author fr.open
* @since 1.0.0
*/
@EnableMetrics
public class XMLExporter extends BaseAppExporter {
private StringBuilder exporterObject;
private int startPageNo;
private int endPageNo;
@Override
@Focus(id = Constants.PLUGIN_ID, text = "Plugin-tabledataservice", source = Original.PLUGIN)
public void export(OutputStream outputStream, ResultWorkBook resultWorkBook) throws Exception {
if (resultWorkBook == null) {
throw new Exception("Report can not be null!");
}
String dataArray = this.export(resultWorkBook);
printAsXML(outputStream, dataArray);
}
private String export(ResultWorkBook resultWorkBook) {
StringBuilder reportsArray = new StringBuilder();
if (resultWorkBook == null) {
return reportsArray.toString();
}
List<PaperSettingProvider> paperSettingList = ReportUtils.getPaperSettingListFromWorkBook(resultWorkBook);
PageSetProvider pageSetProvider = resultWorkBook.generateReportPageSet(paperSettingList).traverse4Export();
if (this.exporterObject != null) {
this.exporterObject.append("<total_page_number>").append(pageSetProvider.size()).append("</total_page_number>");
}
if (startPageNo <= 0 || endPageNo <= 0) {
startPageNo = 1;
endPageNo = pageSetProvider.size();
}
reportsArray = this.exportPages(pageSetProvider);
return reportsArray.toString();
}
@Override
public void export(OutputStream outputStream, PageSetProvider pageSetProvider) throws Exception {
StringBuilder dataPagesArray = new StringBuilder();
for (int i = 0; i < pageSetProvider.size(); ++i) {
ReportPageProvider reportPageProvider = pageSetProvider.getPage(i);
ClippedPageProvider clippedPageProvider = ExporterUtils.support(reportPageProvider);
if (clippedPageProvider == null) {
break;
}
dataPagesArray.append("<page>").append(this.exportReport((ElementGetter) clippedPageProvider, 0, ((ElementGetter) clippedPageProvider).getRowCount())).append("</page>");
}
printAsXML(outputStream, dataPagesArray.toString());
}
public StringBuilder exportPages(PageSetProvider pageSetProvider) {
StringBuilder pagesArray = new StringBuilder();
for (int i = (startPageNo - 1); i <= (endPageNo - 1) && i < pageSetProvider.size(); ++i) {
ReportPageProvider reportPageProvider = pageSetProvider.getPage(i);
ClippedPageProvider clippedPageProvider = ExporterUtils.support(reportPageProvider);
if (clippedPageProvider == null) {
break;
}
pagesArray.append("<page>").append(this.exportReport((ElementGetter) clippedPageProvider, 0, ((ElementGetter) clippedPageProvider).getRowCount())).append("</page>");
}
return pagesArray;
}
public String exportReport(ElementGetter reportCase, int start, int end) {
StringBuilder pageXML = new StringBuilder();
for (int row = start; row < end; ++row) {
Iterator iterator = reportCase.getRow(row);
String cellText;
while (iterator.hasNext()) {
CellElement cell = (CellElement) iterator.next();
Object value = this.getCellValue(cell);
Style style = cell.getStyle();
if (style != null) {
cellText = Style.valueToText(value, style.getFormat());
} else {
cellText = GeneralUtils.objectToString(value);
}
ColumnRow columnRow = ColumnRow.valueOf(cell.getColumn(), cell.getRow());
if (reportCase.getColumnWidth(cell.getColumn()).less_than_or_equal_zero()
|| reportCase.getRowHeight(cell.getRow()).less_than_or_equal_zero()) {
continue;
}
pageXML.append("<").append(columnRow.toString()).append(">")
.append(cellText)
.append("</").append(columnRow.toString()).append(">");
}
}
return pageXML.toString();
}
private Object getCellValue(CellElement cell) {
if (cell == null) {
return null;
}
Object value = cell.getShowValue();
if (value instanceof ResultFormula) {
value = ((ResultFormula) value).getResult();
}
CellGUIAttr gui = cell.getCellGUIAttr();
if (gui != null && !gui.isPrintContent()) {
value = StringUtils.EMPTY;
}
return value == null ? StringUtils.EMPTY : value;
}
/**
* XML数据输出到前端
*
* @param outPutStream
* @param data
* @throws UnsupportedEncodingException
*/
private void printAsXML(OutputStream outPutStream, String data) throws UnsupportedEncodingException {
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outPutStream, EncodeConstants.ENCODING_UTF_8)));
if (this.exporterObject != null) {
StringBuilder resultXML = this.exporterObject;
resultXML.append("<data>").append(data).append("</data>");
resultXML.append("</report>");
writer.print(resultXML);
} else {
writer.print(data);
}
writer.flush();
writer.close();
}
/**
* 设置导出参数
*
* @param reportRequest
*/
public void setExporterObject(ReportRequest reportRequest) {
this.startPageNo = reportRequest.getStartPage();
this.endPageNo = reportRequest.getEndPage();
StringBuilder exporter = new StringBuilder();
exporter.append("<report>");
exporter.append("<err_code>0</err_code>").append("<err_msg></err_msg>")
.append("<start_page>").append(this.startPageNo).append("</start_page>")
.append("<end_page>").append(this.endPageNo).append("</end_page>");
this.exporterObject = exporter;
}
}