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