葡萄种子 发表于 2023-10-26 20:01:34

如何实现绑定字段并生成图片?

本帖最后由 Ellia.Duan 于 2023-11-15 16:42 编辑

产品:SpreadJS , GcExcel
版本:16.1.4 , 6.1.4
需求编号:【DOCXLS-9273】
我希望用GcExcel 模板绑定字段,字段的内容其实是图片url,我希望渲染模板后给前端展示成图片,模板见附件,代码如下,结果函数模板+字段没有生效,请问有其他办法吗?


public class DemoJsonDatasource3 {
    public static void main(String[] args) throws IOException {
      String index = "29";
      Workbook workbook = new Workbook();
      String rootPath = "";
      String templateFile = rootPath + index + ".template.xlsx";
      workbook.open(templateFile);
      String dataFile0 = rootPath + index + ".ds0.json.txt";
      JsonDataSource datasource0 = new JsonDataSource(new String(Files.readAllBytes(Paths.get(dataFile0)), StandardCharsets.UTF_8));
      workbook.addDataSource("ds0", datasource0);
      boolean page = false;
      if (page) {
            workbook.getNames().add("TemplateOptions.PaginationMode", "true");
      }
      workbook.processTemplate();
      workbook.save(rootPath + index + ".result.xlsx");
    }
}


葡萄种子 发表于 2023-10-26 20:02:32


结果是这样样子

Ellia.Duan 发表于 2023-10-27 11:03:59

本帖最后由 Ellia.Duan 于 2023-10-27 11:05 编辑

您好,请参考这篇文章
https://demo.grapecity.com.cn/do ... ondataimagetemplate
您可以点击右侧的下载按钮查看全部代码。
在这篇文章中,运行相关代码后,可以生成图片,如下图所示:



其模板为


您可以将您的图片数据转换为base64格式的数据,看修改后是否可以生效

葡萄种子 发表于 2023-10-27 11:21:53

这个是针对图片数据已经在字段内容里面的场景。那如果字段内容里面仅仅是图片的url地址,可以有办法实现吗?

Ellia.Duan 发表于 2023-10-27 15:07:43

您好,模板暂时不支持url类型的图片,但是您可以通过下面的代码,将url地址转换为base64
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import com.grapecity.documents.excel.Workbook;
import com.grapecity.documents.excel.drawing.IShape;

public class Test {

    public static void main(String[] args) throws MalformedURLException, UnsupportedEncodingException {
      Workbook workbook = new Workbook();
      workbook.open("Bug_4098.json");
      IShape pic = workbook.getActiveSheet().getShapes().get(0);
      String url = pic.getPictureFormat().getUrl();
      byte[] picByte = GetPicFromUrl(url);
      pic.getPictureFormat().setFill(picByte);
      workbook.save("Bug_4098.pdf");
      workbook.save("Bug_4098.xlsx");
    }

    private static byte[] GetPicFromUrl(String urlString) throws MalformedURLException, UnsupportedEncodingException {

      URL url = new URL(encode(urlString));
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      try (InputStream inputStream = url.openStream()) {
            int n = 0;
            byte[] buffer = new byte;
            while (-1 != (n = inputStream.read(buffer))) {
                baos.write(buffer, 0, n);
            }
      } catch (IOException e) {
            e.printStackTrace();
      }

      return baos.toByteArray();
    }

    private static String encode(String url) throws UnsupportedEncodingException {
      char[] charArray = url.toCharArray();
      StringBuilder sb = new StringBuilder();
      for (char c : charArray) {
            if (c >= 0 && c < 255) {
                sb.append(c);
            } else {
                sb.append(URLEncoder.encode(String.valueOf(c), "UTF-8"));
            }
      }
      return sb.toString();
    }

}

Ellia.Duan 发表于 2023-10-30 16:55:07

您好,通过楼上回复是否可以解决您的问题呢?

葡萄种子 发表于 2023-11-9 11:18:24

Ellia.Duan 发表于 2023-10-30 16:55
您好,通过楼上回复是否可以解决您的问题呢?

谢谢您的回复。我们暂时绕过了,但是这个需求最好能实现,你们可以在新版本中加这个feature吗?

Ellia.Duan 发表于 2023-11-9 11:33:17

您好,您提到的暂时绕过了,是不放图片了,还是用了楼上给出的转base64的方案呢?如果已经用Base64实现了模板中加载图片,那么当前方案是哪里不满足您的需求呢?我们需要根据这个评估下您的需求。

葡萄种子 发表于 2023-11-9 12:23:43

Ellia.Duan 发表于 2023-11-9 11:33
您好,您提到的暂时绕过了,是不放图片了,还是用了楼上给出的转base64的方案呢?如果已经用Base64实现了模 ...

我们没有用你们提供的方案,我们不会提前把url对应的图片都下载下来的,代价比较高。我们目前是先绑定url字段到一个单元格,然后在另外的单元格调用js的=image()函数,函数的参数是url字段绑定的单元格,并设置上下文为url绑定的单元格,这样页面可以展示图片。一个字段有多个值也会自动跟着扩展

Ellia.Duan 发表于 2023-11-9 14:33:46

好的,明白您的需求背景了,也感谢您分享经验,稍后将为您奖励金币。同时我将您的需求先记录下来,此贴将移至“产品需求”板块,待有进展会及时联系您。
页: [1] 2
查看完整版本: 如何实现绑定字段并生成图片?