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.
 
 

183 lines
6.9 KiB

/*
* Copyright (C), 2015-2019
* FileName: JSONExporter
* Author: xx
* Date: 2019/8/26 16:39
* Description: JSONExporter
* History:
* <author> <time> <version> <desc>
*/
package com.fr.plugin.tabledataservice.exporter;
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.io.exporter.AbstractAppExporter;
import com.fr.json.JSONArray;
import com.fr.json.JSONObject;
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.utils.FuncUtils;
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>
* 〈数据导出功能JSONExporter〉
* 参考TextExporter PageSetProvider CSVExporter ResultWorkBook WriteRWorkBook
*
* @author xx
* @since 1.0.0
*/
@EnableMetrics
public class JSONExporter extends AbstractAppExporter {
private JSONObject 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!");
}
JSONArray dataArray = this.export(resultWorkBook);
printAsJSON(outputStream, dataArray);
}
private JSONArray export(ResultWorkBook resultWorkBook) {
JSONArray reportsArray = JSONArray.create();
if (resultWorkBook == null) {
return reportsArray;
}
List<PaperSettingProvider> paperSettingList = ReportUtils.getPaperSettingListFromWorkBook(resultWorkBook);
PageSetProvider pageSetProvider = resultWorkBook.generateReportPageSet(paperSettingList).traverse4Export();
if (this.exporterObject != null) {
this.exporterObject.put("total_page_number", pageSetProvider.size());
}
if (startPageNo <= 0 || endPageNo <= 0) {
startPageNo = 1;
endPageNo = pageSetProvider.size();
}
reportsArray = this.exportPages(pageSetProvider);
return reportsArray;
}
@Override
public void export(OutputStream outputStream, PageSetProvider pageSetProvider) throws Exception {
JSONArray dataPagesArray = JSONArray.create();
for(int i = 0; i < pageSetProvider.size(); ++i) {
ReportPageProvider reportPageProvider = pageSetProvider.getPage(i);
ClippedPageProvider clippedPageProvider = ExporterUtils.support(reportPageProvider);
if (clippedPageProvider == null) {
break;
}
dataPagesArray.put(this.exportReport((ElementGetter)clippedPageProvider, 0, ((ElementGetter)clippedPageProvider).getRowCount()));
}
printAsJSON(outputStream, dataPagesArray);
}
public JSONArray exportPages(PageSetProvider pageSetProvider) {
JSONArray pagesArray = JSONArray.create();
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.put(this.exportReport((ElementGetter)clippedPageProvider, 0, ((ElementGetter)clippedPageProvider).getRowCount()));
}
return pagesArray;
}
public JSONObject exportReport(ElementGetter reportCase, int start, int end) {
JSONObject pageJSON = JSONObject.create();
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;
}
pageJSON.put(columnRow.toString(), cellText);
}
}
return pageJSON;
}
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;
}
/**
* JSON数据输出到前端
* @param outPutStream
* @param data
* @throws UnsupportedEncodingException
*/
private void printAsJSON(OutputStream outPutStream, Object data) throws UnsupportedEncodingException {
PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outPutStream, EncodeConstants.ENCODING_UTF_8)));
if (this.exporterObject != null) {
JSONObject result = this.exporterObject;
FuncUtils.encryptData(String.valueOf(data), result);
writer.print(result);
} else {
writer.print(data.toString());
}
writer.flush();
writer.close();
}
/**
* 设置导出参数
*
* @param params
*/
public void setExporterObject(JSONObject params) {
this.startPageNo = params.getInt("start_page");
this.endPageNo = params.getInt("end_page");
JSONObject exporter = JSONObject.create();
exporter.put("err_code", 0).put("err_msg", "")
.put("start_page", this.startPageNo)
.put("end_page", this.endPageNo);
this.exporterObject = exporter;
}
}