Java使用Freemarker动态生成Word文档

Java使用Freemarker动态生成word文档

最近在工作中遇到动态生成word文档的需求,百度了一翻,在实践过程中遇到了各种问题,踩了很多坑,终于完成了项目需求,现在和大家分享一下开发过程中遇到的问题及解决办法!

开发过程如下:

  1. 新建Maven工程,pom.xml配置如下
  <project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>com.tan</groupId>
	<artifactId>wordDemo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>wordDemo</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<junit.version>4.12</junit.version>
		<freemarker.version>2.3.8</freemarker.version>
	</properties>

	<dependencies>
        <!-- junnit start -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
		
		<!-- freemarker start -->
		<dependency>
		    <groupId>freemarker</groupId>
			<artifactId>freemarker</artifactId>
			<version>${freemarker.version}</version>
		</dependency>
		
	</dependencies>

</project>
		
  1. (1)首先用office新建一个需要生成的模本文件(注意一定使用微软的office新建,否则可能出现生成的word文档的兼容性问题)
    (2)将word另存为(word 2003兼容版)xml兼容格式(不要直接修改文件后缀,需要另存为
    (3)将xml文件后缀修改为ftl
    (4)用java代码完成制作模板

电子发票实战应用

1.制作word文档模板:注意虽然直接在word文档中直接代码替换需要动态生成数据的地方,另存为xml文件之后,不一定正确,需要直接在代码中手动修改,但是模板中的图片位置一定需要插入一张图片!

2.项目路径如下:

在这里插入图片描述

3.生成word和将图片转换成二进制字符串
package com.tan.utils;
/**
  * @Description : WordUtil.java
  * @date :2019年9月20日 上午9:51:31
**/

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder;

public class WordUtil {

	private Configuration configure = null;

	public Configuration getConfigure() {
		return configure;
	}

	public void setConfigure(Configuration configure) {
		this.configure = configure;
	}

	public WordUtil() {
		configure = new Configuration();
		configure.setDefaultEncoding("utf-8");
	}

	/**
	 * 
	 * 根据word模板生成word文件
	 * 
	 * @param dataMap   : 数据
	 * @param inputFile : 输入模板文件地址
	 * @param outFilePath  : 输出word文件地址
	 * @return
	 *
	 *
	 *
	 */
	public boolean createWord(Map<String, Object> dataMap, String inputFilePath, String outFilePath) {
		boolean flag = false;

		try {
			// 指定路径方式(根据某个类的相对路径指定)
			configure.setClassForTemplateLoading(this.getClass(), "/test");
			
			// 以utf-8的编码读取ftl文件
			Template template = configure.getTemplate(inputFilePath, "utf-8");
			Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(outFilePath)), "utf-8"),
					10240);
			template.process(dataMap, out);
			out.close();
			
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return flag;
	}
	
	/**
	 * 
	 * 将图片转换成二进制字符串
	 * 
	 * @param imgFilePath : 图片路径
	 * @return 
	 *
	 *
	 *
	 */
	public String getImageStr(String imgFilePath) {
		
          InputStream in = null;  
          byte[] data = null;  
          try {  
              in = new FileInputStream(imgFilePath);  
              data = new byte[in.available()];  
              in.read(data);  
              in.close();  
          } catch (Exception e) {  
              e.printStackTrace();  
          }  
          BASE64Encoder encoder = new BASE64Encoder();  
          return encoder.encode(data); 
	       
	}
	

}

1.简单word生成

java代码如下:
 public void testDemo1()
    {
       WordUtil wu = new WordUtil();
       Map<String, Object> dataMap = new HashMap<String, Object>();
       
       dataMap.put("username", "tyy");
       dataMap.put("tel", "15206123658");
       dataMap.put("address", "无锡市");
       dataMap.put("date", new Date().toLocaleString());
       dataMap.put("num", "123456789");
     
       wu.createWord(dataMap, "demo.ftl", "D:/test.doc");
    }
