如何实现绑定字段并生成图片?
本帖最后由 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");
}
}
结果是这样样子 本帖最后由 Ellia.Duan 于 2023-10-27 11:05 编辑
您好,请参考这篇文章
https://demo.grapecity.com.cn/do ... ondataimagetemplate
您可以点击右侧的下载按钮查看全部代码。
在这篇文章中,运行相关代码后,可以生成图片,如下图所示:
其模板为
您可以将您的图片数据转换为base64格式的数据,看修改后是否可以生效
这个是针对图片数据已经在字段内容里面的场景。那如果字段内容里面仅仅是图片的url地址,可以有办法实现吗? 您好,模板暂时不支持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
您好,通过楼上回复是否可以解决您的问题呢?
谢谢您的回复。我们暂时绕过了,但是这个需求最好能实现,你们可以在新版本中加这个feature吗? 您好,您提到的暂时绕过了,是不放图片了,还是用了楼上给出的转base64的方案呢?如果已经用Base64实现了模板中加载图片,那么当前方案是哪里不满足您的需求呢?我们需要根据这个评估下您的需求。 Ellia.Duan 发表于 2023-11-9 11:33
您好,您提到的暂时绕过了,是不放图片了,还是用了楼上给出的转base64的方案呢?如果已经用Base64实现了模 ...
我们没有用你们提供的方案,我们不会提前把url对应的图片都下载下来的,代价比较高。我们目前是先绑定url字段到一个单元格,然后在另外的单元格调用js的=image()函数,函数的参数是url字段绑定的单元格,并设置上下文为url绑定的单元格,这样页面可以展示图片。一个字段有多个值也会自动跟着扩展 好的,明白您的需求背景了,也感谢您分享经验,稍后将为您奖励金币。同时我将您的需求先记录下来,此贴将移至“产品需求”板块,待有进展会及时联系您。
页:
[1]
2