- 由 黄平创建, 最终由 刘俊修改于 六月 08, 2018
注意:示例仅供参考,若是实际场景和示例需求场景有所差别,有可能需要自行调整宏代码。
示例说明
在项目中有时需要对报表添加水印,该功能可以通过宏实现,如下图:
设置方法
- 在电子表格设计器 Excel 中,创建一张电子表格报表。
- 在浏览器的资源定制节点下,选中电子表格,右键选择 编辑宏 进入报表宏界面。
- 在报表宏界面新建客户端模块,在弹出的新建模块对话框中选择对象为spreadsheetReport;事件为onRender;并把下面宏代码复制到代码区域。
宏类型(客户端)
类型 | 对象 | 事件 |
---|---|---|
ClientSide | spreadsheetReport | onRender |
宏代码
展开源码
function main(spreadsheetReport, flag) {if(flag) {return;} debugger; var UserService = imports('bof.usermanager.UserService'); var currentUser = UserService.getInstance().getCurrentUser(); var settings = { // watermark_txt: currentUser.name //watermark_txt: spreadsheetReport.getParamValue("usrid") watermark_txt: currentUser.name +'\n'+currentUser.id }; //var panel = spreadsheetReport.elemSheetFrame.contentWindow.document.body; //watermark(settings, panel); // 传入动态水印内容 var panel = spreadsheetReport.elemSheetFrame.contentWindow.document.body; if (domutils.isMobile()){ setTimeout(function(){ watermark(settings, panel); // 传入动态水印内容 },500); } else { watermark(settings, panel); // 传入动态水印内容 } // if(GetQueryString("usrname") != null & GetQueryString("usrid") != null) // { // watermark(settings, panel); // 传入动态水印内容 // } } function GetQueryString(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if(r!=null)return decodeURI(r[2]); //return null; } function watermark(settings, panel) { // 默认设置 var defaultSettings = { watermark_txt: 'text', watermark_x: 30, // 水印起始位置x轴坐标 watermark_y: 100, // 水印起始位置Y轴坐标 watermark_rows: 100, // 水印行数 watermark_cols: 100, // 水印列数 watermark_x_space: 20, // 水印x轴间隔 watermark_y_space: 20, // 水印y轴间隔 //watermark_color: '#00FF00', watermark_color: '#999999', // 水印字体颜色 watermark_alpha: 0.3, // 水印透明度 watermark_fontsize: '16px', // 水印字体大小 watermark_font: '幼圆', // 水印字体 watermark_width: 80, // 水印宽度 watermark_height: 80, // 水印长度 watermark_angle: 45, // 水印倾斜度数 '': '' }; // 采用配置项替换默认值,作用类似jquery.extend if (arguments.length > 0 && typeof arguments[0] === 'object') { var src = arguments[0]; for (var key in src) { if (src[key] && defaultSettings[key] && src[key] === defaultSettings[key]) { continue; } else if (src[key]) { defaultSettings[key] = src[key]; } } } var oTemp = document.createDocumentFragment(); // 获取页面最大宽度 //var page_width = Math.max(document.body.scrollWidth, document.body.clientWidth); var page_width = Math.max(panel.scrollWidth, panel.clientWidth); // 获取页面最大高度 //var page_height = Math.max(document.body.scrollHeight, document.body.clientHeight); var page_height = Math.max(panel.scrollHeight, panel.clientHeight); // 如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔 if (defaultSettings.watermark_cols == 0 || (parseInt(defaultSettings.watermark_x + defaultSettings.watermark_width * defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) { defaultSettings.watermark_cols = parseInt((page_width - defaultSettings.watermark_x + defaultSettings.watermark_x_space) / (defaultSettings.watermark_width + defaultSettings.watermark_x_space)); //efaultSettings.watermark_x_space = parseInt((page_width - defaultSettings.watermark_x - defaultSettings.watermark_width * defaultSettings.watermark_cols) / (defaultSettings.watermark_cols - 1)); } // 如果将水印行数设置为0,或水印行数设置过大,超过页面最大高度,则重新计算水印行数和水印y轴间隔 if (defaultSettings.watermark_rows == 0 || (parseInt(defaultSettings.watermark_y + defaultSettings.watermark_height * defaultSettings.watermark_rows + defaultSettings.watermark_y_space * (defaultSettings.watermark_rows - 1)) > page_height)) { defaultSettings.watermark_rows = parseInt((page_height - defaultSettings.watermark_y + defaultSettings.watermark_y_space) / (defaultSettings.watermark_height + defaultSettings.watermark_y_space)); //efaultSettings.watermark_y_space = parseInt((page_height - defaultSettings.watermark_y - defaultSettings.watermark_height * defaultSettings.watermark_rows) / (defaultSettings.watermark_rows - 1)); } var x, y; for (var i = 0, len = defaultSettings.watermark_rows; i < len; i++) { y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i; for (var j = 0, leng = defaultSettings.watermark_cols; j < leng; j++) { x = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * j; var mask_div = document.createElement('div'); mask_div.id = 'mask_div' + i + j; mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt)); // 设置水印div倾斜显示 mask_div.style.webkitTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; mask_div.style.MozTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; mask_div.style.msTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; mask_div.style.OTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; mask_div.style.transform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; mask_div.style.visibility = ''; mask_div.style.position = 'absolute'; mask_div.style.left = x + 'px'; mask_div.style.top = y + 'px'; mask_div.style.overflow = 'hidden'; mask_div.style.zIndex = '9999'; // mask_div.style.border='solid #eee 1px'; mask_div.style.opacity = defaultSettings.watermark_alpha; mask_div.style.fontSize = defaultSettings.watermark_fontsize; mask_div.style.fontFamily = defaultSettings.watermark_font; mask_div.style.color = defaultSettings.watermark_color; mask_div.style.textAlign = 'center'; mask_div.style.width = defaultSettings.watermark_width + 'px'; mask_div.style.height = defaultSettings.watermark_height + 'px'; mask_div.style.display = 'block'; oTemp.appendChild(mask_div); } } panel.appendChild(oTemp); }
电子表格浏览\导出(EXCEL\PDF\HTML)\打印的时候支持水印:
前提:对应的电子表格不能设置背景色,因为设置了背景色会覆盖生成的水印
宏类型(服务端)
类型 | 对象 | 事件 |
---|---|---|
ServerSide | spreadsheetReport | onBeforeOutput |
展开源码
//类型:ServerSide 对象:spreadsheetReport 事件:onBeforeOutput var Color = Packages.java.awt.Color; var Font = Packages.java.awt.Font; var Graphics = Packages.java.awt.Graphics; var BufferedImage = Packages.java.awt.image.BufferedImage; var BufferedOutputStream = Packages.java.io.BufferedOutputStream; var FileOutputStream = Packages.java.io.FileOutputStream; var JPEGCodec = Packages.com.sun.image.codec.jpeg.JPEGCodec; var JPEGImageEncoder = Packages.com.sun.image.codec.jpeg.JPEGImageEncoder; var ImageIO = Packages.javax.imageio.ImageIO; var ByteArrayOutputStream = Packages.java.io.ByteArrayOutputStream; var Graphics2D = Packages.java.awt.Graphics2D; function main(spreadsheetReport) { //获取用户信息 var user = spreadsheetReport.remoteInvoke("UserService", "getCurrentUser", "[]"); var userObj = eval('(' + user + ')'); var usernName = userObj.result.name; var userAlias = userObj.result.alias; var str = usernName + "_" + userAlias; //设置水印文字内容:用户登录名_用户别名 var fontFamily = "宋体"; //水印字体 var imageWidth = 600; // 图片的宽度 var imageHeight = 1000; // 图片的高度 var fontWidth = 300; //文字宽度,倾斜直线上两个水印之间的间距 var workbook = spreadsheetReport.workbook; var count = workbook.getWorksheets().getCount(); //sheet页总数 var image = graphicsGeneration(str, imageWidth, imageHeight, fontFamily, fontWidth); for (var i = 0; i < count; i++) { var worksheet = workbook.getWorksheets().get(i); var type = spreadsheetReport.outputType; if (type == "PRINT" || type == "EXCEL2007" || type == "HTML" || type == "PDF" || type == "refresh") { //打印时 worksheet.setBackgroundImage(image); } else { worksheet.setBackgroundImage(null); } } } function graphicsGeneration(drawStr, imageWidth, imageHeight, fontFamily, fontWidth) { var yblank = 160; //设置纵向文字间隔 var fontSize = 15; //水印文字大小 var color = new Color(0xFF7F24, false); //设置水印文字颜色,第一个参数为16位RGB颜色值 var angle = 315; //设置水印倾斜角度 var image = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); var graphics = image.getGraphics(); graphics.setColor(Color.white); graphics.fillRect(0, 0, imageWidth, imageHeight); graphics.setColor(color); graphics.setFont(new Font(fontFamily, fontSize, fontSize)); var g2d = graphics; var transWidth = imageWidth + 400; g2d.translate(-transWidth, imageHeight); g2d.rotate(angle * Math.PI / 180); //设置水印倾斜角度 var x = 15; var y = yblank; for (var k = 0; k < 30; k++) { for (var j = 0; j < 12; j++) { graphics.drawString(drawStr, x, y); x += fontWidth; } x = 15; y += yblank; } var out = new ByteArrayOutputStream(); var flag = ImageIO.write(image, "jpg", out); var b = out.toByteArray(); return b; }
- 无标签