帆软自定义函数实现,图片在下文字在上

1. 描述

 

应用场景:一个图表字段跟一个普通字段希望有层次的显示在一个单元格中。例如 A 字段存着一个图片,B 字段存着一些字符串。

                背景是 A 字段,显示的内容是 B 字段的值,类似于PPT等层的一个关系,下层图片为背景、上层显示帆软字符串,如下图所示:



 

2. 实现思路

FineReport 可以通过自定义函数来实现,定义两个参数 name、 image 分别接收模板中字段,然后返回一个带 name 的图片,就实现把文字显示在图片之上了。

3. 实现步骤

3.1 编写自定义函数

定义 StringImage 这个类代码如下所示:

<span style="color:#334356"><span style="color:#1bc1a1"><img data-cke-saved-src="http://help.finereport.com/js/clipboard/clippy.png" src="http://help.finereport.com/js/clipboard/clippy.png" alt="Copy to clipboard" class="clippy" /><code><span style="color:#999988"><em>//图片在下文字在上</em></span>
package com.fr.function;

<span style="color:teal">import</span> com.fr.base.GraphHelper;
<span style="color:teal">import</span> com.fr.data.core.db.BinaryObject;
<span style="color:teal">import</span> com.fr.log.FineLoggerFactory;
<span style="color:teal">import</span> com.fr.script.AbstractFunction;
<span style="color:teal">import</span> com.fr.stable.CoreGraphHelper;

<span style="color:teal">import</span> javax.imageio.ImageIO;
<span style="color:teal">import</span> java.awt.Graphics2D;
<span style="color:teal">import</span> java.awt.Image;
<span style="color:teal">import</span> java.awt.image.BufferedImage;
<span style="color:teal">import</span> java.io.IOException;


<span style="color:#999988"><em>/**
 * 图片在下文字在上
 */</em></span>
public <span style="color:teal">class</span> <span style="color:#445588"><strong>StringImage</strong></span> <span style="color:teal">extends</span> <span style="color:#445588"><strong>AbstractFunction</strong></span> {
    @Override
    public <span style="color:#0086b3">Object</span> run(<span style="color:#0086b3">Object</span>[] args) {
        Image result = null;
        int p = <span style="color:teal">0</span>;
        <span style="color:#0086b3">Object</span>[] ob = <span style="color:teal">new</span> <span style="color:#0086b3">Object</span>[<span style="color:teal">2</span>];
        <span style="color:teal">for</span> (int i = <span style="color:teal">0</span>; (i < args.length && p <= <span style="color:teal">1</span>); i++) {
            <span style="color:teal">if</span> (args[i] == null) {
                <span style="color:teal">continue</span>;
            }
            ob[p] = args[i];
            p++;

        }

        <span style="color:teal">if</span> (ob[<span style="color:teal">1</span>] <span style="color:teal">instanceof</span> BinaryObject) {
            BinaryObject binaryObject = (BinaryObject) ob[<span style="color:teal">1</span>];
            <span style="color:teal">try</span> {
                result = initStringImage((<span style="color:#0086b3">String</span>) ob[<span style="color:teal">0</span>], ImageIO.read(binaryObject.getInputStream()));
            } <span style="color:teal">catch</span> (IOException e) {
                e.printStackTrace();
            }
        } <span style="color:teal">else</span> <span style="color:teal">if</span> (ob[<span style="color:teal">1</span>] <span style="color:teal">instanceof</span> Image) {
            result = initStringImage((<span style="color:#0086b3">String</span>) ob[<span style="color:teal">0</span>], (Image) ob[<span style="color:teal">1</span>]);
        } <span style="color:teal">else</span> {
            FineLoggerFactory.getLogger().warn(<span style="color:#dd1144">"Unsupported type of "</span> + ob[<span style="color:teal">1</span>].getClass());
        }

        <span style="color:teal">return</span> result;
    }

    private Image initStringImage(<span style="color:#0086b3">String</span> name, Image image) {
        BufferedImage splashBuffedImage = CoreGraphHelper.toBufferedImage(image);
        Graphics2D splashG2d = splashBuffedImage.createGraphics();
        double centerX = <span style="color:teal">25</span>;
        double centerY = <span style="color:teal">25</span>;
        GraphHelper.drawString(splashG2d, name, centerX, centerY);
        <span style="color:teal">return</span> splashBuffedImage;
    }

}</code></span></span>

3.2 编译自定义函数

将编译后的 StringImage.class 放到%FR _HOME%\webapps\webroot\WEB-INF\classes下,因为 StringImage.java 属于包 com.fr.function,所以 StringImage.class 需要放到%FR _HOME%\webapps\webroot\WEB-INF\classes\com\fr\function目录下。

3.3 注册自定义函数

生成该函数的类后需要在设计器中进行注册,才可以使用该函数。打开服务器>函数管理器,选择刚刚定义好了 StringImage 类,如下图:

 

函数名称可以自定义,同时可以添加该函数的使用说明,如上图所示的描述。

3.4 使用自定义函数

 

注册好自定义函数后,制作报表时便可直接使用。

1)首先数据库中需要新建一张表,存放图片和文字的内容(图片上传到数据库的方法请参见 上传图片),如下图所示:

注:内置的 Sqlite 不支持显示图片。

2)制作模板

A1 单元格拖入 name 字段,B1 单元格拖入 picture 字段,A2 单元格输入公式 =StringImage(A1,B1),如下图所示:

保存模板预览就可以实现图片在下文字在上的效果了,如下图所示:

猜你喜欢

转载自blog.csdn.net/hzp666/article/details/89914183