Freemarker的使用方法
freemarkerjar
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
word转换为ftl
保存word为xml格式
将xml格式转为ftl。
Freemarker模板语法
1. 访问属性 ===》${name}
2. 访问对象===》${user.name}
3. 访问list集合:
<#list studentList as student> </#list>
集合下标:
<#list studentList as student>
${student_index}
</#list>
4. 判断:
<#if student ??>
student不为空
<#else>
student为空
</#if>
集合判断
<#if (deviceMap?size>0)></#if>
5.map遍历:
<#list sparePartsMap?keys as key>
<#assign Items=sparePartsMap[key]>
<#list Items as Item>
</#list>
</#list>
6.截取字符串长度:
<#if name?length lt 7>
<#else>
${name[0..6]}
</#if>
7.时间格式化:
时间戳日期==》 ${time?number_to_datetime}
时间戳乘1000===》${time?number*1000}
日期格式化:
${dateTime?string('yyyy-MM-dd hh:mm:ss')} 格式化为: 2022-11-12 15:03:22
8.取小数点:
${num?string(',###.##')} 保留小数点后两位 1233422.23
${num?string('0000.00')} 整数部分不足三位,前面用0补齐. 0123.20
实例:
// 图片
String path = "C:/home/itsm/upload/week/png"; //TODO 测试
//TODO 运维类别 饼图
DefaultPieDataset dataset_yw_type_task = new DefaultPieDataset();
for (CensusCountVO censusCountVO : taskTypeList) {
dataset_yw_type_task.setValue(censusCountVO.getName(), Double.parseDouble(censusCountVO.getData()));
}
String image_userId_1_unitId = "image_" + SecureUtil.getUser().getUserId() + "_1_" + customerId; // 图片1名称 =image_本人id_1_查询单位id
// 图片1路径
String image_1_dir = JFreeChartUtil.createAndGenerateWeeklyPiechart(dataset_yw_type_task, "运维类别", 650, 300, path,image_userId_1_unitId);
// 图片1
String image_1 = JFreeChartUtil.getImageStr(image_1_dir);
Map<String, Object> beanParams = new HashMap<String, Object>();
beanParams.put("ywTaskList", ywTaskList);
beanParams.put("workList", workList);
beanParams.put("image_1", image_1); // 图片3-硬件维护柱状图
//word导出
String templateFile = "demo.ftl";
String templateDir = "文件路径;
WordExportUtil.writeResponse(request, response, WordExportUtil.WORD_2003, docFileName, templateDir, templateFile, beanParams);
工具类
public class JFreeChartUtil {
/**
* 创建并生成 周报-备件更换-饼形图
* @param dataset 饼状图数据
* @param title 标题
* @param width 图片宽度
* @param height 图片高度
* @param destPath 目的地-路径
* @param imgName 图片名称 如:mybook-pie
* @return 返回图片全路径
*/
public static String createAndGenerateWeeklyPiechart(PieDataset dataset, String title, int width, int height, String destPath, String imgName) {
// step1:创建数据集对象 , 取得数据
// step2:创建图
JFreeChart chart = createWeeklyPieChart(dataset, title);
// step3: 输出PNG图表到磁盘
drawPNGToOutputStream(destPath + "//" + imgName +".png", chart, width, height);
// 返回图片全路径
return destPath + "//" + imgName + ".png";
}
/**
* 获得图片的Base64编码
* @param imgFile 图片文件路径
* @return
* @author
*/
public static String getImageStr(String imgFile) {
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
} catch (FileNotFoundException e) {
log.error("加载图片未找到", e);
e.printStackTrace();
}
try {
data = new byte[in.available()];
//注:FileInputStream.available()方法可以从输入流中阻断由下一个方法调用这个输入流中读取的剩余字节数
in.read(data);
in.close();
} catch (IOException e) {
log.error("IO操作图片错误", e);
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
}
public class WordExportUtil {
public static String WORD_2007 = "WORD_2007";
public static String WORD_2003 = "WORD_2003";
/**
* word导出
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param version Word_2003/Word_2007
* @param docFileName 生成的doc文件名
* @param templateDir freemark模板文件路径
* @param templateFile freemark模板文件名
* @param beanParams 入参数据: Map<String, Object>类型
*/
public static void writeResponse( HttpServletRequest request, HttpServletResponse response, String version, String docFileName, String templateDir, String templateFile, Map<String, Object> beanParams) {
writeResponse(request, response, version, "temp", docFileName, templateDir, templateFile, beanParams);
}
/**
* word写入模板文件并输出文件到response
* @param request HttpServletRequest
* @param response HttpServletResponse
* @param version Word_2003/Word_2007
* @param docFileTempDir 生成的doc文件暂存目录
* @param docFileName 生成的doc文件名
* @param templateDir 存放freemark模板的目录
* @param templateFile freemark模板文件名
* @param beanParams 入参数据: Map<String, Object>类型
*/
public static void writeResponse(HttpServletRequest request, HttpServletResponse response, String version, String docFileTempDir, String docFileName, String templateDir, String templateFile, Map<String, Object> beanParams) {
Configuration config = new Configuration();
InputStream is = null;
File previewFile = null;
try {
config.setDirectoryForTemplateLoading(new File(templateDir));
config.setObjectWrapper(new DefaultObjectWrapper());
Template template = config.getTemplate(templateFile, "UTF-8");
if (WORD_2007.equals(version)) {
docFileName = docFileName + ".docx";
} else {
docFileName = docFileName + ".doc";
}
String docName = templateDir+"//" + docFileName;
// String docName =FileUploadUtils.getUploadAddress()+docFileName;
FileOutputStream fos = new FileOutputStream(docName);
Writer out = new OutputStreamWriter(fos, "UTF-8");
template.process(beanParams, out);
out.flush();
out.close();
previewFile = new File(docName);
is = new FileInputStream(previewFile);
response.reset();
if (WORD_2007.equals(version)) {
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=UTF-8");
}else{
response.setContentType("application/vnd.ms-word;charset=UTF-8");
}
String agent = request.getHeader("USER-AGENT");
if(null != agent && -1 != agent.indexOf("MSIE")){//IE
docFileName = java.net.URLEncoder.encode(docFileName,"UTF-8");
}else if(null != agent && -1 != agent.indexOf("Mozilla")){
docFileName = new String (docFileName.getBytes("UTF-8"),"iso-8859-1");
}else{
docFileName = java.net.URLEncoder.encode(docFileName,"UTF-8");
}
response.addHeader("Content-Disposition", "attachment;filename="+docFileName);
byte[] b = new byte[1024];
int len;
while ((len=is.read(b)) >0) {
response.getOutputStream().write(b,0,len);
}
response.getOutputStream().flush();
response.getOutputStream().close();
} catch (ParseException e) {
log.error("解析模板出错,请检查模板格式", e);
e.printStackTrace();
} catch (IOException e) {
log.error("IO读取失败", e);
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}finally{
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(previewFile!=null){
previewFile.delete();
}
}
}
}