diff --git a/README.md b/README.md
index 498439e..67ec3c0 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,6 @@
# open-JSD-8649
-JSD-8649 开源任务材料
\ No newline at end of file
+JSD-8649 导出文件水印(不支持WORD) 开源任务材料\
+免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\
+仅作为开发者学习参考使用!禁止用于任何商业用途!\
+为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。
\ No newline at end of file
diff --git a/doc/水印导出插件使用文档.docx b/doc/水印导出插件使用文档.docx
new file mode 100644
index 0000000..c0fa6a4
Binary files /dev/null and b/doc/水印导出插件使用文档.docx differ
diff --git a/plugin.xml b/plugin.xml
new file mode 100644
index 0000000..ce595c4
--- /dev/null
+++ b/plugin.xml
@@ -0,0 +1,27 @@
+
+ com.fr.plugin.ws.exp.xlsx
+
+ yes
+ 1.1.3
+ bi
+ 5.1.14~5.2
+ 10.0
+ 2021-07-31
+ fr.open
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/JSFileLoader.java b/src/main/java/com/fr/plugin/JSFileLoader.java
new file mode 100644
index 0000000..694d4bd
--- /dev/null
+++ b/src/main/java/com/fr/plugin/JSFileLoader.java
@@ -0,0 +1,21 @@
+package com.fr.plugin;
+
+import com.fr.stable.EncodeConstants;
+import com.fr.stable.fun.impl.AbstractJavaScriptFileHandler;
+
+/**
+ * 定义该插件要引入的公用js
+ */
+public class JSFileLoader extends AbstractJavaScriptFileHandler {
+ @Override
+ public String[] pathsForFiles() {
+ return new String[]{
+ "/com/fr/plugin/js/hideprint.js"
+ };
+ }
+
+ @Override
+ public String encode() {
+ return EncodeConstants.ENCODING_UTF_8;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/WmExportProcessor.java b/src/main/java/com/fr/plugin/WmExportProcessor.java
new file mode 100644
index 0000000..590cb53
--- /dev/null
+++ b/src/main/java/com/fr/plugin/WmExportProcessor.java
@@ -0,0 +1,49 @@
+package com.fr.plugin;
+
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.decision.webservice.v10.security.SecurityService;
+import com.fr.io.collection.ExportCollection;
+import com.fr.io.exporter.AppExporter;
+import com.fr.plugin.excel.ExAppExporter;
+import com.fr.plugin.transform.ExecuteFunctionRecord;
+import com.fr.plugin.transform.FunctionRecorder;
+import com.fr.stable.StringUtils;
+import com.fr.web.core.ReportSessionIDInfor;
+import com.fr.web.core.reserve.DefaultExportExtension;
+import com.fr.web.core.reserve.ExportFactory;
+import com.fr.web.core.reserve.Operate;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@FunctionRecorder
+public class WmExportProcessor extends DefaultExportExtension {
+ @Override
+ @ExecuteFunctionRecord
+ public ExportCollection createCollection(HttpServletRequest req, HttpServletResponse res,
+ ReportSessionIDInfor sessionIDInfor, String format,
+ String fileName, boolean isEmbed) throws Exception {
+ Operate operate = ExportFactory.getOperate(format.toLowerCase());
+ if(StringUtils.equals("image",format)){
+ res.setHeader("Content-Disposition", "attachment;filename="+fileName+".png");
+ }else{
+ res.setHeader("Content-Disposition", "attachment;filename="+fileName+"."+format);
+ }
+ if (StringUtils.equals(format, "excel")) {
+ SecurityService securityService = SecurityService.getInstance();
+ WatermarkBean parsedWatermarkBean = securityService.getParsedWatermarkBean(req);
+ if (StringUtils.isNotBlank(parsedWatermarkBean.getText())) {
+ if (operate != null) {
+ //先获取到真的AppExporter 然后构造我们自己的导出器
+ ExportCollection exportCollection = operate.newExportCollection(req, res, sessionIDInfor, fileName);
+ AppExporter exporter = exportCollection.getExporter();
+ ExAppExporter exAppExporter = new ExAppExporter(exporter, parsedWatermarkBean);
+ exportCollection.setExporter(exAppExporter);
+ return exportCollection;
+ }
+ }
+ }
+ ExportCollection exportCollection = operate.newExportCollection(req, res, sessionIDInfor, fileName);
+ return exportCollection;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/WmLifeCycleMonitor.java b/src/main/java/com/fr/plugin/WmLifeCycleMonitor.java
new file mode 100644
index 0000000..c8d2daf
--- /dev/null
+++ b/src/main/java/com/fr/plugin/WmLifeCycleMonitor.java
@@ -0,0 +1,16 @@
+package com.fr.plugin;
+
+import com.fr.plugin.context.PluginContext;
+import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor;
+
+public class WmLifeCycleMonitor extends AbstractPluginLifecycleMonitor {
+ @Override
+ public void afterRun(PluginContext pluginContext) {
+
+ }
+
+ @Override
+ public void beforeStop(PluginContext pluginContext) {
+
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/ExAppExporter.java b/src/main/java/com/fr/plugin/excel/ExAppExporter.java
new file mode 100644
index 0000000..a57173a
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/ExAppExporter.java
@@ -0,0 +1,89 @@
+package com.fr.plugin.excel;
+
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.io.exporter.AbstractAppExporter;
+import com.fr.io.exporter.AppExporter;
+import com.fr.log.FineLoggerFactory;
+import com.fr.main.workbook.ResultWorkBook;
+import com.fr.plugin.ws.wapper.WsUtils;
+import com.fr.third.v2.org.apache.poi.POIXMLDocumentPart;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackagePartName;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackageRelationship;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.TargetMode;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFRelation;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+
+import java.io.*;
+
+public class ExAppExporter extends AbstractAppExporter {
+ AppExporter realExporter;
+ WatermarkBean parsedWatermarkBean;
+
+
+ public ExAppExporter(AppExporter realExporter, WatermarkBean parsedWatermarkBean) {
+ this.realExporter = realExporter;
+ this.parsedWatermarkBean = parsedWatermarkBean;
+ }
+
+ // @Override
+// public void export(OutputStream orginOutputStream, ResultWorkBook resultWorkBook) throws Exception {
+// //先用真的导出器把resultWorkBook 导出成excel 我们获取二进制再加工
+// ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(4096);
+// File tempFile = File.createTempFile("ExportExcel", ".xlsx");
+// FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
+// realExporter.export(fileOutputStream, resultWorkBook);
+// byte[] bytes = byteArrayOutputStream.toByteArray();
+// ByteArrayInputStream in = new ByteArrayInputStream(bytes);
+// //加水印
+// XSSFWorkbook workbook = new XSSFWorkbook(in);
+// byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+// int pictureIdx = workbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+// POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);
+// for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表
+// XSSFSheet sheet = workbook.getSheetAt(i);
+// PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
+// String relType = XSSFRelation.IMAGES.getRelation();
+// PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
+// sheet.getCTWorksheet().addNewPicture().setId(pr.getId());
+// }
+// workbook.write(orginOutputStream);
+// FineLoggerFactory.getLogger().info("excel导出加水印成功");
+// }
+
+ @Override
+ public void export(OutputStream orginOutputStream, ResultWorkBook resultWorkBook) throws Exception {
+ //先存到临时文件
+ File tempFile = File.createTempFile("ExportExcel", ".xlsx");
+ FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
+ realExporter.export(fileOutputStream, resultWorkBook);
+ //用SXSSFWorkbook 读取出来处理
+ SXSSFWorkbook workbook = new SXSSFWorkbook(new XSSFWorkbook(tempFile));
+ //获取XSSFWorkbook来加水印
+ XSSFWorkbook xssfWorkbook = workbook.getXSSFWorkbook();
+ byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+ int pictureIdx = workbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+ POIXMLDocumentPart poixmlDocumentPart = xssfWorkbook.getAllPictures().get(pictureIdx);
+ for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//获取每个Sheet表
+ XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
+ PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
+ String relType = XSSFRelation.IMAGES.getRelation();
+ PackageRelationship pr = sheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
+ sheet.getCTWorksheet().addNewPicture().setId(pr.getId());
+ }
+ //写回原始导出流
+ workbook.write(orginOutputStream);
+ workbook.dispose();
+ workbook.close();
+ FineLoggerFactory.getLogger().info("--excel导出加水印成功");
+ //删除临时文件
+ if (tempFile.exists() &&tempFile.canWrite()) {
+ tempFile.delete();
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/fr/plugin/excel/MyExcelWorkbookRowCreator.java b/src/main/java/com/fr/plugin/excel/MyExcelWorkbookRowCreator.java
new file mode 100644
index 0000000..3c951e6
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/MyExcelWorkbookRowCreator.java
@@ -0,0 +1,107 @@
+package com.fr.plugin.excel;
+
+import com.finebi.dashboard.api.service.export.TableRangeAddress;
+import com.finebi.dashboard.api.service.export.TableRow;
+import com.finebi.dashboard.api.service.export.provider.WorkbookRowCreator;
+import com.finebi.dashboard.impl.service.export.creator.sheet.ExcelTableRow;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitor;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitorImpl;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Row;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.ss.util.CellRangeAddress;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MyExcelWorkbookRowCreator implements WorkbookRowCreator {
+ Map sheetMap;
+ private Workbook workbook;
+ private String sheetName;
+ private int sheetMaxRow = 1048575;
+ private ExcelBuildMonitor monitor = new ExcelBuildMonitorImpl();
+
+ public MyExcelWorkbookRowCreator(Workbook workBook, String sheetName) {
+ this.workbook = workBook;
+ this.sheetName = sheetName;
+ this.init();
+ }
+
+ private void init() {
+ this.sheetMap = new HashMap();
+ }
+
+ private Sheet getExcelSheet(int rowIndex) {
+ int sheetIndex = this.getSheetIndex(rowIndex);
+ if (!this.sheetMap.containsKey(sheetIndex)) {
+ Sheet sheet;
+ if (sheetIndex == 0) {
+ sheet = this.workbook.createSheet(this.sheetName);
+ } else {
+ sheet = this.workbook.createSheet(this.sheetName + "_" + sheetIndex);
+ }
+
+ this.sheetMap.put(sheetIndex, sheet);
+ }
+
+ return (Sheet)this.sheetMap.get(sheetIndex);
+ }
+
+ private int getSheetIndex(int rowIndex) {
+ return rowIndex / this.sheetMaxRow;
+ }
+
+ private int getRealRowIndex(int rowIndex) {
+ return rowIndex % this.sheetMaxRow;
+ }
+
+ private Row createExcelRow(int rownum) {
+ Sheet sheet = this.getExcelSheet(rownum);
+ int rindex = this.getRealRowIndex(rownum);
+ Row row = sheet.getRow(rindex);
+ if (row != null) {
+ return row;
+ } else {
+ this.monitor.monitorAddRow();
+ return sheet.createRow(rindex);
+ }
+ }
+
+ private TableRow excelRowToTableRow(Row sxssfRow) {
+ return new ExcelTableRow(this.monitor, sxssfRow);
+ }
+
+ private void addMergedRegion(CellRangeAddress region) {
+ int firstRow = region.getFirstRow();
+ int lastRow = region.getLastRow();
+ int firstSheetIndex = this.getSheetIndex(firstRow);
+ int lastSheetIndex = this.getSheetIndex(lastRow);
+ if (firstSheetIndex == lastSheetIndex) {
+ Sheet sheet = this.getExcelSheet(firstRow);
+ CellRangeAddress rangeAddress = new CellRangeAddress(this.getRealRowIndex(firstRow), this.getRealRowIndex(lastRow), region.getFirstColumn(), region.getLastColumn());
+ sheet.addMergedRegion(rangeAddress);
+ }
+
+ }
+
+ public TableRow createRow(int rowNum) {
+ Row sxssfRow = this.createExcelRow(rowNum);
+ return this.excelRowToTableRow(sxssfRow);
+ }
+
+ public void addMergedRegion(TableRangeAddress region) {
+ CellRangeAddress address = new CellRangeAddress(region.getFirstRowIndex(), region.getLastRowIndex(), region.getFirstColIndex(), region.getLastColIndex());
+ this.addMergedRegion(address);
+ }
+
+ public TableRow getRow(int rowNum) {
+ Row row = this.getExcelRow(rowNum);
+ return row != null ? this.excelRowToTableRow(row) : null;
+ }
+
+ public Row getExcelRow(int rowNum) {
+ Sheet sheet = this.getExcelSheet(rowNum);
+ int realIndex = this.getRealRowIndex(rowNum);
+ return sheet.getRow(realIndex);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/excel/NewExcelWorkbookRowCreator.java b/src/main/java/com/fr/plugin/excel/NewExcelWorkbookRowCreator.java
new file mode 100644
index 0000000..b77466c
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/NewExcelWorkbookRowCreator.java
@@ -0,0 +1,153 @@
+package com.fr.plugin.excel;
+
+import com.finebi.dashboard.api.service.export.TableRangeAddress;
+import com.finebi.dashboard.api.service.export.TableRow;
+import com.finebi.dashboard.api.service.export.provider.WorkbookRowCreator;
+import com.finebi.dashboard.impl.service.export.creator.sheet.ExcelTableRow;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitor;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitorImpl;
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.ws.wapper.WsUtils;
+import com.fr.third.v2.org.apache.poi.POIXMLDocumentPart;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackagePartName;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackageRelationship;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.TargetMode;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Row;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.ss.util.CellRangeAddress;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFRelation;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class NewExcelWorkbookRowCreator implements WorkbookRowCreator {
+ Map sheetMap;
+ private Workbook workbook;
+ private XSSFWorkbook xssfWorkbook;
+ private String sheetName;
+ private int sheetMaxRow = 1048575;
+ private ExcelBuildMonitor monitor = new ExcelBuildMonitorImpl();
+ private POIXMLDocumentPart poixmlDocumentPart;
+ private boolean isSxs;
+
+ public NewExcelWorkbookRowCreator(WatermarkBean parsedWatermarkBean, SXSSFWorkbook workBook, String sheetName) {
+ isSxs = true;
+ this.workbook = workBook;
+ this.xssfWorkbook = workBook.getXSSFWorkbook();
+ this.sheetName = sheetName;
+ this.init();
+ byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+ int pictureIdx = workbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+ poixmlDocumentPart = xssfWorkbook.getAllPictures().get(pictureIdx);
+ }
+
+ public NewExcelWorkbookRowCreator(WatermarkBean parsedWatermarkBean, XSSFWorkbook workBook, String sheetName) {
+ isSxs = false;
+ this.workbook = workBook;
+ this.xssfWorkbook = workBook;
+ this.sheetName = sheetName;
+ this.init();
+ byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+ int pictureIdx = workbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+ poixmlDocumentPart = xssfWorkbook.getAllPictures().get(pictureIdx);
+ }
+
+ private void init() {
+ this.sheetMap = new HashMap();
+ }
+
+ private Sheet getExcelSheet(int rowIndex) {
+ int sheetIndex = this.getSheetIndex(rowIndex);
+ if (!this.sheetMap.containsKey(sheetIndex)) {
+ Sheet sheet;
+ XSSFSheet wssheet;
+ String sheetName="";
+ if (sheetIndex == 0) {
+ sheetName= this.sheetName;
+ } else {
+ sheetName=this.sheetName + "_" + sheetIndex;
+ }
+ //先通过SXSSFWorkbook 创建这个sheet
+ sheet = this.workbook.createSheet(sheetName);
+ if (isSxs) {
+ //如果是SXSSFWorkbook表格,先拿他的XSSFWorkbook获取他真实的
+ wssheet=this.xssfWorkbook.getSheet(sheetName);
+ }else{
+ wssheet = (XSSFSheet) sheet;
+ }
+ //加水印
+ PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
+ String relation = XSSFRelation.IMAGES.getRelation();
+ PackageRelationship pr = wssheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relation, null);
+ wssheet.getCTWorksheet().addNewPicture().setId(pr.getId());
+ FineLoggerFactory.getLogger().error("添加sheet{}并 添加水印成功", sheetIndex);
+ //加水印结束
+ this.sheetMap.put(sheetIndex, sheet);
+ }
+
+ return (Sheet) this.sheetMap.get(sheetIndex);
+ }
+
+ private int getSheetIndex(int rowIndex) {
+ return rowIndex / this.sheetMaxRow;
+ }
+
+ private int getRealRowIndex(int rowIndex) {
+ return rowIndex % this.sheetMaxRow;
+ }
+
+ private Row createExcelRow(int rownum) {
+ Sheet sheet = this.getExcelSheet(rownum);
+ int rindex = this.getRealRowIndex(rownum);
+ Row row = sheet.getRow(rindex);
+ if (row != null) {
+ return row;
+ } else {
+ this.monitor.monitorAddRow();
+ return sheet.createRow(rindex);
+ }
+ }
+
+ private TableRow excelRowToTableRow(Row sxssfRow) {
+ return new ExcelTableRow(this.monitor, sxssfRow);
+ }
+
+ private void addMergedRegion(CellRangeAddress region) {
+ int firstRow = region.getFirstRow();
+ int lastRow = region.getLastRow();
+ int firstSheetIndex = this.getSheetIndex(firstRow);
+ int lastSheetIndex = this.getSheetIndex(lastRow);
+ if (firstSheetIndex == lastSheetIndex) {
+ Sheet sheet = this.getExcelSheet(firstRow);
+ CellRangeAddress rangeAddress = new CellRangeAddress(this.getRealRowIndex(firstRow), this.getRealRowIndex(lastRow), region.getFirstColumn(), region.getLastColumn());
+ sheet.addMergedRegion(rangeAddress);
+ }
+
+ }
+
+ public TableRow createRow(int rowNum) {
+ Row sxssfRow = this.createExcelRow(rowNum);
+ return this.excelRowToTableRow(sxssfRow);
+ }
+
+ public void addMergedRegion(TableRangeAddress region) {
+ CellRangeAddress address = new CellRangeAddress(region.getFirstRowIndex(), region.getLastRowIndex(), region.getFirstColIndex(), region.getLastColIndex());
+ this.addMergedRegion(address);
+ }
+
+ public TableRow getRow(int rowNum) {
+ Row row = this.getExcelRow(rowNum);
+ return row != null ? this.excelRowToTableRow(row) : null;
+ }
+
+ public Row getExcelRow(int rowNum) {
+ Sheet sheet = this.getExcelSheet(rowNum);
+ int realIndex = this.getRealRowIndex(rowNum);
+ return sheet.getRow(realIndex);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/NewWorkBookRowCreator.java b/src/main/java/com/fr/plugin/excel/NewWorkBookRowCreator.java
new file mode 100644
index 0000000..9661f0e
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/NewWorkBookRowCreator.java
@@ -0,0 +1,45 @@
+package com.fr.plugin.excel;
+
+import com.finebi.dashboard.api.service.export.ExportContext;
+import com.finebi.dashboard.api.service.export.provider.WorkbookRowCreator;
+import com.finebi.provider.api.export.AbstractExcelRowCreatorProvider;
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.decision.webservice.v10.security.SecurityService;
+import com.fr.log.FineLoggerFactory;
+import com.fr.third.springframework.web.context.request.RequestContextHolder;
+import com.fr.third.springframework.web.context.request.ServletRequestAttributes;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class NewWorkBookRowCreator extends AbstractExcelRowCreatorProvider {
+
+
+ @Override
+ public WorkbookRowCreator getRowCreator(Workbook workbook, String s, ExportContext exportContext) {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
+ .getRequestAttributes()).getRequest();
+ if (request != null) {
+ try {
+ WatermarkBean parsedWatermarkBean = SecurityService.getInstance().getParsedWatermarkBean(request);
+ //如果是SXSSFWorkbook 就手动获取getXSSFWorkbook
+ FineLoggerFactory.getLogger().error("水印导出开始");
+ if (workbook instanceof SXSSFWorkbook) {
+ FineLoggerFactory.getLogger().error("水印导出开始---SXSSFWorkbook 模式");
+ return new NewExcelWorkbookRowCreator(parsedWatermarkBean, (SXSSFWorkbook) workbook, s);
+ } else if (workbook instanceof XSSFWorkbook) { //如果本身就是XSSFWorkbook 就直接用
+ FineLoggerFactory.getLogger().error("水印导出开始+++XSSFWorkbook 模式");
+ return new NewExcelWorkbookRowCreator(parsedWatermarkBean, (XSSFWorkbook) workbook, s);
+ }
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error("创建水印导出失败");
+ }
+ }
+ FineLoggerFactory.getLogger().error("未能获取到请求 使用默认导出程序处理-----");
+ //解析异常的拿不到请求的用默认处理器
+ return new MyExcelWorkbookRowCreator(workbook, s);
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/excel/bi/MyExcelWorkbookRowCreator.java b/src/main/java/com/fr/plugin/excel/bi/MyExcelWorkbookRowCreator.java
new file mode 100644
index 0000000..a8a187f
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/bi/MyExcelWorkbookRowCreator.java
@@ -0,0 +1,107 @@
+package com.fr.plugin.excel.bi;
+
+import com.finebi.dashboard.api.service.export.TableRangeAddress;
+import com.finebi.dashboard.api.service.export.TableRow;
+import com.finebi.dashboard.api.service.export.provider.WorkbookRowCreator;
+import com.finebi.dashboard.impl.service.export.creator.sheet.ExcelTableRow;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitor;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitorImpl;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Row;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.ss.util.CellRangeAddress;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class MyExcelWorkbookRowCreator implements WorkbookRowCreator {
+ Map sheetMap;
+ private Workbook workbook;
+ private String sheetName;
+ private int sheetMaxRow = 1048575;
+ private ExcelBuildMonitor monitor = new ExcelBuildMonitorImpl();
+
+ public MyExcelWorkbookRowCreator(Workbook workBook, String sheetName) {
+ this.workbook = workBook;
+ this.sheetName = sheetName;
+ this.init();
+ }
+
+ private void init() {
+ this.sheetMap = new HashMap();
+ }
+
+ private Sheet getExcelSheet(int rowIndex) {
+ int sheetIndex = this.getSheetIndex(rowIndex);
+ if (!this.sheetMap.containsKey(sheetIndex)) {
+ Sheet sheet;
+ if (sheetIndex == 0) {
+ sheet = this.workbook.createSheet(this.sheetName);
+ } else {
+ sheet = this.workbook.createSheet(this.sheetName + "_" + sheetIndex);
+ }
+
+ this.sheetMap.put(sheetIndex, sheet);
+ }
+
+ return (Sheet)this.sheetMap.get(sheetIndex);
+ }
+
+ private int getSheetIndex(int rowIndex) {
+ return rowIndex / this.sheetMaxRow;
+ }
+
+ private int getRealRowIndex(int rowIndex) {
+ return rowIndex % this.sheetMaxRow;
+ }
+
+ private Row createExcelRow(int rownum) {
+ Sheet sheet = this.getExcelSheet(rownum);
+ int rindex = this.getRealRowIndex(rownum);
+ Row row = sheet.getRow(rindex);
+ if (row != null) {
+ return row;
+ } else {
+ this.monitor.monitorAddRow();
+ return sheet.createRow(rindex);
+ }
+ }
+
+ private TableRow excelRowToTableRow(Row sxssfRow) {
+ return new ExcelTableRow(this.monitor, sxssfRow);
+ }
+
+ private void addMergedRegion(CellRangeAddress region) {
+ int firstRow = region.getFirstRow();
+ int lastRow = region.getLastRow();
+ int firstSheetIndex = this.getSheetIndex(firstRow);
+ int lastSheetIndex = this.getSheetIndex(lastRow);
+ if (firstSheetIndex == lastSheetIndex) {
+ Sheet sheet = this.getExcelSheet(firstRow);
+ CellRangeAddress rangeAddress = new CellRangeAddress(this.getRealRowIndex(firstRow), this.getRealRowIndex(lastRow), region.getFirstColumn(), region.getLastColumn());
+ sheet.addMergedRegion(rangeAddress);
+ }
+
+ }
+
+ public TableRow createRow(int rowNum) {
+ Row sxssfRow = this.createExcelRow(rowNum);
+ return this.excelRowToTableRow(sxssfRow);
+ }
+
+ public void addMergedRegion(TableRangeAddress region) {
+ CellRangeAddress address = new CellRangeAddress(region.getFirstRowIndex(), region.getLastRowIndex(), region.getFirstColIndex(), region.getLastColIndex());
+ this.addMergedRegion(address);
+ }
+
+ public TableRow getRow(int rowNum) {
+ Row row = this.getExcelRow(rowNum);
+ return row != null ? this.excelRowToTableRow(row) : null;
+ }
+
+ public Row getExcelRow(int rowNum) {
+ Sheet sheet = this.getExcelSheet(rowNum);
+ int realIndex = this.getRealRowIndex(rowNum);
+ return sheet.getRow(realIndex);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/fr/plugin/excel/bi/NewExcelWorkbookRowCreator.java b/src/main/java/com/fr/plugin/excel/bi/NewExcelWorkbookRowCreator.java
new file mode 100644
index 0000000..d8a8557
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/bi/NewExcelWorkbookRowCreator.java
@@ -0,0 +1,153 @@
+package com.fr.plugin.excel.bi;
+
+import com.finebi.dashboard.api.service.export.TableRangeAddress;
+import com.finebi.dashboard.api.service.export.TableRow;
+import com.finebi.dashboard.api.service.export.provider.WorkbookRowCreator;
+import com.finebi.dashboard.impl.service.export.creator.sheet.ExcelTableRow;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitor;
+import com.finebi.dashboard.impl.service.export.monitor.ExcelBuildMonitorImpl;
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.ws.wapper.WsUtils;
+import com.fr.third.v2.org.apache.poi.POIXMLDocumentPart;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackagePartName;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackageRelationship;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.TargetMode;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Row;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Sheet;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.ss.util.CellRangeAddress;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFRelation;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class NewExcelWorkbookRowCreator implements WorkbookRowCreator {
+ Map sheetMap;
+ private Workbook workbook;
+ private XSSFWorkbook xssfWorkbook;
+ private String sheetName;
+ private int sheetMaxRow = 1048575;
+ private ExcelBuildMonitor monitor = new ExcelBuildMonitorImpl();
+ private POIXMLDocumentPart poixmlDocumentPart;
+ private boolean isSxs;
+
+ public NewExcelWorkbookRowCreator(WatermarkBean parsedWatermarkBean, SXSSFWorkbook workBook, String sheetName) {
+ isSxs = true;
+ this.workbook = workBook;
+ this.xssfWorkbook = workBook.getXSSFWorkbook();
+ this.sheetName = sheetName;
+ this.init();
+ byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+ int pictureIdx = workbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+ poixmlDocumentPart = xssfWorkbook.getAllPictures().get(pictureIdx);
+ }
+
+ public NewExcelWorkbookRowCreator(WatermarkBean parsedWatermarkBean, XSSFWorkbook workBook, String sheetName) {
+ isSxs = false;
+ this.workbook = workBook;
+ this.xssfWorkbook = workBook;
+ this.sheetName = sheetName;
+ this.init();
+ byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+ int pictureIdx = workbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+ poixmlDocumentPart = xssfWorkbook.getAllPictures().get(pictureIdx);
+ }
+
+ private void init() {
+ this.sheetMap = new HashMap();
+ }
+
+ private Sheet getExcelSheet(int rowIndex) {
+ int sheetIndex = this.getSheetIndex(rowIndex);
+ if (!this.sheetMap.containsKey(sheetIndex)) {
+ Sheet sheet;
+ XSSFSheet wssheet;
+ String sheetName="";
+ if (sheetIndex == 0) {
+ sheetName= this.sheetName;
+ } else {
+ sheetName=this.sheetName + "_" + sheetIndex;
+ }
+ //先通过SXSSFWorkbook 创建这个sheet
+ sheet = this.workbook.createSheet(sheetName);
+ if (isSxs) {
+ //如果是SXSSFWorkbook表格,先拿他的XSSFWorkbook获取他真实的
+ wssheet=this.xssfWorkbook.getSheet(sheetName);
+ }else{
+ wssheet = (XSSFSheet) sheet;
+ }
+ //加水印
+ PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
+ String relation = XSSFRelation.IMAGES.getRelation();
+ PackageRelationship pr = wssheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relation, null);
+ wssheet.getCTWorksheet().addNewPicture().setId(pr.getId());
+ FineLoggerFactory.getLogger().error("添加sheet{}并 添加水印成功", sheetIndex);
+ //加水印结束
+ this.sheetMap.put(sheetIndex, sheet);
+ }
+
+ return (Sheet) this.sheetMap.get(sheetIndex);
+ }
+
+ private int getSheetIndex(int rowIndex) {
+ return rowIndex / this.sheetMaxRow;
+ }
+
+ private int getRealRowIndex(int rowIndex) {
+ return rowIndex % this.sheetMaxRow;
+ }
+
+ private Row createExcelRow(int rownum) {
+ Sheet sheet = this.getExcelSheet(rownum);
+ int rindex = this.getRealRowIndex(rownum);
+ Row row = sheet.getRow(rindex);
+ if (row != null) {
+ return row;
+ } else {
+ this.monitor.monitorAddRow();
+ return sheet.createRow(rindex);
+ }
+ }
+
+ private TableRow excelRowToTableRow(Row sxssfRow) {
+ return new ExcelTableRow(this.monitor, sxssfRow);
+ }
+
+ private void addMergedRegion(CellRangeAddress region) {
+ int firstRow = region.getFirstRow();
+ int lastRow = region.getLastRow();
+ int firstSheetIndex = this.getSheetIndex(firstRow);
+ int lastSheetIndex = this.getSheetIndex(lastRow);
+ if (firstSheetIndex == lastSheetIndex) {
+ Sheet sheet = this.getExcelSheet(firstRow);
+ CellRangeAddress rangeAddress = new CellRangeAddress(this.getRealRowIndex(firstRow), this.getRealRowIndex(lastRow), region.getFirstColumn(), region.getLastColumn());
+ sheet.addMergedRegion(rangeAddress);
+ }
+
+ }
+
+ public TableRow createRow(int rowNum) {
+ Row sxssfRow = this.createExcelRow(rowNum);
+ return this.excelRowToTableRow(sxssfRow);
+ }
+
+ public void addMergedRegion(TableRangeAddress region) {
+ CellRangeAddress address = new CellRangeAddress(region.getFirstRowIndex(), region.getLastRowIndex(), region.getFirstColIndex(), region.getLastColIndex());
+ this.addMergedRegion(address);
+ }
+
+ public TableRow getRow(int rowNum) {
+ Row row = this.getExcelRow(rowNum);
+ return row != null ? this.excelRowToTableRow(row) : null;
+ }
+
+ public Row getExcelRow(int rowNum) {
+ Sheet sheet = this.getExcelSheet(rowNum);
+ int realIndex = this.getRealRowIndex(rowNum);
+ return sheet.getRow(realIndex);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/bi/NewWorkBookRowCreator.java b/src/main/java/com/fr/plugin/excel/bi/NewWorkBookRowCreator.java
new file mode 100644
index 0000000..d5ddfe9
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/bi/NewWorkBookRowCreator.java
@@ -0,0 +1,45 @@
+package com.fr.plugin.excel.bi;
+
+import com.finebi.dashboard.api.service.export.ExportContext;
+import com.finebi.dashboard.api.service.export.provider.WorkbookRowCreator;
+import com.finebi.provider.api.export.AbstractExcelRowCreatorProvider;
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.decision.webservice.v10.security.SecurityService;
+import com.fr.log.FineLoggerFactory;
+import com.fr.third.springframework.web.context.request.RequestContextHolder;
+import com.fr.third.springframework.web.context.request.ServletRequestAttributes;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import javax.servlet.http.HttpServletRequest;
+
+public class NewWorkBookRowCreator extends AbstractExcelRowCreatorProvider {
+
+
+ @Override
+ public WorkbookRowCreator getRowCreator(Workbook workbook, String s, ExportContext exportContext) {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
+ .getRequestAttributes()).getRequest();
+ if (request != null) {
+ try {
+ WatermarkBean parsedWatermarkBean = SecurityService.getInstance().getParsedWatermarkBean(request);
+ //如果是SXSSFWorkbook 就手动获取getXSSFWorkbook
+ FineLoggerFactory.getLogger().error("水印导出开始");
+ if (workbook instanceof SXSSFWorkbook) {
+ FineLoggerFactory.getLogger().error("水印导出开始---SXSSFWorkbook 模式");
+ return new NewExcelWorkbookRowCreator(parsedWatermarkBean, (SXSSFWorkbook) workbook, s);
+ } else if (workbook instanceof XSSFWorkbook) { //如果本身就是XSSFWorkbook 就直接用
+ FineLoggerFactory.getLogger().error("水印导出开始+++XSSFWorkbook 模式");
+ return new NewExcelWorkbookRowCreator(parsedWatermarkBean, (XSSFWorkbook) workbook, s);
+ }
+ } catch (Exception e) {
+ FineLoggerFactory.getLogger().error("创建水印导出失败");
+ }
+ }
+ FineLoggerFactory.getLogger().error("未能获取到请求 使用默认导出程序处理-----");
+ //解析异常的拿不到请求的用默认处理器
+ return new MyExcelWorkbookRowCreator(workbook, s);
+ }
+
+}
diff --git a/src/main/java/com/fr/plugin/excel/fr/exporter/NewPageExcel2007Exporter.java b/src/main/java/com/fr/plugin/excel/fr/exporter/NewPageExcel2007Exporter.java
new file mode 100644
index 0000000..b160cc8
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/fr/exporter/NewPageExcel2007Exporter.java
@@ -0,0 +1,28 @@
+package com.fr.plugin.excel.fr.exporter;
+
+import com.fr.io.attr.ReportExportAttr;
+import com.fr.io.exporter.PageExcel2007Exporter;
+import com.fr.plugin.ws.wapper.WsUtils;
+import com.fr.report.report.Report;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+
+import java.util.List;
+
+/**
+ * @Author fr.open
+ * @Data 2021/10/28 17:06
+ * @Description TODO
+ * @Version 10.0
+ **/
+public class NewPageExcel2007Exporter extends PageExcel2007Exporter {
+
+ public NewPageExcel2007Exporter(List list) {
+ super(list);
+ }
+
+ @Override
+ protected void innerExportReport(Report report, ReportExportAttr reportExportAttr, String s, SXSSFWorkbook sxssfWorkbook, List list, List list1, int i) throws Exception {
+ super.innerExportReport(report, reportExportAttr, s, sxssfWorkbook, list, list1, i);
+ WsUtils.addWatterMarker2SXSSFWorkbook(sxssfWorkbook);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/fr/exporter/NewPageToSheetExcel2007Exporter.java b/src/main/java/com/fr/plugin/excel/fr/exporter/NewPageToSheetExcel2007Exporter.java
new file mode 100644
index 0000000..d9f6ee1
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/fr/exporter/NewPageToSheetExcel2007Exporter.java
@@ -0,0 +1,28 @@
+package com.fr.plugin.excel.fr.exporter;
+
+import com.fr.io.attr.ReportExportAttr;
+import com.fr.io.exporter.PageToSheetExcel2007Exporter;
+import com.fr.plugin.ws.wapper.WsUtils;
+import com.fr.report.report.Report;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+
+import java.util.List;
+
+/**
+ * @Author fr.open
+ * @Data 2021/10/28 17:07
+ * @Description TODO
+ * @Version 10.0
+ **/
+public class NewPageToSheetExcel2007Exporter extends PageToSheetExcel2007Exporter {
+
+ public NewPageToSheetExcel2007Exporter(List list) {
+ super(list);
+ }
+
+ @Override
+ protected void innerExportReport(Report report, ReportExportAttr reportExportAttr, String s, SXSSFWorkbook sxssfWorkbook, List list, List list1, int i) throws Exception {
+ super.innerExportReport(report, reportExportAttr, s, sxssfWorkbook, list, list1, i);
+ WsUtils.addWatterMarker2SXSSFWorkbook(sxssfWorkbook);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/fr/exporter/NewStreamExcel2007Exporter.java b/src/main/java/com/fr/plugin/excel/fr/exporter/NewStreamExcel2007Exporter.java
new file mode 100644
index 0000000..af04c54
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/fr/exporter/NewStreamExcel2007Exporter.java
@@ -0,0 +1,42 @@
+package com.fr.plugin.excel.fr.exporter;
+
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.decision.webservice.v10.security.SecurityService;
+import com.fr.io.attr.ReportExportAttr;
+import com.fr.io.exporter.excel.stream.StreamExcel2007Exporter;
+import com.fr.log.FineLoggerFactory;
+import com.fr.plugin.ws.wapper.WsUtils;
+import com.fr.report.report.Report;
+import com.fr.third.springframework.web.context.request.RequestContextHolder;
+import com.fr.third.springframework.web.context.request.ServletRequestAttributes;
+import com.fr.third.v2.org.apache.poi.POIXMLDocumentPart;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackagePartName;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackageRelationship;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.TargetMode;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFSheet;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFRelation;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+
+/**
+ * @Author fr.open
+ * @Data 2021/10/28 16:38
+ * @Description TODO
+ * @Version 10.0
+ **/
+public class NewStreamExcel2007Exporter extends StreamExcel2007Exporter {
+
+ public NewStreamExcel2007Exporter(List list) {
+ super(list);
+ }
+
+ @Override
+ protected void innerExportReport(Report report, ReportExportAttr reportExportAttr, String s, SXSSFWorkbook sxssfWorkbook, List list, List list1, int i) throws Exception {
+ super.innerExportReport(report, reportExportAttr, s, sxssfWorkbook, list, list1, i);
+ WsUtils.addWatterMarker2SXSSFWorkbook(sxssfWorkbook);
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/fr/provider/PageExportProvider.java b/src/main/java/com/fr/plugin/excel/fr/provider/PageExportProvider.java
new file mode 100644
index 0000000..8102fcc
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/fr/provider/PageExportProvider.java
@@ -0,0 +1,33 @@
+package com.fr.plugin.excel.fr.provider;
+
+import com.fr.general.ReportDeclareRecordType;
+import com.fr.io.collection.ExportCollection;
+import com.fr.io.exporter.AppExporter;
+import com.fr.io.exporter.ExcelExportType;
+import com.fr.main.FineBook;
+import com.fr.plugin.excel.fr.exporter.NewPageExcel2007Exporter;
+import com.fr.report.core.ReportUtils;
+import com.fr.report.fun.impl.AbstractExcelExportAppProvider;
+import com.fr.stable.web.SessionProvider;
+
+/**
+ * @Author fr.open
+ * @Data 2021/10/28 17:09
+ * @Description TODO
+ * @Version 10.0
+ **/
+public class PageExportProvider extends AbstractExcelExportAppProvider {
+
+ @Override
+ public String exportType() {
+ return "page";
+ }
+
+ @Override
+ public AppExporter newAppExporter(ExportCollection exportCollection, ExcelExportType excelExportType, SessionProvider sessionProvider) {
+ AppExporter exporter = new NewPageExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook((FineBook) sessionProvider.getOriginalObject()));
+ exportCollection.setExporter(exporter);
+ exportCollection.setRecordType(ReportDeclareRecordType.EXPORT_TYPE_EXCEL_PAGE);
+ return exporter;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/fr/provider/PageToSheetExportProvider.java b/src/main/java/com/fr/plugin/excel/fr/provider/PageToSheetExportProvider.java
new file mode 100644
index 0000000..ec9f41d
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/fr/provider/PageToSheetExportProvider.java
@@ -0,0 +1,34 @@
+package com.fr.plugin.excel.fr.provider;
+
+import com.fr.general.ReportDeclareRecordType;
+import com.fr.io.collection.ExportCollection;
+import com.fr.io.exporter.AppExporter;
+import com.fr.io.exporter.ExcelExportType;
+import com.fr.main.FineBook;
+import com.fr.plugin.excel.fr.exporter.NewPageExcel2007Exporter;
+import com.fr.plugin.excel.fr.exporter.NewPageToSheetExcel2007Exporter;
+import com.fr.report.core.ReportUtils;
+import com.fr.report.fun.impl.AbstractExcelExportAppProvider;
+import com.fr.stable.web.SessionProvider;
+
+/**
+ * @Author fr.open
+ * @Data 2021/10/28 17:20
+ * @Description TODO
+ * @Version 10.0
+ **/
+public class PageToSheetExportProvider extends AbstractExcelExportAppProvider {
+
+ @Override
+ public String exportType() {
+ return "sheet";
+ }
+
+ @Override
+ public AppExporter newAppExporter(ExportCollection exportCollection, ExcelExportType excelExportType, SessionProvider sessionProvider) {
+ AppExporter exporter = new NewPageToSheetExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook((FineBook) sessionProvider.getOriginalObject()));
+ exportCollection.setExporter(exporter);
+ exportCollection.setRecordType(ReportDeclareRecordType.EXPORT_TYPE_EXCEL_PAGESHEET);
+ return exporter;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/excel/fr/provider/SimpleExportProvider.java b/src/main/java/com/fr/plugin/excel/fr/provider/SimpleExportProvider.java
new file mode 100644
index 0000000..b00de5b
--- /dev/null
+++ b/src/main/java/com/fr/plugin/excel/fr/provider/SimpleExportProvider.java
@@ -0,0 +1,34 @@
+package com.fr.plugin.excel.fr.provider;
+
+import com.fr.general.ReportDeclareRecordType;
+import com.fr.io.collection.ExportCollection;
+import com.fr.io.exporter.AppExporter;
+import com.fr.io.exporter.ExcelExportType;
+import com.fr.main.FineBook;
+import com.fr.plugin.excel.fr.exporter.NewPageExcel2007Exporter;
+import com.fr.plugin.excel.fr.exporter.NewStreamExcel2007Exporter;
+import com.fr.report.core.ReportUtils;
+import com.fr.report.fun.impl.AbstractExcelExportAppProvider;
+import com.fr.stable.web.SessionProvider;
+
+/**
+ * @Author fr.open
+ * @Data 2021/10/28 17:18
+ * @Description TODO
+ * @Version 10.0
+ **/
+public class SimpleExportProvider extends AbstractExcelExportAppProvider {
+
+ @Override
+ public String exportType() {
+ return "simple";
+ }
+
+ @Override
+ public AppExporter newAppExporter(ExportCollection exportCollection, ExcelExportType excelExportType, SessionProvider sessionProvider) {
+ AppExporter exporter = new NewStreamExcel2007Exporter(ReportUtils.getPaperSettingListFromWorkBook((FineBook) sessionProvider.getOriginalObject()));
+ exportCollection.setExporter(exporter);
+ exportCollection.setRecordType(ReportDeclareRecordType.EXPORT_TYPE_EXCEL_ORIGINAL);
+ return exporter;
+ }
+}
diff --git a/src/main/java/com/fr/plugin/ws/wapper/WsUtils.java b/src/main/java/com/fr/plugin/ws/wapper/WsUtils.java
new file mode 100644
index 0000000..5ddc553
--- /dev/null
+++ b/src/main/java/com/fr/plugin/ws/wapper/WsUtils.java
@@ -0,0 +1,78 @@
+package com.fr.plugin.ws.wapper;
+
+import com.fr.base.iofile.attr.WatermarkAttr;
+import com.fr.decision.config.WatermarkConfig;
+import com.fr.decision.security.WatermarkData;
+import com.fr.decision.webservice.bean.security.WatermarkBean;
+import com.fr.decision.webservice.v10.security.SecurityService;
+import com.fr.log.FineLoggerFactory;
+import com.fr.page.WatermarkPainter;
+import com.fr.stable.ImageUtils;
+import com.fr.third.springframework.web.context.request.RequestContextHolder;
+import com.fr.third.springframework.web.context.request.ServletRequestAttributes;
+import com.fr.third.v2.org.apache.poi.POIXMLDocumentPart;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackagePartName;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.PackageRelationship;
+import com.fr.third.v2.org.apache.poi.openxml4j.opc.TargetMode;
+import com.fr.third.v2.org.apache.poi.ss.usermodel.Workbook;
+import com.fr.third.v2.org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFRelation;
+import com.fr.third.v2.org.apache.poi.xssf.usermodel.XSSFSheet;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+public class WsUtils {
+
+ public static byte[] getWatterMarker(WatermarkBean parsedWatermarkBean) {
+ WatermarkData watermarkData = WatermarkConfig.getInstance().getWatermarkData();
+ WatermarkAttr watermarkAttr = new WatermarkAttr(watermarkData);
+ watermarkAttr.setText(parsedWatermarkBean.getText());
+ WatermarkPainter painter = WatermarkPainter.createPainter(watermarkAttr);
+ int width=1024 + parsedWatermarkBean.getHorizontalGap();
+ int height=768+ parsedWatermarkBean.getVerticalGap();
+ BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ // 背景透明 开始
+ Graphics2D g = bufferedImage.createGraphics();
+ bufferedImage = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
+ g.dispose();
+ g = bufferedImage.createGraphics();
+ painter.paint(g, width, height);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ ImageUtils.writeImage(bufferedImage, "PNG", byteArrayOutputStream);
+ try {
+ ImageIO.write(bufferedImage, "PNG", new FileOutputStream("E:\\11.png"));
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ return byteArrayOutputStream.toByteArray();
+ }
+
+ public static void addWatterMarker2SXSSFWorkbook(SXSSFWorkbook sxssfWorkbook) throws Exception {
+ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
+ .getRequestAttributes()).getRequest();
+ if (request == null) {
+ FineLoggerFactory.getLogger().error("未能获取到请求 使用默认导出程序处理-----");
+ return;
+ }
+ WatermarkBean parsedWatermarkBean = SecurityService.getInstance().getParsedWatermarkBean(request);
+ byte[] watterMarker = WsUtils.getWatterMarker(parsedWatermarkBean);
+ int pictureIdx = sxssfWorkbook.addPicture(watterMarker, Workbook.PICTURE_TYPE_PNG);
+ POIXMLDocumentPart poixmlDocumentPart = sxssfWorkbook.getXSSFWorkbook().getAllPictures().get(pictureIdx);
+ PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
+ String relType = XSSFRelation.IMAGES.getRelation();
+ XSSFSheet xssfSheet = sxssfWorkbook.getXSSFWorkbook().getSheetAt(sxssfWorkbook.getNumberOfSheets() - 1);
+ PackageRelationship pr = xssfSheet.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
+ xssfSheet.getCTWorksheet().addNewPicture().setId(pr.getId());
+ FineLoggerFactory.getLogger().error("添加sheet{}并 添加水印成功", sxssfWorkbook.getNumberOfSheets());
+ }
+}
diff --git a/src/main/resources/com/fr/plugin/js/hideprint.js b/src/main/resources/com/fr/plugin/js/hideprint.js
new file mode 100644
index 0000000..2dc294e
--- /dev/null
+++ b/src/main/resources/com/fr/plugin/js/hideprint.js
@@ -0,0 +1,17 @@
+;
+function init(){
+ var g=_g();
+ if(g){
+ var word = _g().toolbar.options.items.filter(function (item) {
+ return item.xtype === 'excel-menu'
+ })[0].options.menu.filter(function (item) {
+ return item.src === 'Word'
+ })[0];
+ _g().toolbar.options.items.filter(function (item) {
+ return item.xtype === 'excel-menu'
+ })[0].options.menu.remove(word);
+ }else{
+ timer=setTimeout(init,500);
+ }
+}
+var timer=setTimeout(init,1000);