注意 | ||
---|---|---|
| ||
本文档的示例代码仅适用于本文档中的示例报表/场景。若实际报表/场景与示例代码无法完全适配(如使用功能不一致,或多个宏代码冲突等),需根据实际需求开发代码。 |
示例说明
在项目中有时需要对报表添加水印,该功能可以通过宏实现,如下图:
...
设置方法
- 在电子表格设计器 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 }; var panel = spreadsheetReport.elemSheetFrame.contentWindow.document.body;//watermark_txt: spreadsheetReport.getParamValue("usrid") watermark(settings, panel); // 传入动态水印内容 } function watermark(settings, panel) { watermark_txt: currentUser.name +'\n'+currentUser.id }; // 默认设置 //var defaultSettingspanel = {spreadsheetReport.elemSheetFrame.contentWindow.document.body; watermark_txt: 'text', watermark_x: 120, // 水印起始位置x轴坐标 watermark_y: 120, //watermark(settings, panel); // 传入动态水印内容 var sheetFrame = spreadsheetReport.elemSheetFrame; var sheetDoc = sheetFrame && sheetFrame.contentWindow && sheetFrame.contentWindow.document; var mainTable = sheetDoc && sheetDoc.getElementById("mainTable"); if (!mainTable) { return; } if (domutils.isMobile()){ // 水印起始位置Y轴坐标 setTimeout(function(){ watermark_rows: 20, watermark(settings, mainTable); // 水印行数传入动态水印内容 watermark_cols: 20},500); } //else 水印列数 { watermark_x_space: 100, watermark(settings, mainTable); // 传入动态水印内容 水印x轴间隔 } watermark_y_space: 50, // 水印y轴间隔 if(GetQueryString("usrname") != null & GetQueryString("usrid") != null) watermark_color: '#00FF00', // { // watermark(settings, panel); // 水印字体颜色传入动态水印内容 // } watermark_alpha: 0.4, } function GetQueryString(name) { // 水印透明度 var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); watermark_fontsize: '18px', var r = window.location.search.substr(1).match(reg); // 水印字体大小 if(r!=null)return decodeURI(r[2]); //return null; } function watermark_font: '微软雅黑'(settings, panel) { // 水印字体默认设置 var defaultSettings = { watermark_width: 120, // 水印宽度watermark_txt: 'text', watermark_heightx: 8030, // 水印长度水印起始位置x轴坐标 watermark_angley: 15100, // 水印倾斜度数水印起始位置Y轴坐标 ''watermark_rows: '' 100, }; // 采用配置项替换默认值,作用类似jquery.extend水印行数 if (arguments.length > 0 && typeof arguments[0] === 'object') { watermark_cols: 100, // 水印列数 var src = arguments[0]; watermark_x_space: 20, for (var key in src)// {水印x轴间隔 watermark_y_space: 20, if (src[key] && defaultSettings[key] && src[key] === defaultSettings[key]) { // 水印y轴间隔 //watermark_color: '#00FF00', continue; watermark_color: '#999999', // 水印字体颜色 } else if (src[key]) { watermark_alpha: 0.3, // 水印透明度 defaultSettings[key] = src[key]; watermark_fontsize: '16px', } // 水印字体大小 } watermark_font: '幼圆', } var oTemp = document.createDocumentFragment(); // 水印字体 // 获取页面最大宽度 var page_width = Math.max(document.body.scrollWidth, document.body.clientWidth);watermark_width: 80, // 获取页面最大高度,电子表格是一个iframe,需要获取iframe的最大高度水印宽度 var pagewatermark_height: 80, = Math.max(panel.scrollHeight, panel.clientHeight); // 如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔水印长度 if (defaultSettings.watermark_cols == 0 || (parseInt(defaultSettings.watermark_xangle: + defaultSettings.watermark_width * defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) {45, // 水印倾斜度数 '': '' defaultSettings.watermark_cols = parseInt((page_width - defaultSettings.watermark_x + defaultSettings.watermark_x_space) / (defaultSettings.watermark_width + defaultSettings.watermark_x_space)); defaultSettings.watermark_x_space = parseInt((page_width - defaultSettings.watermark_x - defaultSettings.watermark_width * defaultSettings.watermark_cols) / (defaultSettings.watermark_cols - 1)) }; // 采用配置项替换默认值,作用类似jquery.extend if (arguments.length > 0 && typeof arguments[0] === 'object') { var src = arguments[0]; } for //(var 如果将水印行数设置为0,或水印行数设置过大,超过页面最大高度,则重新计算水印行数和水印y轴间隔key in src) { 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)) {if (src[key] && defaultSettings[key] && src[key] === defaultSettings[key]) { defaultSettings.watermark_rows = parseInt((page_height - defaultSettings.watermark_y + defaultSettings.watermark_y_space) / (defaultSettings.watermark_height + defaultSettings.watermark_y_space) 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 defaultSettings.watermark_y_space userObj = parseInteval('(page_height' - defaultSettings.watermark_y - defaultSettings.watermark_height * defaultSettings.watermark_rows) / (defaultSettings.watermark_rows - 1)); }+ user + ')'); var usernName = userObj.result.name; var x, y; userAlias = userObj.result.alias; for (var istr = 0,usernName len = defaultSettings.watermark_rows; i < len; i++) {+ "_" + userAlias; //设置水印文字内容:用户登录名_用户别名 var fontFamily = y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i; "宋体"; //水印字体 var imageWidth = 600; // 图片的宽度 for (var jimageHeight = 0, leng = defaultSettings.watermark_cols; j < leng; j++) { 1000; // 图片的高度 var fontWidth = 300; //文字宽度,倾斜直线上两个水印之间的间距 var xworkbook = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * jspreadsheetReport.workbook; var count = workbook.getWorksheets().getCount(); //sheet页总数 var mask_divimage = document.createElement('div'); graphicsGeneration(str, imageWidth, imageHeight, fontFamily, fontWidth); for (var i mask_div.id = 'mask_div' + i + j;= 0; i < count; i++) { var worksheet = mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt)); // 设置水印div倾斜显示workbook.getWorksheets().get(i); var type = mask_div.style.webkitTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';spreadsheetReport.outputType; if (type == "PRINT" || type == "EXCEL2007" mask_div.style.MozTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; || type == "HTML" || type == "PDF" || type == "refresh") { //打印时 mask_div.style.msTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)';worksheet.setBackgroundImage(image); } else { mask_div.style.OTransform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; worksheet.setBackgroundImage(null); } mask_div.style.transform = 'rotate(-' + defaultSettings.watermark_angle + 'deg)'; } } function graphicsGeneration(drawStr, imageWidth, imageHeight, fontFamily, fontWidth) { var yblank = 160; //设置纵向文字间隔 mask_div.style.visibility = '';var fontSize = 15; //水印文字大小 var color = mask_div.style.position = 'absolute'; new Color(0xFF7F24, false); //设置水印文字颜色,第一个参数为16位RGB颜色值 var angle = 315; //设置水印倾斜角度 mask_div.style.left = xvar + 'px'; image = new BufferedImage(imageWidth, imageHeight, mask_div.style.top = y + 'px'; BufferedImage.TYPE_INT_RGB); var graphics = image.getGraphics(); graphics.setColor(Color.white); mask_div.style.overflow = 'hidden'graphics.fillRect(0, 0, imageWidth, imageHeight); graphics.setColor(color); mask_div.style.zIndex = '9999'graphics.setFont(new Font(fontFamily, fontSize, fontSize)); var g2d = graphics; var // mask_div.style.border='solid #eee 1px'transWidth = imageWidth + 400; g2d.translate(-transWidth, imageHeight); g2d.rotate(angle * mask_div.style.opacity = defaultSettings.watermark_alpha;Math.PI / 180); //设置水印倾斜角度 var x = 15; mask_div.style.fontSizevar y = defaultSettings.watermark_fontsizeyblank; for (var k = mask_div.style.fontFamily = defaultSettings.watermark_font; 0; k < 30; k++) { for mask_div.style.color = defaultSettings.watermark_color; (var j = 0; j < 12; j++) { mask_div.style.textAlign = 'center'; graphics.drawString(drawStr, x, y); mask_div.style.width = defaultSettings.watermark_widthx += 'px'fontWidth; } mask_div.style.height = defaultSettings.watermark_height + 'px'; x = 15; mask_div.style.display = 'block' y += yblank; } var out oTemp.appendChild(mask_div= new ByteArrayOutputStream(); var flag = } ImageIO.write(image, "jpg", out); } var b = panelout.appendChildtoByteArray(oTemp)); return b; } |