营销型网站的特征,学习建站的网站,公司代运营,海口自助建站系统邮件发送表格 问题导入效果图 实现方案1. 拼接HTML文件#xff08;不推荐#xff09;2. excel 转HTML使用工具类来转化依赖工具类代码示例 使用已工具包 如 aspose-cells依赖代码示例 3.使用模板生成流程准备模板工具类代码示例 问题导入
在一些定时任务中#xff0c;经常会… 邮件发送表格 问题导入效果图 实现方案1. 拼接HTML文件不推荐2. excel 转HTML使用工具类来转化依赖工具类代码示例 使用已工具包 如 aspose-cells依赖代码示例 3.使用模板生成流程准备模板工具类代码示例 问题导入
在一些定时任务中经常会出现发送邮件的需求。最近本人就碰上一个发送邮件表格而不是作为附件发送的需求。
效果图 这种效果实际上是在邮件正文里面填入HTML语言来实现的 。
实现方案
在网上搜索后我发现了有三中普遍的实现方式。
1. 拼接HTML文件不推荐
这种方案类似于写html文件一样写出来。只适合非常简单的表格。拼接和填充数据都需要自己手写。 代码大概是这样子。
StringBuilder content new StringBuilder(htmlhead/headbody);content.append(table border\1\ style\width:1000px; height:150px;border:solid 1px #E8F2F9;font-size14px;font-size:18px;\);content.append(tr style\background-color: #428BCA; color:#ffffff\td rowspan\3\交易时间/td td colspan\4\实名认证/td);content.append(tr td colspan\2\支付中心/td td colspan\2\业务线/td /tr);content.append(trtd笔数/tdtd金额/tdtd笔数/tdtd金额/td/tr);content.append(tr tdspan20201118/span/td tdspan0/span/td tdspan0.00/span/td tdspan0/span/td tdspan0.00/span/td /tr);content.append(/table);content.append(h3对账无误/h3);content.append(/body/html); 引用的他人的代码片段。不想手写 o(╥﹏╥)o 效果
2. excel 转HTML
这种方案巧妙的避开了生成html文件的繁琐。避重就轻直接操作更容易实现的excel来生成html代码。
使用工具类来转化
依赖
dependencygroupIdorg.apache.poi/groupIdartifactIdpoi/artifactIdversion4.1.2/version
/dependencydependencygroupIdorg.apache.poi/groupIdartifactIdpoi-ooxml/artifactIdversion4.1.2/version
/dependencydependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.11.0/version
/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-compress/artifactIdversion1.18/version
/dependencydependencygroupIdorg.apache.xmlbeans/groupIdartifactIdxmlbeans/artifactIdversion3.1.0/version
/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-collections4/artifactIdversion4.4/version
/dependencydependencygroupIdorg.apache.poi/groupIdartifactIdpoi-ooxml-schemas/artifactIdversion4.1.2/version
/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-compress/artifactIdversion1.21/version
/dependency
工具类
import org.apache.commons.io.FileUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.*;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;public class Excel2HtmlUtil {/**** param filePath excel源文件文件的路径* param htmlPositon 生成的html文件的路径* param isWithStyle 是否需要表格样式 包含 字体 颜色 边框 对齐方式* throws Exception**/public static String readExcelToHtml(String filePath, String htmlPositon, boolean isWithStyle,String type,String attname) throws Exception {InputStream is null;String htmlExcel null;MapString,String stylemap new HashMapString,String();try {if(csv.equalsIgnoreCase(type)) {htmlExcel getCSVInfo(filePath,htmlPositon);writeFile1(htmlExcel, htmlPositon,stylemap,attname);}else {File sourcefile new File(filePath);is new FileInputStream(sourcefile);Workbook wb WorkbookFactory.create(is);if (wb instanceof XSSFWorkbook) { // 03版excel处理方法XSSFWorkbook xWb (XSSFWorkbook) wb;htmlExcel getExcelInfo(xWb, isWithStyle,stylemap);} else if (wb instanceof HSSFWorkbook) { // 07及10版以后的excel处理方法HSSFWorkbook hWb (HSSFWorkbook) wb;htmlExcel getExcelInfo(hWb, isWithStyle,stylemap);}writeFile(htmlExcel, htmlPositon,stylemap,attname);}} catch (Exception e) {System.out.println(文件被损坏或不能打开无法预览);//throw new Exception(文件被损坏或不能打开无法预览);} finally {try {if(is!null)is.close();} catch (IOException e) {e.printStackTrace();}}return htmlPositon;}private static void getcscvvalue(BufferedReader reader,List col,String oldvalue,List list) {String line null;try {while((linereader.readLine())!null){String[] item line.split(,,-1);boolean isbreak false;for(int i0;iitem.length;i) {String value item[i];if(value.endsWith(\)) {value oldvaluevalue;col.add(value);}else if(item.length1) {value oldvaluevalue;getcscvvalue(reader,col,value,list);isbreak true;}else if(value.startsWith(\)){getcscvvalue(reader,col,value,list);isbreak true;}else {col.add(value);}}if(!isbreak) {list.add(col);col new ArrayList();}}} catch (IOException e) {}}private static String getCSVInfo(String filePath,String htmlPositon) {StringBuffer sb new StringBuffer();DataInputStream in null;try {innew DataInputStream(new FileInputStream(filePath));BufferedReader readernew BufferedReader(new InputStreamReader(in));//reader.readLine();String line null;List list new ArrayList();while((linereader.readLine())!null){String[] item line.split(,);List col new ArrayList();for(int i0;iitem.length;i) {String value item[i];if(value.startsWith(\)) {getcscvvalue(reader,col,value,list);}else {col.add(value);}}list.add(col);}sb.append(table);for(int i0;ilist.size();i) {List col (List) list.get(i);if(colnull||col.size()0) {sb.append(trtd /td/tr);}sb.append(tr);for(int j0;jcol.size();j) {String value (String) col.get(j);if (value null||.equals(value)) {sb.append(td /td);continue;}else {sb.append(tdvalue/td);}}sb.append(/tr);}sb.append(/table);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {in.close();} catch (IOException e) {e.printStackTrace();}}return sb.toString();}//读取excel文件返回转换后的html字符串private static String getExcelInfo(Workbook wb, boolean isWithStyle, MapString,String stylemap) {StringBuffer sb new StringBuffer();StringBuffer ulsb new StringBuffer();ulsb.append(ul);int num wb.getNumberOfSheets();//遍历excel文件里的每一个sheetfor(int i0;inum;i) {Sheet sheet wb.getSheetAt(i);// 获取第i个Sheet的内容String sheetName sheet.getSheetName();if(i0) {ulsb.append(li idli_i classcur οnclickchangetab(i)sheetName/li);}else {ulsb.append(li idli_i οnclickchangetab(i)sheetName/li);}int lastRowNum sheet.getLastRowNum();MapString, String map[] getRowSpanColSpanMap(sheet);MapString, String map1[] getRowSpanColSpanMap(sheet);sb.append(table idtable_i );if(i0) {sb.append(classblock);}sb.append();Row row null; // 兼容Cell cell null; // 兼容int maxRowNum 0;int maxColNum 0;//遍历每一行for (int rowNum sheet.getFirstRowNum(); rowNum lastRowNum; rowNum) {row sheet.getRow(rowNum);if (row null) {continue;}int lastColNum row.getLastCellNum();for (int colNum 0; colNum lastColNum; colNum) {cell row.getCell(colNum);if (cell null) { // 特殊情况 空白的单元格会返回nullcontinue;}String stringValue getCellValue1(cell);if (map1[0].containsKey(rowNum , colNum)) {map1[0].remove(rowNum , colNum);if(maxRowNumrowNum) {maxRowNum rowNum;}if(maxColNumcolNum) {maxColNum colNum;}} else if (map1[1].containsKey(rowNum , colNum)) {map1[1].remove(rowNum , colNum);if(maxRowNumrowNum) {maxRowNum rowNum;}if(maxColNumcolNum) {maxColNum colNum;}continue;}if (stringValue null || .equals(stringValue.trim())) {continue;}else {if(maxRowNumrowNum) {maxRowNum rowNum;}if(maxColNumcolNum) {maxColNum colNum;}}}}for (int rowNum sheet.getFirstRowNum(); rowNum maxRowNum; rowNum) {row sheet.getRow(rowNum);if (row null) {sb.append(trtd /td/tr);continue;}sb.append(tr);int lastColNum row.getLastCellNum();for (int colNum 0; colNum maxColNum; colNum) {cell row.getCell(colNum);if (cell null) { // 特殊情况 空白的单元格会返回nullsb.append(td /td);continue;}String stringValue getCellValue(cell);if (map[0].containsKey(rowNum , colNum)) {String pointString map[0].get(rowNum , colNum);map[0].remove(rowNum , colNum);int bottomeRow Integer.valueOf(pointString.split(,)[0]);int bottomeCol Integer.valueOf(pointString.split(,)[1]);int rowSpan bottomeRow - rowNum 1;int colSpan bottomeCol - colNum 1;sb.append(td rowspan rowSpan colspan colSpan );} else if (map[1].containsKey(rowNum , colNum)) {map[1].remove(rowNum , colNum);continue;} else {sb.append(td );}// 判断是否需要样式if (isWithStyle) {dealExcelStyle(wb, sheet, cell, sb,stylemap);// 处理单元格样式}sb.append(nobr);//如果单元格为空要判断该单元格是不是通过其他单元格计算得到的if (stringValue null || .equals(stringValue.trim())) {FormulaEvaluator evaluator wb.getCreationHelper().createFormulaEvaluator();if (evaluator.evaluate(cell) ! null) {//如果单元格的值是通过其他单元格计算来的则通过单元格计算获取String cellnumber evaluator.evaluate(cell).getNumberValue() ;//如果单元格的值是小数保留两位if (null ! cellnumber cellnumber.contains(.)) {String[] decimal cellnumber.split(\\.);if (decimal[1].length() 2) {int num1 decimal[1].charAt(0) - 0;int num2 decimal[1].charAt(1) - 0;int num3 decimal[1].charAt(2) - 0;if (num3 9) {num2 0;} else if (num3 5) {num2 num2 1;}cellnumber decimal[0] . num1 num2;}}stringValue cellnumber;}sb.append(stringValue.replace(String.valueOf((char) 160), ));} else {// 将ascii码为160的空格转换为html下的空格 sb.append(stringValue.replace(String.valueOf((char) 160), ));}sb.append(/nobr/td);}sb.append(/tr);}sb.append(/table);}ulsb.append(/ul);return ulsb.toString()sb.toString();}private static MapString, String[] getRowSpanColSpanMap(Sheet sheet) {MapString, String map0 new HashMapString, String();MapString, String map1 new HashMapString, String();int mergedNum sheet.getNumMergedRegions();CellRangeAddress range null;for (int i 0; i mergedNum; i) {range sheet.getMergedRegion(i);int topRow range.getFirstRow();int topCol range.getFirstColumn();int bottomRow range.getLastRow();int bottomCol range.getLastColumn();map0.put(topRow , topCol, bottomRow , bottomCol);// System.out.println(topRow , topCol , bottomRow , // bottomCol);int tempRow topRow;while (tempRow bottomRow) {int tempCol topCol;while (tempCol bottomCol) {map1.put(tempRow , tempCol, );tempCol;}tempRow;}map1.remove(topRow , topCol);}Map[] map { map0, map1 };return map;}private static String getCellValue1(Cell cell) {String result new String();switch (cell.getCellType()) {case NUMERIC:// 数字类型result 1;break;case STRING:// String类型result 1;break;case BLANK:result ;break;default:result ;break;}return result;}/*** 获取表格单元格Cell内容** param cell* return*/private static String getCellValue(Cell cell) {String result new String();switch (cell.getCellType()) {case NUMERIC:// 数字类型if (DateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式SimpleDateFormat sdf null;if (cell.getCellStyle().getDataFormat() HSSFDataFormat.getBuiltinFormat(h:mm)) {sdf new SimpleDateFormat(HH:mm);} else {// 日期sdf new SimpleDateFormat(yyyy-MM-dd);}Date date cell.getDateCellValue();result sdf.format(date);} else if (cell.getCellStyle().getDataFormat() 58) {// 处理自定义日期格式m月d日(通过判断单元格的格式id解决id的值是58)SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd);double value cell.getNumericCellValue();Date date org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);result sdf.format(date);} else {double value cell.getNumericCellValue();CellStyle style cell.getCellStyle();DecimalFormat format new DecimalFormat();String temp style.getDataFormatString();// 单元格设置成常规if (temp.equals(General)) {format.applyPattern(#);}result format.format(value);}break;case STRING:// String类型result cell.getRichStringCellValue().toString();break;case BLANK:result ;break;default:result ;break;}return result;}/*** 处理表格样式** param wb* param sheet* param sb*/private static void dealExcelStyle(Workbook wb, Sheet sheet, Cell cell, StringBuffer sb,MapString,String stylemap) {CellStyle cellStyle cell.getCellStyle();if (cellStyle ! null) {HorizontalAlignment alignment cellStyle.getAlignment();// sb.append(align convertAlignToHtml(alignment) );//单元格内容的水平对齐方式VerticalAlignment verticalAlignment cellStyle.getVerticalAlignment();String _style vertical-align:convertVerticalAlignToHtml(verticalAlignment);;if (wb instanceof XSSFWorkbook) {XSSFFont xf ((XSSFCellStyle) cellStyle).getFont();//short boldWeight xf.getBoldweight();short boldWeight 400;String align convertAlignToHtml(alignment);int columnWidth sheet.getColumnWidth(cell.getColumnIndex());_style font-weight: boldWeight ;font-size: xf.getFontHeight() / 2 %;width: columnWidth px;text-align: align ;;XSSFColor xc xf.getXSSFColor();if (xc ! null !.equals(xc)) {_style color:# xc.getARGBHex().substring(2) ;;}XSSFColor bgColor (XSSFColor) cellStyle.getFillForegroundColorColor();if (bgColor ! null !.equals(bgColor)) {_style background-color:# bgColor.getARGBHex().substring(2) ;; // 背景颜色}_style getBorderStyle(0, cellStyle.getBorderTop().getCode(),((XSSFCellStyle) cellStyle).getTopBorderXSSFColor());_style getBorderStyle(1, cellStyle.getBorderRight().getCode(),((XSSFCellStyle) cellStyle).getRightBorderXSSFColor());_style getBorderStyle(2, cellStyle.getBorderBottom().getCode(),((XSSFCellStyle) cellStyle).getBottomBorderXSSFColor());_style getBorderStyle(3, cellStyle.getBorderLeft().getCode(),((XSSFCellStyle) cellStyle).getLeftBorderXSSFColor());} else if (wb instanceof HSSFWorkbook) {HSSFFont hf ((HSSFCellStyle) cellStyle).getFont(wb);short boldWeight hf.getFontHeight();short fontColor hf.getColor();HSSFPalette palette ((HSSFWorkbook) wb).getCustomPalette(); // 类HSSFPalette用于求的颜色的国际标准形式HSSFColor hc palette.getColor(fontColor);String align convertAlignToHtml(alignment);int columnWidth sheet.getColumnWidth(cell.getColumnIndex());_style font-weight: boldWeight ;font-size: hf.getFontHeight() / 2 %;text-align: align ;width: columnWidth px;;String fontColorStr convertToStardColor(hc);if (fontColorStr ! null !.equals(fontColorStr.trim())) {_style color: fontColorStr ;; // 字体颜色}short bgColor cellStyle.getFillForegroundColor();hc palette.getColor(bgColor);String bgColorStr convertToStardColor(hc);if (bgColorStr ! null !.equals(bgColorStr.trim())) {_style background-color: bgColorStr ;; // 背景颜色}_style getBorderStyle(palette, 0, cellStyle.getBorderTop().getCode(), cellStyle.getTopBorderColor());_style getBorderStyle(palette, 1, cellStyle.getBorderRight().getCode(), cellStyle.getRightBorderColor());_style getBorderStyle(palette, 3, cellStyle.getBorderLeft().getCode(), cellStyle.getLeftBorderColor());_style getBorderStyle(palette, 2, cellStyle.getBorderBottom().getCode(), cellStyle.getBottomBorderColor());}String calssname;if(!stylemap.containsKey(_style)) {int count stylemap.size();calssname tdcount;stylemap.put(_style, calssname);}else {calssname stylemap.get(_style);}if(!.equals(calssname)) {sb.append(classcalssname);}}}/*** 单元格内容的水平对齐方式** param alignment* return*/private static String convertAlignToHtml(HorizontalAlignment alignment) {String align center;switch (alignment) {case LEFT:align left;break;case CENTER:align center;break;case RIGHT:align right;break;default:break;}return align;}/*** 单元格中内容的垂直排列方式** param verticalAlignment* return*/private static String convertVerticalAlignToHtml(VerticalAlignment verticalAlignment) {String valign middle;switch (verticalAlignment) {case BOTTOM:valign bottom;break;case CENTER:valign middle;break;case TOP:valign top;break;default:break;}return valign;}private static String convertToStardColor(HSSFColor hc) {StringBuffer sb new StringBuffer();if (hc ! null) {if (HSSFColor.HSSFColorPredefined.AUTOMATIC.getIndex() hc.getIndex()) {return null;}sb.append(#);for (int i 0; i hc.getTriplet().length; i) {sb.append(fillWithZero(Integer.toHexString(hc.getTriplet()[i])));}}return sb.toString();}private static String fillWithZero(String str) {if (str ! null str.length() 2) {return 0 str;}return str;}static String[] bordesr { border-top:, border-right:, border-bottom:, border-left: };static String[] borderStyles { solid , solid , solid , solid , solid , solid , solid , solid ,solid , solid, solid, solid, solid, solid };private static String getBorderStyle(HSSFPalette palette, int b, short s, short t) {if (s 0)return bordesr[b] borderStyles[s] #d0d7e5 1px;;String borderColorStr convertToStardColor(palette.getColor(t));borderColorStr borderColorStr null || borderColorStr.length() 1 ? #000000 : borderColorStr;return bordesr[b] borderStyles[s] borderColorStr 1px;;}private static String getBorderStyle(int b, short s, XSSFColor xc) {if (s 0)return bordesr[b] borderStyles[s] #d0d7e5 1px;;if (xc ! null !.equals(xc)) {String borderColorStr xc.getARGBHex();// t.getARGBHex();borderColorStr borderColorStr null || borderColorStr.length() 1 ? #000000: borderColorStr.substring(2);return bordesr[b] borderStyles[s] borderColorStr 1px;;}return ;}/** param content 生成的excel表格标签** param htmlPath 生成的html文件地址*/private static void writeFile(String content, String htmlPath, MapString,String stylemap,String name) {File file2 new File(htmlPath);StringBuilder sb new StringBuilder();try {file2.createNewFile();// 创建文件sb.append(htmlheadmeta http-equiv\Content-Type\ content\text/html; charsetutf-8\titlename/titlestyle type\text/css\);sb.append(ul{list-style: none;max-width: calc(100%);padding: 0px;margin: 0px;overflow-x: scroll;white-space: nowrap;} ul li{padding: 3px 5px;display: inline-block;border-right: 1px solid #768893;} ul li.cur{color: #F59C25;} table{border-collapse:collapse;display:none;width:100%;} table.block{display: block;});for(Map.EntryString, String entry : stylemap.entrySet()){String mapKey entry.getKey();String mapValue entry.getValue();sb.append( .mapValue{mapKey});}sb.append(/stylescript);sb.append(function changetab(i){var block document.getElementsByClassName(\block\);block[0].className block[0].className.replace(\block\,\\);var cur document.getElementsByClassName(\cur\);cur[0].className cur[0].className.replace(\cur\,\\);var curli document.getElementById(\li_\i);curli.className cur;var curtable document.getElementById(\table_\i);curtable.className block;});sb.append(/script/headbody);sb.append(div);sb.append(content);sb.append(/div);sb.append(/body/html);FileUtils.write(file2, sb.toString(),UTF-8);} catch (IOException e) {e.printStackTrace();}}private static void writeFile1(String content, String htmlPath, MapString,String stylemap,String name) {File file2 new File(htmlPath);StringBuilder sb new StringBuilder();try {file2.createNewFile();// 创建文件sb.append(htmlheadmeta http-equiv\Content-Type\ content\text/html; charsetutf-8\titlename/titlestyle type\text/css\);sb.append(ul{list-style: none;max-width: calc(100%);padding: 0px;margin: 0px;overflow-x: scroll;white-space: nowrap;} ul li{padding: 3px 5px;display: inline-block;border-right: 1px solid #768893;} ul li.cur{color: #F59C25;} table{border-collapse:collapse;width:100%;} td{border: solid #000000 1px; min-width: 200px;});sb.append(/style/headbody);sb.append(div);sb.append(content);sb.append(/div);sb.append(/body/html);FileUtils.write(file2, sb.toString(),UTF-8);} catch (IOException e) {e.printStackTrace();}}}代码示例 public static void main(String[] args) {String sourcepath D:\\myExcel.xlsx;String htmlPositon D:\\测试.html;Excel2HtmlUtil.readExcelToHtml(sourcepath, htmlPositon, true, xlsx, 测试);}使用已工具包 如 aspose-cells
依赖
repositoryidAsposeJavaAPI/idnameAspose Java API/nameurlhttps://repository.aspose.com/repo//url
/repositorydependencygroupIdcom.aspose/groupIdartifactIdaspose-cells/artifactIdversion20.11/version
/dependency
代码示例
使用 Aspose.Cells 将 Excel 转换为 HTML 非常简单。只需加载 Excel 电子表格并将其保存为 HTML 文件。以下是将 Excel XLSX 文件转换为 HTML 的步骤。
使用 Workbook 类加载 XLSX 文件。使用 Workbook.Save(String) 方法以 .html 扩展名保存文件。
以下代码示例展示了如何使用 Java 将 Excel 文件转换为 HTML。
// 加载 Excel 文件
Workbook workbook new Workbook(workbook.xlsx);// 另存为 Excel XLSX 文件
workbook.save(Excel-to-HTML.html); 3.使用模板生成
流程
1、准备模板这里是以Excel转html为模板2、处理模板及对模板填充内容的工具类3、修改发送邮件的代码准备模板
用excel 画一个所需表格模板 找一个在线 excel 转html 网站 如我用的是Table在线布局工具Excel转HTML 下载后修改后缀名为.ftl
然后使用文本编辑器稍作修改。
tbodytr height26 td colspan2 classet23统计周期/td td colspan5 classet10/td /tr tr height26 td colspan2 classet10合作方/td td colspan2 classet6微信/td td colspan3 classet6支付宝/td /tr tr height26 td rowspan7 classet10放款/td td classet11申请笔数/td td colspan2 classet6/td td colspan3 classet6/td /tr tr height26 td classet11通过笔数/td td colspan2 classet6/td td colspan3 classet6/td /tr tr height26 td classet11拒绝笔数/td td colspan2 classet6/td td colspan3 classet6/td /tr tr height19 td rowspan4 classet11拒绝原因枚举/td td colspan2 rowspan4 classet6${data.apay.msg}/td td colspan3 rowspan4 classet6${data.bpay.msg}/td /tr tr height19 /tr tr height19 /tr tr height18 /tr tr td classet2 rowspan${data.maxLength1} 放款/td td classet8放款计划/td td classet15笔数/td td classet16金额/td td classet8放款计划/td td classet15笔数/td td classet16金额/td /tr #list 0..(data.maxLength - 1) as itr#if data.maxLength ! 0td classet7${data.apay.apayLoanInfoList[i].a!}/tdtd classet15${data.apay.apayLoanInfoList[i].b!}/tdtd classet14${data.apay.apayLoanInfoList[i].c!}/tdtd classet7${data.bpay.bpayLoanInfoList[i].a!}/tdtd classet16${data.bpay.bpayLoanInfoList[i].b!}/tdtd classet14${data.bpay.bpayLoanInfoList[i].c!}/td/#if #if data.maxLength 0td classet7 /tdtd classet15/tdtd classet14/tdtd classet7 /tdtd classet16/tdtd classet14/td/#if /tr/#list/tbody工具类
package com.ajc.module.mail.util;import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import com.xxl.job.core.util.FileUtil;
import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;public class GenerateHtmlContextUtilT {/*** 本地临时地址*/private static String TEMP_PATCH;/*** ftl模板地址*/private static String TEMPLATE_FTL_PATH;/*** 是否需要删除临时生成的html文件*/private Boolean NEED_DELETE_HTML true;private T data;private static Configuration CONFIG new Configuration(Configuration.getVersion());public final static String SUFFIX_FTL .ftl;public final static String SUFFIX_HTML .html;/*** 设置模板地址和临时文件地址* param uploadPatch* param templateFtlPath* param needDeleteHtml 是否需要删除生成的 html文件*/public GenerateHtmlContextUtil(String uploadPatch,String templateFtlPath,boolean needDeleteHtml) {TEMP_PATCH uploadPatch;TEMPLATE_FTL_PATH templateFtlPath;NEED_DELETE_HTML needDeleteHtml;}/*** 构建静态html*** description:* author: liuql* date: 2024/4/8 * param fileName 不包括后缀名 * */public void buildStaticHtml(T data, String fileName) throws Exception {MapString, Object map new HashMap(32);map.put(templateFtlPath, TEMPLATE_FTL_PATH);map.put(name, fileName);map.put(data, data);/// 放入文件后缀名map.put(suffix, SUFFIX_HTML);/// 生成静态htmlwriterStaticFile(map);}/*** 页面静态化方法** param map 页面元素* throws Exception*/public void writerStaticFile(MapString, Object map) throws Exception {//静态化File file new File(TEMPLATE_FTL_PATH);File parentDirectory file.getParentFile();CONFIG.setTemplateExceptionHandler(TemplateExceptionHandler.HTML_DEBUG_HANDLER);FileTemplateLoader templateLoadernew FileTemplateLoader(new File(parentDirectory.getAbsolutePath()));CONFIG.setTemplateLoader(templateLoader);//获取模板Template temple CONFIG.getTemplate(file.getName());//生成最终页面并写到文件Writer out new OutputStreamWriter(new FileOutputStream(TEMP_PATCH File.separator map.get(name) map.get(suffix)));try {//处理temple.process(map, out);} catch (TemplateException e) {e.printStackTrace();} finally {out.close();}}/*** 读取静态html页面** param fileName 名称* return staticHtml.toString() 静态页面html字符串*/public String generateStaticHtml(String fileName) {StringBuilder staticHtml new StringBuilder(2048);try {FileReader fr new FileReader(TEMP_PATCH File.separator fileName SUFFIX_HTML );BufferedReader br new BufferedReader(fr);String content ;while ((content br.readLine()) ! null) {staticHtml.append(content);}} catch (Exception e) {return ;}if (NEED_DELETE_HTML){FileUtil.deleteFile(TEMP_PATCH File.separator fileName SUFFIX_HTML);}return staticHtml.toString();}
}
代码示例 GenerateHtmlContextUtilMapString ,Object generateHtmlContextUtil new GenerateHtmlContextUtil(tempPath,templateFtlPath,false);
// hhh 是临时生成的 html文件名
generateHtmlContextUtil.buildStaticHtml(dataMap,hhh);
String htmlString generateHtmlContextUtil.generateStaticHtml(hhh).toString();dataMap 的结构 这里要非常小心如果字段取不到是会报错的。