使用poi-tl导出word文件的几个技巧

1、前言

  Poi-tl提供了基于word模板文件导出word文件的功能。文档地址:http://deepoove.com/poi-tl/。

  用下来,总体感觉还是很方便的。但使用过程,有几个细节,值得记叙。

2、关于复选框

  有一组文字,每个词前面有复选框,根据值的不同,可以打勾,也可以不打勾。

  表现如下:

  勾选/不勾选在word中使用符号,即Wingdings 2字体。通过查Wingdings 2表:

  勾选框:字符代码为0x0052,对应键盘字符R。

  不勾选框:字符代码为0x00A3,由于超过ASCII码表值,没有对应键盘字符。

  模板脚本:

{{actionItem0}}聚餐 {{actionItem1}}轰趴 {{actionItem2}}郊游 {{actionItem3}}唱歌 

  Spring Boot代码:

			// 字体Wingdings 2的符号
			TextRenderData selSymbol = new TextRenderData("R",new Style("Wingdings 2",10.5));
			TextRenderData unselSymbol = new TextRenderData("\u00A3",new Style("Wingdings 2",10.5));

			int actionItem = actionInfo.getActionItem();
			String fieldName = "";
			for(int i = 0; i < 4; i++) {
				fieldName = "actionItem" + i;
				int bitValue = (actionItem >> i) & 0x01;
				if (bitValue == 1) {
					datas.put(fieldName, selSymbol);
				}else {
					datas.put(fieldName, unselSymbol);
				}
			}

  4个选项,使用bitmap编码,bit0表示是否聚餐,bit1表示是否轰趴,bit2表示是否郊游,bit3表示是否唱歌。

  然后,就可以输出word文件了。

			// 配置
			Configure config = Configure.builder()
					.useSpringEL()
					.build();
			
			XWPFTemplate template = XWPFTemplate.compile(wordTemplate,config).render(datas);
			template.writeAndClose(new FileOutputStream(outputFile));

3、关于图片列表

  如果单个图片,模板文件中使用{{@var}}即可输出,但如果是一个列表,就需要用区块对,然后怎样显示图片对象呢?例子中只有文本列表使用{{=#this}}表示文本项。经试验,用{{@#this}}表示图片项。

  模板文件:

{{?imgList}}{{@#this}} {{/imgList}}

  注意:{{@#this}}后面有一个空格,支持水平排列。

  Spring Boot代码:

			// 获取图片路径列表
			List<String> imgPathList = getImgPathList();
			// 输出的图片对象列表
			List<PictureRenderData> imgList = new ArrayList<PictureRenderData>();
			File imgFile=null;
			FileInputStream imgInputStream=null;
			BufferedImage image=null;	
			for (int i =0; i < imgPathList.size(); i++){
				String imgPath = imgPathList.get(i);
				imgFile=new File(imgPath);
				if(imgFile.exists()) {
					imgInputStream=new FileInputStream(imgFile);
					image= ImageIO.read(imgInputStream);
					// 将java图片转成PictureRenderData类型对象
					PictureRenderData picItem = Pictures.ofBufferedImage(image, PictureType.PNG).size(60, 50).create();
					imgList.add(picItem);
				}
			}
			datas.put("imgList",imgList);

  这样,就可以正确显示图片列表了。

posted @ 2021-07-26 15:39  阿拉伯1999  阅读(2844)  评论(0编辑  收藏  举报