From 4b1e8f6fb1efb2f20a6dbcc75c2a0d40e9125fb0 Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Mon, 15 Nov 2021 14:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9D=90=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +- doc/水印导出插件使用文档.docx | Bin 0 -> 12070 bytes plugin.xml | 27 ++++ src/main/java/com/fr/plugin/JSFileLoader.java | 21 +++ .../java/com/fr/plugin/WmExportProcessor.java | 49 ++++++ .../com/fr/plugin/WmLifeCycleMonitor.java | 16 ++ .../com/fr/plugin/excel/ExAppExporter.java | 89 ++++++++++ .../excel/MyExcelWorkbookRowCreator.java | 107 ++++++++++++ .../excel/NewExcelWorkbookRowCreator.java | 153 ++++++++++++++++++ .../plugin/excel/NewWorkBookRowCreator.java | 45 ++++++ .../excel/bi/MyExcelWorkbookRowCreator.java | 107 ++++++++++++ .../excel/bi/NewExcelWorkbookRowCreator.java | 153 ++++++++++++++++++ .../excel/bi/NewWorkBookRowCreator.java | 45 ++++++ .../fr/exporter/NewPageExcel2007Exporter.java | 28 ++++ .../NewPageToSheetExcel2007Exporter.java | 28 ++++ .../exporter/NewStreamExcel2007Exporter.java | 42 +++++ .../excel/fr/provider/PageExportProvider.java | 33 ++++ .../provider/PageToSheetExportProvider.java | 34 ++++ .../fr/provider/SimpleExportProvider.java | 34 ++++ .../java/com/fr/plugin/ws/wapper/WsUtils.java | 78 +++++++++ .../resources/com/fr/plugin/js/hideprint.js | 17 ++ 21 files changed, 1110 insertions(+), 1 deletion(-) create mode 100644 doc/水印导出插件使用文档.docx create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/JSFileLoader.java create mode 100644 src/main/java/com/fr/plugin/WmExportProcessor.java create mode 100644 src/main/java/com/fr/plugin/WmLifeCycleMonitor.java create mode 100644 src/main/java/com/fr/plugin/excel/ExAppExporter.java create mode 100644 src/main/java/com/fr/plugin/excel/MyExcelWorkbookRowCreator.java create mode 100644 src/main/java/com/fr/plugin/excel/NewExcelWorkbookRowCreator.java create mode 100644 src/main/java/com/fr/plugin/excel/NewWorkBookRowCreator.java create mode 100644 src/main/java/com/fr/plugin/excel/bi/MyExcelWorkbookRowCreator.java create mode 100644 src/main/java/com/fr/plugin/excel/bi/NewExcelWorkbookRowCreator.java create mode 100644 src/main/java/com/fr/plugin/excel/bi/NewWorkBookRowCreator.java create mode 100644 src/main/java/com/fr/plugin/excel/fr/exporter/NewPageExcel2007Exporter.java create mode 100644 src/main/java/com/fr/plugin/excel/fr/exporter/NewPageToSheetExcel2007Exporter.java create mode 100644 src/main/java/com/fr/plugin/excel/fr/exporter/NewStreamExcel2007Exporter.java create mode 100644 src/main/java/com/fr/plugin/excel/fr/provider/PageExportProvider.java create mode 100644 src/main/java/com/fr/plugin/excel/fr/provider/PageToSheetExportProvider.java create mode 100644 src/main/java/com/fr/plugin/excel/fr/provider/SimpleExportProvider.java create mode 100644 src/main/java/com/fr/plugin/ws/wapper/WsUtils.java create mode 100644 src/main/resources/com/fr/plugin/js/hideprint.js 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 0000000000000000000000000000000000000000..c0fa6a434cd9463d794ada6dbd9c01c4d90ee681 GIT binary patch literal 12070 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