模版代码如下:
 <w:tr wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">
          <w:trPr>
            <w:trHeight w:val="784"/>
          </w:trPr>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="8359" w:type="dxa"/>
              <w:gridSpan w:val="3"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                  <w:sz w:val="28"/>
                  <w:sz-cs w:val="28"/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:ascii="宋体" w:h-ansi="宋体"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                  <w:sz w:val="28"/>
                  <w:sz-cs w:val="28"/>
                </w:rPr>
                <w:t>XX商城购物明细单</w:t>
              </w:r>
            </w:p>
          </w:tc>
        </w:tr>
        <w:tr wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">
          <w:trPr>
            <w:trHeight w:val="392"/>
          </w:trPr>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="1557" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:b/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>收货人</w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>:</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2596" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="0066660D" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t>${username}</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="4206" w:type="dxa"/>
              <w:vmerge w:val="restart"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00E417B3" wsp:rsidP="00E417B3">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
              <w:r>
                <w:pict>
                  <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
                    <v:stroke joinstyle="miter"/>
                    <v:formulas>
                      <v:f eqn="if lineDrawn pixelLineWidth 0"/>
                      <v:f eqn="sum @0 1 0"/>
                      <v:f eqn="sum 0 0 @1"/>
                      <v:f eqn="prod @2 1 2"/>
                      <v:f eqn="prod @3 21600 pixelWidth"/>
                      <v:f eqn="prod @3 21600 pixelHeight"/>
                      <v:f eqn="sum @0 0 1"/>
                      <v:f eqn="prod @6 1 2"/>
                      <v:f eqn="prod @7 21600 pixelWidth"/>
                      <v:f eqn="sum @8 21600 0"/>
                      <v:f eqn="prod @7 21600 pixelHeight"/>
                      <v:f eqn="sum @10 21600 0"/>
                    </v:formulas>
                    <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
                    <o:lock v:ext="edit" aspectratio="t"/>
                  </v:shapetype>
                   <w:binData w:name="wordml://02000001.jpg" xml:space="preserve">
${img}
</w:binData>                  <v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:414.6pt;height:233.4pt">                    <v:imagedata src="wordml://02000001.jpg" o:title="1"/>                  </v:shape>                </w:pict>              </w:r>            </w:p>          </w:tc>        </w:tr>        <w:tr wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">          <w:trPr>            <w:trHeight w:val="376"/>          </w:trPr>          <w:tc>            <w:tcPr>              <w:tcW w:w="1557" w:type="dxa"/>              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>            </w:tcPr>            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">              <w:pPr>                <w:jc w:val="center"/>                <w:rPr>                  <w:b/>                </w:rPr>              </w:pPr>              <w:r wsp:rsidRPr="00AA752A">                <w:rPr>                  <wx:font wx:val="宋体"/>                  <w:b/>                </w:rPr>                <w:t>联系电话</w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>:</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2596" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="0066660D" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                </w:rPr>
                <w:t>${tel}</w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t></w:t>
              </w:r>
              <w:proofErr w:type="spellStart"/>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t></w:t>
              </w:r>
              <w:proofErr w:type="spellEnd"/>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t></w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="4206" w:type="dxa"/>
              <w:vmerge/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
            </w:p>
          </w:tc>
        </w:tr>
        <w:tr wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">
          <w:trPr>
            <w:trHeight w:val="392"/>
          </w:trPr>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="1557" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:b/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>收货地址</w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>:</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2596" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="0066660D" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                </w:rPr>
                <w:t></w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t>${address}</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="4206" w:type="dxa"/>
              <w:vmerge/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
            </w:p>
          </w:tc>
        </w:tr>
        <w:tr wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">
          <w:trPr>
            <w:trHeight w:val="392"/>
          </w:trPr>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="1557" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:b/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>订购日期</w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>:</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2596" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="0066660D" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                </w:rPr>
                <w:t></w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t>${date}</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="4206" w:type="dxa"/>
              <w:vmerge/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
            </w:p>
          </w:tc>
        </w:tr>
        <w:tr wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">
          <w:trPr>
            <w:trHeight w:val="392"/>
          </w:trPr>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="1557" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="002E0598" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
                <w:rPr>
                  <w:b/>
                </w:rPr>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>订单号</w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                  <wx:font wx:val="宋体"/>
                  <w:b/>
                </w:rPr>
                <w:t>:</w:t>
              </w:r>
            </w:p>
          </w:tc>
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="2596" w:type="dxa"/>
              <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
            </w:tcPr>
            <w:p wsp:rsidR="002E0598" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="0066660D" wsp:rsidP="00AA752A">
              <w:pPr>
                <w:jc w:val="center"/>
              </w:pPr>
              <w:r wsp:rsidRPr="00AA752A">
                <w:rPr>
                  <w:rFonts w:hint="fareast"/>
                </w:rPr>
                <w:t></w:t>
              </w:r>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t></w:t>
              </w:r>
              <w:proofErr w:type="spellStart"/>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t>${num}</w:t>
              </w:r>
              <w:proofErr w:type="spellEnd"/>
              <w:r wsp:rsidRPr="00AA752A">
                <w:t></w:t>
              </w:r>
            </w:p>
          </w:tc>

