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
184 lines
7.4 KiB
3 years ago
|
/*
|
||
|
* 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;
|
||
|
}
|
||
|
}
|