+#x%_Wih2~j!uVl5c0GO z&L-(lEFHtTwaN?aMLW~Hrp+>}?4cE9XORvGG%phZgs1~ld*}kg;q|Lm)-KwT^B*dv zpF9a_q;9B`iL~tKNecu*@54M>Q22N(Sk4uFhsi??r!QU3ad*b0H=NApj17%6vtUNS3M$kU&JY~N( z&om>|cUz$3Mux2SYs!>a)Y+SuXVu=G0lu~6rHuzp92SFK&fTw^T>?Nk33dlaNouJ6 z4QQQL&s&c7j2w}vp1ul@ILKd+B;+1g?YIhqTj5CXB>qItBFwarvYe5ib-u!;K^e!I z!3_w}?H%n2eHBgGqoz0CeKG=_8vAa72-eD`RBY#Yh3(z6Kvl_@3;9V)?0Oik(?|Nj zWPW4VGD<=#VfbQy6sJ^kSK)#ExAHQPaD)YDVR-C`=~&ZoJ3Pup9?V0RdhGC3g5;K7 zH>!dzrbog3f>@orGA^fCl2pz618@ozeH5#f8)0H&e` zpW$TxLjAWt@>9)0LoMM@>?m*x^$P+CGZ}**jMz<(7G6VG?LxH+$I}k0m#OquXLw3X z%scFemv{NIBCQ|yk|$qs4y$s}N4|MQE(0yHzCVVC6A{&z!I0}m$FWntnk%$uTfls{ zf?b>|$;}p)pYdad7A1*Eo}kY(o8)5xM>M~ddo}fzs~*th&QA2)s7L}xL4E}{dYK}B zbkB_%;C>;shsV}SjyW}}Nw3@L)t^w?%^gh-*I)>$NiCW|{$g|5 z|E3^XQu%#UuyX3b;T{QCK|fFOUxfb*_CgS0UPQu|EoYu33V45n;}kA`E3L&qh90P2W#FzcCCgaYw2I!1@hdRJvCC4=vp; z!b$>m8O=CRwMnt(^OiGu;furil>7A4 zfO>f|`J3v&3h3Qsf*m=k7-*|_lI&+Qm%cy)wUQPdAY8;7`>L2kchwD(5ZfY&sC>gD zELvC(;w2A71fB_MIJ65Cb_E3tB^&W%%D5T>uT{PpLK@8cD&M`=M4z zM*@6~frDiORSyR}dbB$eu6yRji(6j-Plah&v?-+Mkc9@L|u{(7OGgMkYjg z=rWQ6-N4t8ipsEnmzW1?1WOB*;T!!S-*hRHtsI2WKH1M8?boYkWlX60`mFU-`V!o&inmPj>G7{mMOi0d zP?NIfeflwpU{>!_ADowu&5rGS8!?B@&kJQ$;z?<1wuXUlza&N?R`sJ10}~v_+zGYK z)saK;5Zys%AMQrUe6jW88S2~5>NF?sN$c~z0h)62ZpY)P0?!r%Bm@Qc7mfa3 zC+-)6f8SdVw)|Inuth9@zpVD-P9NL$2h6WdU;K^vxySxnXTL;vfIf6~0^Y8_jo*L6 zJy8E@4^JSPf8zeK34iM7vDth;{}Q+GU(kOV(Z@r791Q;EMMC;dN&e>Yn8D*X>^Fm@ z|Ha^URQBH#@=&k)tNo>#e^l@Osfow+yAQBmnxF$e{SEt1HSc55A6Jb2MjwNX#oy?^ z>PH{LA6G#Bh8u&;^>6s!^^pH<(BRb1f7-*KV`2WT5PTT$zpw6xljB!=fMnACaXdU0 z_VG#b0Q{w?u0Mfbx&OXM{KuOAy+a>gKmO)41CGOgo>2ef@mP?@am8=AIOTufe?%FN z@sESs-}qaw3-P~0-N*RHx%%IDd$j-H|Czae3~zl@r1=|O_1B#JF4_DA{(qUhP;iL# pQ}(}dgMY5`$JxQ(y;l4Q{GBUQR)GC!{_r61Ahf`%tA^nL^gqJasK5XK literal 0 HcmV?d00001 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);