forked from demo/example
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.
451 lines
19 KiB
451 lines
19 KiB
6 years ago
|
package com.fr;
|
||
|
|
||
|
import com.fr.base.DynamicUnitList;
|
||
|
import com.fr.base.FRContext;
|
||
|
import com.fr.base.ResultFormula;
|
||
|
import com.fr.general.ComparatorUtils;
|
||
|
import com.fr.general.DeclareRecordType;
|
||
|
import com.fr.general.ModuleContext;
|
||
|
import com.fr.io.TemplateWorkBookIO;
|
||
|
import com.fr.io.exporter.AppExporter;
|
||
|
import com.fr.io.exporter.PDFExporter;
|
||
|
import com.fr.io.exporter.WordExporter;
|
||
|
import com.fr.json.JSONArray;
|
||
|
import com.fr.json.JSONException;
|
||
|
import com.fr.json.JSONObject;
|
||
|
import com.fr.main.TemplateWorkBook;
|
||
|
import com.fr.main.workbook.ResultWorkBook;
|
||
|
import com.fr.page.PageSetProvider;
|
||
|
import com.fr.page.PaperSettingProvider;
|
||
|
import com.fr.report.cell.CellElement;
|
||
|
import com.fr.report.cell.DefaultTemplateCellElement;
|
||
|
import com.fr.report.cell.ResultCellElement;
|
||
|
import com.fr.report.cell.cellattr.PageExportCellElement;
|
||
|
import com.fr.report.core.ReportUtils;
|
||
|
import com.fr.report.core.block.PolyResultWorkSheet;
|
||
|
import com.fr.report.module.EngineModule;
|
||
|
import com.fr.report.worksheet.PageRWorkSheet;
|
||
|
import com.fr.stable.CodeUtils;
|
||
|
import com.fr.stable.ColumnRow;
|
||
|
import com.fr.stable.CommonCodeUtils;
|
||
|
import com.fr.stable.PageActor;
|
||
|
import com.fr.stable.unit.FU;
|
||
|
import com.fr.stable.unit.UNIT;
|
||
|
import com.fr.web.Browser;
|
||
|
import com.fr.web.core.ErrorHandlerHelper;
|
||
|
import com.fr.web.core.utils.ExportUtils;
|
||
|
import com.fr.web.utils.WebUtils;
|
||
|
|
||
|
import java.io.IOException;
|
||
|
import java.io.OutputStream;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.Collections;
|
||
|
import java.util.Comparator;
|
||
|
import java.util.HashMap;
|
||
|
import java.util.Iterator;
|
||
|
import java.util.List;
|
||
|
import java.util.Map;
|
||
|
import java.util.Map.Entry;
|
||
|
import java.util.regex.Matcher;
|
||
|
import java.util.regex.Pattern;
|
||
|
import javax.servlet.ServletException;
|
||
|
import javax.servlet.http.HttpServlet;
|
||
|
import javax.servlet.http.HttpServletRequest;
|
||
|
import javax.servlet.http.HttpServletResponse;
|
||
|
|
||
|
public class myexporter extends HttpServlet {
|
||
|
private static boolean offlineWriteAble = true;
|
||
|
private static final Pattern KEY_VALUE_PATTERN = Pattern.compile("[^{,}]*:[^{,}]*");
|
||
|
private static final long serialVersionUID = 1L;
|
||
|
|
||
|
public myexporter() {
|
||
|
}
|
||
|
|
||
|
public static void dealResponse4Export(HttpServletResponse res) {
|
||
|
res.setHeader("Cache-Control", "public");
|
||
|
res.setHeader("Cache-Control", "max-age=3");
|
||
|
res.reset();
|
||
|
}
|
||
|
|
||
|
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
|
||
|
this.doGet(request, response);
|
||
|
}
|
||
|
|
||
|
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
|
||
|
try {
|
||
|
ModuleContext.startModule(EngineModule.class.getName());
|
||
|
dealResponse4Export(res);
|
||
|
String fileName = WebUtils.getHTTPRequestParameter(req, "__filename__");
|
||
|
String format = WebUtils.getHTTPRequestParameter(req, "format");
|
||
|
Browser browser = Browser.resolve(req);
|
||
|
fileName = browser.getEncodedFileName4Download(fileName);
|
||
|
List paraMapList = new ArrayList();
|
||
|
List reportPathList = new ArrayList();
|
||
|
PaperSettingProvider paperSettingProvider = null;
|
||
|
if (WebUtils.getHTTPRequestParameter(req, "reportlets") != null) {
|
||
|
createReportsFromReportlets(WebUtils.getHTTPRequestParameter(req, "reportlets"), reportPathList, paraMapList);
|
||
|
ResultWorkBook[] resultWorkBook = new ResultWorkBook[reportPathList.size()];
|
||
|
PolyResultWorkSheet allInOneSheet = new PageRWorkSheet();
|
||
|
|
||
|
for (int i = 0; i < reportPathList.size(); ++i) {
|
||
|
TemplateWorkBook workbook = TemplateWorkBookIO.readTemplateWorkBook(String.valueOf(reportPathList.get(i)));
|
||
|
Map paraMap = (Map) paraMapList.get(i);
|
||
|
resultWorkBook[i] = workbook.execute(paraMap, new PageActor());
|
||
|
if (i == 0) {
|
||
|
paperSettingProvider = (PaperSettingProvider) ReportUtils.getPaperSettingListFromWorkBook(workbook).get(0);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int length = resultWorkBook.length;
|
||
|
long[] lengthx = new long[length];
|
||
|
long[] lengthy = (long[]) lengthx.clone();
|
||
|
if (length > 0) {
|
||
|
lengthx[0] = lengthy[0] = 0L;
|
||
|
}
|
||
|
|
||
|
for (int i = 1; i < length; ++i) {
|
||
|
long sumy = 0L;
|
||
|
|
||
|
for (int county = resultWorkBook[i - 1].getElementCaseReport(0).getRowCount(); county-- > 0; sumy += resultWorkBook[i - 1].getElementCaseReport(0).getRowHeight(county).getLen()) {
|
||
|
;
|
||
|
}
|
||
|
|
||
|
lengthx[i] = 0L;
|
||
|
lengthy[i] = sumy + lengthy[i - 1];
|
||
|
}
|
||
|
|
||
|
ArrayList<UNIT> verticalList = new ArrayList();
|
||
|
ArrayList<UNIT> horizontalList = new ArrayList();
|
||
|
analyElementColumnRow(verticalList, horizontalList, resultWorkBook, lengthx, lengthy);
|
||
|
allInOneSheet = setNewColRowSize(verticalList, horizontalList, allInOneSheet);
|
||
|
allInOneSheet = fillBlankCell(verticalList.size(), horizontalList.size(), allInOneSheet);
|
||
|
int i = 0;
|
||
|
|
||
|
for (int len = reportPathList.size(); i < len; ++i) {
|
||
|
allInOneSheet = addElemToSheet(verticalList, horizontalList, allInOneSheet, resultWorkBook[i], lengthx[i], lengthy[i]);
|
||
|
}
|
||
|
|
||
|
if (paperSettingProvider == null) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
doExport(req, res, format, fileName, false, browser, allInOneSheet.generateReportPageSet(paperSettingProvider));
|
||
|
}
|
||
|
} catch (Exception var24) {
|
||
|
var24.printStackTrace();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
private static void doExport(HttpServletRequest req, HttpServletResponse res, String format, String fileName, boolean isEmbbed, Browser browser, PageSetProvider page) throws Exception {
|
||
|
AppExporter[] exporters = new AppExporter[]{null};
|
||
|
DeclareRecordType[] exportTypes = new DeclareRecordType[]{null};
|
||
|
OutputStream outputStream = res.getOutputStream();
|
||
|
getExporterAndTypeAndexport(req, res, format, fileName, isEmbbed, browser, exporters, exportTypes, outputStream, page);
|
||
|
DeclareRecordType exportType = exportTypes[0];
|
||
|
if (exportType == null) {
|
||
|
ErrorHandlerHelper.getErrorHandler().error(req, res, "Cannot recognize the specifed export format:" + format + ",\nThe correct format can be PDF,Excel,Word,SVG,CSV,Text or Image.");
|
||
|
} else {
|
||
|
try {
|
||
|
outputStream.flush();
|
||
|
outputStream.close();
|
||
|
} catch (IOException var12) {
|
||
|
;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void getExporterAndTypeAndexport(HttpServletRequest req, HttpServletResponse res, String format, String fileName, boolean isEmbbed, Browser browser, AppExporter[] exporters, DeclareRecordType[] exportTypes, OutputStream out, PageSetProvider page) throws Exception {
|
||
|
if (format.equalsIgnoreCase("PDF")) {
|
||
|
ExportUtils.setPDFContent(res, fileName, isEmbbed);
|
||
|
PDFExporter PDFExport = new PDFExporter();
|
||
|
PDFExport.export(out, page);
|
||
|
} else if (format.equalsIgnoreCase("Word")) {
|
||
|
ExportUtils.setWordConetent(res, fileName);
|
||
|
WordExporter WordExport = new WordExporter();
|
||
|
WordExport.export(out, page);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public static PolyResultWorkSheet fillBlankCell(int rowCount, int colCount, PolyResultWorkSheet allInOneSheet) {
|
||
|
for (int i = 0; i < rowCount; ++i) {
|
||
|
for (int j = 0; j < colCount; ++j) {
|
||
|
ResultCellElement ce = createDefaultCellElement(j, i);
|
||
|
allInOneSheet.addCellElement(ce);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
allInOneSheet.setRowMappingArray(new int[0]);
|
||
|
allInOneSheet.setColumnMappingArray(new int[0]);
|
||
|
return allInOneSheet;
|
||
|
}
|
||
|
|
||
|
public static ResultCellElement createDefaultCellElement(int col, int row) {
|
||
|
return new PageExportCellElement(new DefaultTemplateCellElement(col, row));
|
||
|
}
|
||
|
|
||
|
public static PolyResultWorkSheet addElemToSheet(ArrayList<UNIT> verticalList, ArrayList<UNIT> horizontalList, PolyResultWorkSheet page_sheet, ResultWorkBook resultWorkBook, long lengthx, long lengthy) {
|
||
|
UNIT x = FU.getInstance(lengthx);
|
||
|
UNIT y = FU.getInstance(lengthy);
|
||
|
DynamicUnitList newRowList = page_sheet.getRowHeightList_DEC();
|
||
|
DynamicUnitList newColList = page_sheet.getColumnWidthList_DEC();
|
||
|
int rowCount = page_sheet.getRowCount();
|
||
|
int colCount = page_sheet.getColumnCount();
|
||
|
DynamicUnitList rowHeightList = resultWorkBook.getElementCaseReport(0).getRowHeightList_DEC();
|
||
|
DynamicUnitList colWidthList = resultWorkBook.getElementCaseReport(0).getColumnWidthList_DEC();
|
||
|
Iterator<CellElement> it = resultWorkBook.getElementCaseReport(0).cellIterator();
|
||
|
HashMap<String, String> columnRowMap = new HashMap();
|
||
|
HashMap formulaMap = new HashMap();
|
||
|
|
||
|
while (it.hasNext()) {
|
||
|
CellElement ce = (CellElement) it.next();
|
||
|
UNIT ceX = x.add(colWidthList.getRangeValueFromZero(ce.getColumn()));
|
||
|
UNIT ceWidth = colWidthList.getRangeValue(ce.getColumn(), ce.getColumn() + ce.getColumnSpan());
|
||
|
UNIT ceY = y.add(rowHeightList.getRangeValueFromZero(ce.getRow()));
|
||
|
UNIT ceHeight = rowHeightList.getRangeValue(ce.getRow(), ce.getRow() + ce.getRowSpan());
|
||
|
int newCeCol = horizontalList.indexOf(ceX) + 1;
|
||
|
int newCeColSpan = getNewSpan(newCeCol, newColList, ceWidth, colCount);
|
||
|
int newCeRow = verticalList.indexOf(ceY) + 1;
|
||
|
int newCeRowSpan = getNewSpan(newCeRow, newRowList, ceHeight, rowCount);
|
||
|
ColumnRow oriCR = ColumnRow.valueOf(ce.getColumn(), ce.getRow());
|
||
|
ColumnRow newCR = ColumnRow.valueOf(newCeCol, newCeRow);
|
||
|
columnRowMap.put(oriCR.toString(), newCR.toString());
|
||
|
ResultCellElement newCe = (ResultCellElement) ce.deriveCellElement(newCeCol, newCeRow, newCeColSpan, newCeRowSpan);
|
||
|
page_sheet.addCellElement(newCe);
|
||
|
if (ce.getValue() instanceof ResultFormula) {
|
||
|
formulaMap.put(newCe, (ResultFormula) ce.getValue());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
modifyAllFormula(formulaMap, columnRowMap);
|
||
|
return page_sheet;
|
||
|
}
|
||
|
|
||
|
public static int getNewSpan(int newCeColRow, DynamicUnitList newColRowList, UNIT ceWidthHeight, int count) {
|
||
|
for (int i = newCeColRow; i < count + 1; ++i) {
|
||
|
if (ComparatorUtils.equals(ceWidthHeight, newColRowList.getRangeValue(newCeColRow, i))) {
|
||
|
return i - newCeColRow;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
public static PolyResultWorkSheet setNewColRowSize(ArrayList<UNIT> verticalList, ArrayList<UNIT> horizontalList, PolyResultWorkSheet allInOneSheet) {
|
||
|
int i;
|
||
|
Object lastCoordinate;
|
||
|
FU colWidth;
|
||
|
for (i = 0; i < verticalList.size(); ++i) {
|
||
|
lastCoordinate = i == 0 ? UNIT.ZERO : (UNIT) verticalList.get(i - 1);
|
||
|
colWidth = ((UNIT) verticalList.get(i)).subtract((UNIT) lastCoordinate);
|
||
|
allInOneSheet.setRowHeight(i, colWidth);
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < horizontalList.size(); ++i) {
|
||
|
lastCoordinate = i == 0 ? UNIT.ZERO : (UNIT) horizontalList.get(i - 1);
|
||
|
colWidth = ((UNIT) horizontalList.get(i)).subtract((UNIT) lastCoordinate);
|
||
|
allInOneSheet.setColumnWidth(i, colWidth);
|
||
|
}
|
||
|
|
||
|
return allInOneSheet;
|
||
|
}
|
||
|
|
||
|
public static void analyElementColumnRow(ArrayList<UNIT> verticalList, ArrayList<UNIT> horizontalList, ResultWorkBook[] resultWorkBooks, long[] lengthx, long[] lengthy) {
|
||
|
int length = resultWorkBooks.length;
|
||
|
|
||
|
for (int i = 0; i < length; ++i) {
|
||
|
ResultWorkBook resultWorkBook = resultWorkBooks[i];
|
||
|
UNIT y = FU.getInstance(lengthy[i]);
|
||
|
int rowCount = resultWorkBook.getElementCaseReport(0).getRowCount();
|
||
|
DynamicUnitList rowHeightList = resultWorkBook.getElementCaseReport(0).getRowHeightList_DEC();
|
||
|
analyColumnRow(y, verticalList, rowHeightList, rowCount);
|
||
|
UNIT x = FU.getInstance(lengthx[i]);
|
||
|
int colCount = resultWorkBook.getElementCaseReport(0).getColumnCount();
|
||
|
DynamicUnitList colWidthList = resultWorkBook.getElementCaseReport(0).getColumnWidthList_DEC();
|
||
|
analyColumnRow(x, horizontalList, colWidthList, colCount);
|
||
|
}
|
||
|
|
||
|
sort(verticalList, horizontalList);
|
||
|
}
|
||
|
|
||
|
public static void analyColumnRow(UNIT startPoint, ArrayList<UNIT> verticalSet, DynamicUnitList rowHeightList, int count) {
|
||
|
verticalSet.add(startPoint);
|
||
|
|
||
|
for (int i = 0; i < count; ++i) {
|
||
|
UNIT rowHeight = rowHeightList.getRangeValueFromZero(i + 1);
|
||
|
UNIT rowY = rowHeight.add(startPoint);
|
||
|
verticalSet.add(rowY);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public static void sort(ArrayList<UNIT> verticalList, ArrayList<UNIT> horizontalList) {
|
||
|
Comparator<UNIT> compare = new Comparator<UNIT>() {
|
||
|
public int compare(UNIT o1, UNIT o2) {
|
||
|
if (o1.subtract(o2).equal_zero()) {
|
||
|
return 0;
|
||
|
}
|
||
|
return o1.subtract(o2).more_than_zero() ? 1 : -1;
|
||
|
}
|
||
|
};
|
||
|
Collections.sort(verticalList, compare);
|
||
|
Collections.sort(horizontalList, compare);
|
||
|
}
|
||
|
|
||
|
private static void modifyAllFormula(HashMap<CellElement, ResultFormula> formulaMap, HashMap<String, String> columnRowMap) {
|
||
|
Iterator formulaIt = formulaMap.entrySet().iterator();
|
||
|
|
||
|
while (formulaIt.hasNext()) {
|
||
|
Entry<CellElement, ResultFormula> entry = (Entry) formulaIt.next();
|
||
|
CellElement ce = (CellElement) entry.getKey();
|
||
|
ResultFormula formula = (ResultFormula) entry.getValue();
|
||
|
String content = formula.getTransferContent();
|
||
|
Iterator crIt = columnRowMap.entrySet().iterator();
|
||
|
|
||
|
while (crIt.hasNext()) {
|
||
|
Entry<String, String> crEntry = (Entry) crIt.next();
|
||
|
String oriCR = (String) crEntry.getKey();
|
||
|
String newCR = (String) crEntry.getValue();
|
||
|
if (content.indexOf(oriCR) != -1) {
|
||
|
content = getNewFormula(content, oriCR, newCR);
|
||
|
formula.setTransferContent(content);
|
||
|
ce.setValue(formula);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
public static String getNewFormula(String formulaContent, String oriCR, String newCR) {
|
||
|
String[] array = formulaContent.toUpperCase().split(oriCR);
|
||
|
StringBuffer sb = new StringBuffer();
|
||
|
int i = 0;
|
||
|
|
||
|
for (int len = array.length; i < len; ++i) {
|
||
|
sb.append(array[i]);
|
||
|
if (formulaContent.endsWith(oriCR) || i != len - 1) {
|
||
|
String nodeCR = getNewColumnRow(array[i], i + 1, array, oriCR, newCR);
|
||
|
sb.append(nodeCR);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return sb.toString();
|
||
|
}
|
||
|
|
||
|
private static String getNewColumnRow(String formulaPart, int nextIdx, String[] array, String oriCR, String newCR) {
|
||
|
if (formulaPart.endsWith("$")) {
|
||
|
return oriCR;
|
||
|
} else {
|
||
|
return nextIdx < array.length && startsWithDigit(array[nextIdx]) ? oriCR : newCR;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static boolean startsWithDigit(String s) {
|
||
|
return Pattern.compile("^[0-9]").matcher(s.trim()).find();
|
||
|
}
|
||
|
|
||
|
public static String transferReportletsInfo(String reportletsInfo) {
|
||
|
try {
|
||
|
reportletsInfo = CodeUtils.cjkDecode(reportletsInfo.trim());
|
||
|
} catch (Exception var2) {
|
||
|
;
|
||
|
}
|
||
|
|
||
|
String jsonString = null;
|
||
|
if (reportletsInfo.length() > 0 && reportletsInfo.charAt(0) == '(') {
|
||
|
jsonString = transferToJSONString(reportletsInfo);
|
||
|
} else {
|
||
|
jsonString = reportletsInfo;
|
||
|
}
|
||
|
|
||
|
return jsonString;
|
||
|
}
|
||
|
|
||
|
public static String transferToJSONString(String reportletsInfo) {
|
||
|
if (reportletsInfo == null) {
|
||
|
return null;
|
||
|
} else {
|
||
|
reportletsInfo = reportletsInfo.trim();
|
||
|
if (reportletsInfo.length() <= 0) {
|
||
|
return null;
|
||
|
} else {
|
||
|
reportletsInfo = reportletsInfo.substring(1, reportletsInfo.length() - 1);
|
||
|
StringBuffer rpSB = new StringBuffer("[");
|
||
|
Matcher matcher = KEY_VALUE_PATTERN.matcher(reportletsInfo);
|
||
|
int start = 0;
|
||
|
boolean var4 = false;
|
||
|
|
||
|
while (matcher.find()) {
|
||
|
int end = matcher.start();
|
||
|
String tmpText = reportletsInfo.substring(start, end);
|
||
|
if (tmpText != null && tmpText.length() > 0) {
|
||
|
rpSB.append(tmpText);
|
||
|
}
|
||
|
|
||
|
start = matcher.end();
|
||
|
String tmpStr = matcher.group();
|
||
|
String[] tmpStrs = tmpStr.split(":");
|
||
|
if (tmpStrs.length != 2) {
|
||
|
rpSB.append(tmpStr);
|
||
|
} else {
|
||
|
rpSB.append(tmpStrs[0]).append(':').append(quote(tmpStrs[1]));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
rpSB.append(reportletsInfo.substring(start, reportletsInfo.length()));
|
||
|
rpSB.append(']');
|
||
|
return rpSB.toString();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static String quote(String v) {
|
||
|
return "\"" + CommonCodeUtils.javascriptEncode(v) + "\"";
|
||
|
}
|
||
|
|
||
|
public static void createReportsFromReportlets(String reportletsInfo, List reportPathList, List paraMapList) {
|
||
|
reportPathList.clear();
|
||
|
paraMapList.clear();
|
||
|
if (reportletsInfo != null) {
|
||
|
String jsonString = transferReportletsInfo(reportletsInfo);
|
||
|
FRContext.getLogger().info("reportletsInfo:" + jsonString);
|
||
|
if (jsonString != null) {
|
||
|
createFromReportlets(jsonString, reportPathList, paraMapList);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private static void createFromReportlets(String jsonString, List reportPathList, List paraMapList) {
|
||
|
try {
|
||
|
JSONArray reportlets = new JSONArray(jsonString);
|
||
|
|
||
|
for (int i = 0; i < reportlets.length(); ++i) {
|
||
|
Map paraMap = new HashMap();
|
||
|
JSONObject jsonObject = reportlets.getJSONObject(i);
|
||
|
Iterator keys = jsonObject.keys();
|
||
|
|
||
|
while (keys.hasNext()) {
|
||
|
String key = (String) keys.next();
|
||
|
Object value = jsonObject.get(key);
|
||
|
value = value instanceof String ? CodeUtils.decodeText(String.valueOf(value)) : value;
|
||
|
paraMap.put(key, value);
|
||
|
}
|
||
|
|
||
|
String reportletPath = (String) paraMap.get("reportlet");
|
||
|
if (reportletPath != null) {
|
||
|
try {
|
||
|
reportPathList.add(reportletPath);
|
||
|
paraMapList.add(paraMap);
|
||
|
} catch (Exception var11) {
|
||
|
FRContext.getLogger().error(var11.getMessage(), var11);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} catch (JSONException var12) {
|
||
|
FRContext.getLogger().error(var12.getMessage(), var12);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|