java通过poi-tl使用word模版生成word文件

问题描述:使用work模板文件来生成word文件。

问题解决:1、使用apache poi 来生成word文件  2、使用Poi-tl生成 

本章主要讲如何使用poi-tl通过模版文件生成word文件。



关于poi-tl

poi-tl:poi template language 一个基于poi的word模板生成文档的开源组件。

文档介绍:http://deepoove.com/poi-tl/

GitHub地址:https://github.com/Sayi/poi-tl

代码地址:见github的junit测试用例 


中文文档地址:https://github.com/Sayi/poi-tl/wiki/1.%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3

poi-tl 语法

所有的语法结构都是以 {{ 开始,以 }} 结束(在下一版本中,语法将支持自定义),文档的样式继承模板标签的样式,也可以在渲染数据中指定,实现了样式的最大自由化。
{{template}}
普通文本,渲染数据为:String或者TextRenderData

{{@template}}
图片,渲染数据为:PictureRenderData

{{#template}}
表格,渲染数据为:TableRenderData


{{*template}}
列表,渲染数据为:NumbericRenderData


poi-tl使用

1.首先在工程中引用poi-tl:

<dependency>
    <groupId>com.deepoove</groupId>
    <artifactId>poi-tl</artifactId>
    <version>0.0.3</version>
</dependency>

2.使用方法
  @org.junit.Test
    public void testPicture(){
    	final String tt="asdfasdfa";
    	Map<String, Object> datas = new HashMap<String, Object>() {
			{
				//本地图片
				put("photo", new PictureRenderData(100, 116, 图片路径+"/111.jpg"));
				put("name","刘一刀");
				put("oname","");
				put("xb","男");
				put("csrq","19900104");
				put("mz","汉族");
				put("zzmm","团员");
				put("sfzjh","511024199001034543");
				put("xjh","G511024199001034543");
				put("txdz","四川省内江市威远县");
				put("p191","1887282822");
				put("thinkTable",new TableRenderData(new ArrayList<RenderData>() {
					{
						add(new TextRenderData("FFFFFF",tt));
						add(new TextRenderData("FFFFFF", "活动时间或次数"));
					}
				}, new ArrayList<Object>() {
					{
						add("在成都唱歌在成都唱歌在成都唱歌在成都唱歌在成都唱歌;2");
						add("在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌;3");
					}
				}, "no datas", 8600));
				put("aaa",new NumbericRenderData(new ArrayList<TextRenderData>(){{
					add(new TextRenderData("FF00FF", "活动内容"));
					add(new TextRenderData("FF00FF", "活动时间或次数"));
					add(new TextRenderData("FF00FF", "在成都唱歌在成都唱歌在成都唱歌在成都唱歌在成都唱歌;2"));
					add(new TextRenderData("FF00FF", "在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌;3"));
				}}));
//				//本地图片byte数据
//				put("localBytePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getLocalByteArray(new File("src/test/resources/logo.png"))));
//				//网路图片 
//				put("urlPicture", new PictureRenderData(100, 100, ".png", BytePictureUtils.getUrlByteArray("https://avatars3.githubusercontent.com/u/1394854?v=3&s=40")));
//				// java 图片
//				put("bufferImagePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getBufferByteArray(bufferImage)));
			}
		};

		XWPFTemplate template = XWPFTemplate.compile(模版文件目录+"/aaaa.docx")
				.render(datas);
//		XWPFTemplate template = XWPFTemplate.compile("/opt/gzkgfiles/template/evaluate/qarchive.docx")
//				.render(datas);
		FileOutputStream out;
		try {
			out = new FileOutputStream(输出路径+"/out_picture1.docx");
			template.write(out);
			out.flush();
			out.close();
			template.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
    }




模版如下图:






输出结果如下:





Java中,Apache POI-TL (POI Templates Library) 是一个库,它允许你处理Microsoft Office Word文档模板,并将数据填充到其中,包括插入文本、表格和图表。例如,你可以创建一个柱状图(Histogram)并将其插入Word文档。 1. **插入文本**:使用`HSSFSheet`(对于Excel)或`XWPFDocument`(对于Word)中的`createRow()`方法创建新行,然后通过`cell.setCellValue()`设置单元格的文本内容。 ```java HSSFRow row = ws.createRow(0); // ws是工作表对象 HSSFCell cell = row.createCell(0); cell.setCellValue("Hello World"); ``` 2. **插入表格**:首先创建一个新的表格,然后添加行和列: ```java HSSFSheet sheet = wb.createSheet(); // wb是工作簿对象 Table table = new Table(3, 4); // 3行4列的表格 for (int r = 0; r < table.getRows().size(); r++) { for (int c = 0; c < table.getColumns().size(); c++) { HSSFRow newRow = sheet.getRow(r); if (newRow == null) { newRow = sheet.createRow(r); } HSSFCell cell = newRow.createCell(c); cell.setCellValue(""); table.addCell(cell); } } sheet.addTable(table); ``` 3. **插入柱状图**(假设使用JFreeChart生成图表后转换为图片):先生成图表,然后将其保存为图片,最后在Word中插入图片。这里仅提供基本思路,实际操作需要结合第三方库如jai-xml等: ```java // 生成柱状图 JFreeChart chart = createBarChart(); BufferedImage image = ChartUtilities.getImageFromChartAsBufferedImage(chart); // 将图片转换为字节数组 byte[] chartImageBytes = ImageIO.write(image, "jpg", new ByteArrayOutputStream()); // 在Word中插入图片 XWPFRun run = document.createParagraph().addNewTextRun(); run.setText("Your chart goes here:"); run.setPic(new XWPFPictureData(doc, chartImageBytes)); ```
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值