- 将原始的, 用户给过来的 origin.docx 另存为 xml格式 生成origin.xml
- 用https://tool.oschina.net/codeformat/xml 将xml格式化, 便于修改
- 定位到要替换的变量
- 将origin.xml 改名为 origin.ftl
Over
模板制作完毕,代码里用就可以了
这样做有一个巨大的好处是, docx是用户给的,他需要考虑所有情况,包括字段过长自动扩展列的高度等等所有问题.
开发只需要替换变量就行了.
将处理word格式这个无底洞给了用户, 而且这个也一般是付钱找人设计的.专业的事专业的人做
上代码
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
private static Configuration configuration = null;
public static void main(String s[]) {
WordUtils m = new WordUtils();
//服务器
// String templateFolder = File.separator + WordUtils.class.getClassLoader().getResource("/").getPath().replaceAll("^(/)|(/WEB-INF/classes/)$", "")+"/print/templete/ftl/";
//本地开发
String templateFolder ="E:/word/";
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
try {
configuration.setDirectoryForTemplateLoading(new File(templateFolder));
} catch (IOException e) {
e.printStackTrace();
}
m.doit();
}
public void doit() {
try {
Template template = configuration.getTemplate("origin.ftl");
//本地创建空文件
String fileName = "E:/word/outFile.doc";
File outFile = new File(fileName);
outFile.createNewFile();
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
HashMap data = new HashMap();
data.put("clientId", "helloword哈喽");
data.put("providerName", "alsdjflksadjkljgsalkg jsaalsdjflksadjkljgsalkgjsa alsdjfljflksadjkljgsalkg jsaalsdjflksadjkljgsalkgjsa alsdjflksadjkljgjflksadjkljgsalkg jsaalsdjflksadjkljgsalkgjsa alsdjflksadjkljgjflksadjkljgsalkg jsaalsdjflksadjkljgsalkgjsa alsdjflksadjkljgksadjkljgsalkgjsa alsdjflksadjkljgsalkgjsa");
List<FeeDetail> feeDetailList =new ArrayList<FeeDetail>();
FeeDetail feeDetail_1 = new FeeDetail();
feeDetail_1.setSDEnglish("additional procedures to construct new crown under existing partial denture framework");
feeDetail_1.setSDChinese("哈哈哈哈哈");
feeDetail_1.setIA("11");
feeDetail_1.setDA("22");
feeDetail_1.setCT("33");
feeDetail_1.setCBOI("44");
feeDetail_1.setOther("5");
feeDetail_1.setMR("66");
feeDetail_1.setAC("77");
feeDetailList.add(feeDetail_1);
FeeDetail feeDetail_2 = new FeeDetail();
feeDetail_2.setSDEnglish("rofessional Feesrofessional Feesrofessional Feesrofessional Feesrofessional Fees");
feeDetail_2.setSDChinese("哈哈哈哈9哈");
feeDetail_2.setIA("191");
feeDetail_2.setDA("292");
feeDetail_2.setCT("393");
feeDetail_2.setCBOI("494");
feeDetail_2.setOther("59");
feeDetail_2.setMR("696");
feeDetail_2.setAC("797");
feeDetailList.add(feeDetail_2);
data.put("feeDetailList",feeDetailList);
//将内容写进创建的outFile文件中
template.process(data, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
和list的元素
/*
* freemarker 需要的list的元素类型, 必须是public类, 且最好变量驼峰命名
*/
public class FeeDetail {
String SDEnglish;
String SDChinese;
String IA;
String DA;
String CT;
String CBOI;
String other;
String MR;
String AC;
public String getSDEnglish() {
return SDEnglish;
}
public void setSDEnglish(String sDEnglish) {
SDEnglish = sDEnglish;
}
public String getSDChinese() {
return SDChinese;
}
public void setSDChinese(String sDChinese) {
SDChinese = sDChinese;
}
public String getIA() {
return IA;
}
public void setIA(String IAa) {
IA = IAa;
}
public String getDA() {
return DA;
}
public void setDA(String dA) {
DA = dA;
}
public String getCT() {
return CT;
}
public void setCT(String cT) {
CT = cT;
}
public String getCBOI() {
return CBOI;
}
public void setCBOI(String cBOI) {
CBOI = cBOI;
}
public String getOther() {
return other;
}
public void setOther(String o) {
other = o;
}
public String getMR() {
return MR;
}
public void setMR(String mR) {
MR = mR;
}
public String getAC() {
return AC;
}
public void setAC(String aC) {
AC = aC;
}
}