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