2.生成word文件中导入图片

java代码如下:图片路径和ftl模板路径一致
public void testDemo2()
    {
    	WordUtil wu = new WordUtil();
        Map<String, Object> dataMap = new HashMap<String, Object>();
        
        dataMap.put("username", "tyy");
        dataMap.put("tel", "15206123658");
        dataMap.put("address", "无锡市");
        dataMap.put("date", new Date().toLocaleString());
        dataMap.put("num", "123456789");
      
        //导入图片
        String imgPath = this.getClass().getResource("/test/1.jpg").getPath();
        String outPathImg = wu.getImageStr(imgPath);
        dataMap.put("img", outPathImg);
        
        wu.createWord(dataMap, "demo.ftl", "D:/test.doc");
    }
    
模板代码如下:
<w:binData w:name="wordml://02000001.jpg" xml:space="preserve">
${img}
</w:binData>   

3.生成循环的表格

list实体类代码如下:注意属性首字母一定要小写,不要大写!
package com.tan.bean;

/**
 * @Description : Page.java
 **/

public class Page {

	private String a;

	private String b;

	private double c;

	private double d;
	
	private double e;

	private String f;

	public String getA() {
		return a;
	}

	public void setA(String a) {
		this.a = a;
	}

	public String getB() {
		return b;
	}

	public void setB(String b) {
		this.b = b;
	}

	public double getC() {
		return c;
	}

	public void setC(double c) {
		this.c = c;
	}

	public double getD() {
		return d;
	}

	public void setD(double d) {
		this.d = d;
	}

	public double getE() {
		return e;
	}

	public void setE(double e) {
		this.e = e;
	}

	public String getF() {
		return f;
	}

	public void setF(String f) {
		this.f = f;
	}
	
	

}

java代码如下:
public void testDemo3()
   {
   	WordUtil wu = new WordUtil();
       Map<String, Object> dataMap = new HashMap<String, Object>();
       
       dataMap.put("username", "tyy");
       dataMap.put("tel", "15206123658");
       dataMap.put("address", "无锡市");
       dataMap.put("date", new Date().toLocaleString());
       dataMap.put("num", "123456789");
     
       //导入图片
       String imgPath = this.getClass().getResource("/test/1.jpg").getPath();
       String outPathImg = wu.getImageStr(imgPath);
       dataMap.put("img", outPathImg);
       
       //生成循环的表格
       List<Page> list = new ArrayList<Page>();
       Page p = new Page();
       p.setA("1023");
       p.setB("华为P30");
       p.setC(1);
       p.setD(4288);
       p.setE(p.getC()*p.getD());
       p.setF("无");
       list.add(p);
       Page p2 = new Page();
       p2.setA("1050");
       p2.setB("华为Watch");
       p2.setC(2);
       p2.setD(5000);
       p2.setE(p2.getC()*p2.getD());
       p2.setF("无");
       list.add(p2);
       double allprice = 0;
       for(int i = 0; i < list.size(); i++) {
       	allprice += list.get(i).getE();
       }
       //小计
       dataMap.put("allprice", allprice);
       //折扣
       dataMap.put("discount", "%5");
       //折扣金额
       double discountprice = allprice * 0.05;
       dataMap.put("discountprice", discountprice);
       //总计
       double all = allprice - discountprice;
       dataMap.put("all", all);
       
       dataMap.put("list", list);
       
       wu.createWord(dataMap, "demo.ftl", "D:/test.doc");
   }
