package com.zjrs.appcomm.template.word;

import com.zjrs.appcomm.template.word.builder.ExportDefinition;
import com.zjrs.appcomm.template.word.util.POIUtil;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

/**
 * 操作Word的工具，目前仅仅包括导出Word功能，且需要配置word模板
 * 
 * <p>
 * 范例：
 * <blockquote><pre>
 * DExample dData = new DExample();
 * ExportDefinition<DExample> exportDefinition = ExportDefinition.builder(DExample.class)
 * 		.document(?)
 * 		.data(dData) // 注入数据
 * 		.build();
 * byte[] b = wordTemplate.exportFile(exportDefinition);
 * </pre></blockquote><p>
 * 配置word模板方法：<br />
 * 1.在需要填充离散数据的位置通过${fieldName}方式配置，如注入的数据中存在getName获取数据的方法，则word模板中适当位置填写${name}；<br />
 * 2.在列表中需要填充列表的位置通过${parentName:item.childName}方式配置（模板中只需要保留一行模板即可），如注入的数据中存在getList方法获取列表数据，且其内存在getName获取数据的方法，则word模板中适当位置填写${list:item.name}；<br />
 * 3.在非列表中需要填充列表的位置通过${parentName:item.childName}方式配置（模板中需要在需要重复的位置前增加${parentName:begin}占位符，在需要重复的位置后增加${parentName:end}占位符），如注入的数据中存在getList方法获取列表数据，且其内存在getName获取数据的方法，则word模板中适当位置填写${list:item.name}；<br />
 * 4.在需要填充图片的位置通过${fieldName}方式配置其图片对象名称，注入数据必须是byte[]类型的图片内容（目前仅仅支持png和jpg类型图片）。
 * @author froms
 *
 */
public class WordTemplate {

	public <E> void fillFile(ExportDefinition<E> exportDefinition) {
		POIUtil.handleDocument(exportDefinition.getDocument(), exportDefinition.getData());
	}
	
	public <E> byte[] exportFile(ExportDefinition<E> exportDefinition) throws IOException {
		fillFile(exportDefinition);
		try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
			exportDefinition.getDocument().write(os);
			return os.toByteArray();
		}
	}
}
