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