模板代码如下:
<#list list as li>
      <w:tr wsp:rsidR="00E417B3" wsp:rsidRPr="00AA752A" wsp:rsidTr="00AA752A">
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1383" w:type="dxa"/>
            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
          </w:tcPr>
          <w:p wsp:rsidR="00EA7EAC" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00EA7EAC">
             <w:pPr>
              <w:rPr>
                <w:b/>
              </w:rPr>
            </w:pPr>
            <w:r wsp:rsidRPr="00AA752A">
              <w:rPr>
                <w:rFonts w:hint="fareast"/>
                <wx:font wx:val="宋体"/>
                <w:b/>
              </w:rPr>
              <w:t>${li.a}</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1383" w:type="dxa"/>
            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
          </w:tcPr>
          <w:p wsp:rsidR="00EA7EAC" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00EA7EAC">
             <w:pPr>
              <w:rPr>
                <w:b/>
              </w:rPr>
            </w:pPr>
            <w:r wsp:rsidRPr="00AA752A">
              <w:rPr>
                <w:rFonts w:hint="fareast"/>
                <wx:font wx:val="宋体"/>
                <w:b/>
              </w:rPr>
              <w:t>${li.b}</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1382" w:type="dxa"/>
            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
          </w:tcPr>
          <w:p wsp:rsidR="00EA7EAC" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00EA7EAC">
             <w:pPr>
              <w:rPr>
                <w:b/>
              </w:rPr>
            </w:pPr>
            <w:r wsp:rsidRPr="00AA752A">
              <w:rPr>
                <w:rFonts w:hint="fareast"/>
                <wx:font wx:val="宋体"/>
                <w:b/>
              </w:rPr>
              <w:t>${li.c}</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1382" w:type="dxa"/>
            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
          </w:tcPr>
          <w:p wsp:rsidR="00EA7EAC" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00EA7EAC">
             <w:pPr>
              <w:rPr>
                <w:b/>
              </w:rPr>
            </w:pPr>
            <w:r wsp:rsidRPr="00AA752A">
              <w:rPr>
                <w:rFonts w:hint="fareast"/>
                <wx:font wx:val="宋体"/>
                <w:b/>
              </w:rPr>
              <w:t>${li.d}</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1383" w:type="dxa"/>
            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
          </w:tcPr>
          <w:p wsp:rsidR="00EA7EAC" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00EA7EAC">
             <w:pPr>
              <w:rPr>
                <w:b/>
              </w:rPr>
            </w:pPr>
            <w:r wsp:rsidRPr="00AA752A">
              <w:rPr>
                <w:rFonts w:hint="fareast"/>
                <wx:font wx:val="宋体"/>
                <w:b/>
              </w:rPr>
              <w:t>${li.e}</w:t>
            </w:r>
          </w:p>
        </w:tc>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="1383" w:type="dxa"/>
            <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
          </w:tcPr>
          <w:p wsp:rsidR="00EA7EAC" wsp:rsidRPr="00AA752A" wsp:rsidRDefault="00EA7EAC">
             <w:pPr>
              <w:rPr>
                <w:b/>
              </w:rPr>
            </w:pPr>
            <w:r wsp:rsidRPr="00AA752A">
              <w:rPr>
                <w:rFonts w:hint="fareast"/>
                <wx:font wx:val="宋体"/>
                <w:b/>
              </w:rPr>
              <w:t>${li.f}</w:t>
            </w:r>
          </w:p>
        </w:tc>
      </w:tr>
      </#list>
      

成果如下:这就是自动生成电子发票的开发实例过程!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值