精华内容
下载资源
问答
  • FreeMaker解析Word模板(含图片)生成Word文档
  • 1.利用freemarker生成word文档,首先需要创建word文档模板(即.doc文档),需要用户填写的值可以使用${string}代替, 然后将doc另存为后缀为xml格式 再将保存后的month_2.xml后缀名改为.ftl. 在将word转化为xml...

    1.利用freemarker生成word文档,首先需要创建word文档模板(即.doc文档),需要用户填写的值可以使用${string}代替,

    然后将doc另存为后缀为xml格式

    再将保存后的month_2.xml后缀名改为.ftl. 在将word转化为xml占位符被分离,如果手动删除会很麻烦,最后我的解决方法是

    我就把 ${fangyuan001}写到 空白的txt 里面 再直接txt里面的 ${fangyuan001} 复制粘贴到word的对应位置,就没有被分离了。

    此方法的解决原址:https://blog.csdn.net/fangyuandoit/article/details/89455964

     

    2.在项目的pom.xml文件中导入

      <dependency>  
                <groupId>org.freemarker</groupId>  
                <artifactId>freemarker</artifactId>
            </dependency>

     

    3.再将model.ftl放置在springboot项目的resource目录下

     

    4.生成文档

    生成图片注意:

    1.不能再doc上直接删除图片

    2.打开ftl的文件在加入了图片占位的地方,会看到一片base64编码后的代码,把base64替换成${image},也就是Map<String, Object>中key,值必须要处理成base64;

    代码如:<w:binData w:name="wordml://1.png" xml:space="preserve">${image}</w:binData>

     

    展开全文
  • 在平时的开发中可能遇到固定模板导出到word文档中的情况,这里简单介绍一种方法: 一、新建word模板 1.新建一个word文档

    在平时的开发中可能遇到固定模板导出到word文档中的情况,这里简单介绍一种方法:

    一、新建word模板

    1.新建一个word文档:
    在这里插入图片描述
    2.编辑word文档,生成模板:
    在这里插入图片描述
    3.另存为,将word文档存成xml格式:
    在这里插入图片描述

    二、创建Spring Boot项目

    1.创建spring boot项目,引入maven依赖

    <dependencies>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-freemarker</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-test</artifactId>
    			<scope>test</scope>
    			<exclusions>
    				<exclusion>
    					<groupId>org.junit.vintage</groupId>
    					<artifactId>junit-vintage-engine</artifactId>
    				</exclusion>
    			</exclusions>
    		</dependency>
    	</dependencies>
    

    2.创建application.yml配置文件,配置freemaker相关设置:

    spring: 
    #    设置freemarker
      freemarker:
        allow-request-override: false
        #    开发过程建议关闭缓存
        cache: true
        check-template-location: false
        charset: UTF-8
        content-type: text/html; charset=utf-8
        expose-request-attributes: false
        expose-session-attributes: false
        expose-spring-macro-helpers: false
        request-context-attribute:
        # 默认后缀就是.ftl
        suffix: .ftl
        template-loader-path: classPath:/templates/
    

    3.将xml文件拷贝到templates目录下,将后缀改成.ftl
    在这里插入图片描述
    4.编写一个controller测试是否能够导出word文档

    @Controller
    public class WordController {
    
    	@RequestMapping("test/doc")
    	@ResponseBody
    	public String exportDoc(User user) throws IOException {
    		Configuration configuration = new Configuration(Configuration.VERSION_2_3_0);
    		configuration.setDefaultEncoding("utf-8");
    		configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
    		Template template = configuration.getTemplate("userinfo.ftl");
    		Map<String, Object> dataMap = new HashMap<>();
    		dataMap.put("name", user.getName());
    		dataMap.put("sex", user.getSex());
    		dataMap.put("age", user.getAge());
    		File outFile = new File("Test.doc");
    		Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8"));
    		try {
    			template.process(dataMap, out);
    			out.flush();
    			out.close();
    		} catch (TemplateException e) {
    			e.printStackTrace();
    			return "error";
    		}
    		return "success";
    	}
    
    }
    
    class User {
    	private String name;
    	private String sex;
    	private Integer age;
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getSex() {
    		return sex;
    	}
    
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    
    	public Integer getAge() {
    		return age;
    	}
    
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    
    }
    

    5.运行spring boot项目,访问:

    http://localhost:8080/test/doc?name=张三&sex=&age=23
    

    6.刷新项目,根目录下出现导出的word文档:
    在这里插入图片描述
    7.打开word文档查看:
    在这里插入图片描述
    可以看到,word文档可以成功导出,核心就是借助freemarker模板技术,同理可以制作更为复杂的模板,也可以使用BASE64编码图片以后赋值到模板中,动态显示不同的图片,原理都差不多,不在赘述。

    展开全文
  • java-制作flt模板,导出word文档图片循环模板制作制作xml编辑xml文档将xml模板转换为flt编写工具类导出word工具类获取远程图片使用示例使用示例--springboot 模板制作 制作xml 根据自己的业务需求制作相应的word...

    模板制作

    制作xml

    根据自己的业务需求制作相应的word模板
    例如:
    在这里插入图片描述
    将对应的模板另存为xml格式
    在这里插入图片描述

    编辑xml文档

    1.将保存好的xml文档利用idea打开,并使用快捷键将其简单的规整,这样有利于我们后期对它的编辑
    2.规整后我们找到我们需要动态改变的位置,将需要变换的位置用${变量名}的方式标记
    3.循环的写法
    例子:
    这里例子是给我模板图中的表格第二第三行

    //这里标识循环的开始
    //singlemaps 这个是list集合的变量名称,map 标识循环后每个变量的名字,这里有点类似于我们java中的foreach循环
    <#list singlemaps as map>
            <w:tr wsp:rsidR="00DA1F2C">
                <w:trPr>
                    <w:trHeight w:val="851"/>
                    <w:jc w:val="center"/>
                </w:trPr>
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="5151" w:type="dxa"/>
                        <w:tcBorders>
                            <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                                <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                                <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                                <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                        </w:tcBorders>
                        <w:vAlign w:val="center"/>
                    </w:tcPr>
                    <w:p wsp:rsidR="00984D10" wsp:rsidRDefault="0031697E">
                        <w:pPr>
                            <w:widowControl/>
                            <w:rPr>
                                <w:rFonts w:fareast="黑体"/>
                            </w:rPr>
                        </w:pPr>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:cs="宋体" w:hint="fareast"/>
                                <wx:font wx:val="黑体"/>
                                <w:color w:val="000000"/>
                                <w:kern w:val="0"/>
                                <w:sz-cs w:val="21"/>
                            </w:rPr>
                            //这里我们用循环后的对象map获取相应的键值
                            //如果是不需要循环的地方,我们则直接${键名}即可
                            <w:t>${map.title}</w:t>
                        </w:r>
                    </w:p>
                </w:tc>
    
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="5055" w:type="dxa"/>
                        <w:tcBorders>
                            <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                        </w:tcBorders>
                        <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        <w:vAlign w:val="center"/>
                    </w:tcPr>
                    <w:p wsp:rsidR="00984D10" wsp:rsidRDefault="00984D10">
                        <w:pPr>
                            <w:widowControl/>
                            <w:rPr>
                                <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:cs="宋体"/>
                                <wx:font wx:val="黑体"/>
                                <w:color w:val="000000"/>
                                <w:kern w:val="0"/>
                                <w:sz-cs w:val="21"/>
                            </w:rPr>
                        </w:pPr>
                    </w:p>
                </w:tc>
            </w:tr>
    
    
            <w:tr wsp:rsidR="00DA1F2C" wsp:rsidTr="008047BD">
                <w:trPr>
                    <w:trHeight w:val="3402"/>
                    <w:jc w:val="center"/>
                </w:trPr>
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="5151" w:type="dxa"/>
                        <w:tcBorders>
                            <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                        </w:tcBorders>
                        <w:vAlign w:val="center"/>
                    </w:tcPr>
                    <w:p wsp:rsidR="00984D10" wsp:rsidRDefault="007D2947">
                        <w:pPr>
                            <w:widowControl/>
                            <w:rPr>
                                <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:cs="宋体"/>
                                <wx:font wx:val="黑体"/>
                                <w:color w:val="000000"/>
                                <w:kern w:val="0"/>
                                <w:sz-cs w:val="21"/>
                            </w:rPr>
                        </w:pPr>
                        <w:r wsp:rsidRPr="009D2FA9">
                            <w:rPr>
                                <w:noProof/>
                            </w:rPr>
                            <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>
                                //这里标识的是一个导出的图片
                                //这里的${map.url}中url的值为转换为base64格式的图片数据
                                <w:binData w:name="wordml://${map.code}.png" xml:space="preserve">${map.url}</w:binData>
                                //这里是将图片的数据和样式渲染出来
                                //${map.code}这个标识图片的编号,多张图片的情况,这个值需要唯一
                                //src="wordml://${map.code}.png" 这里我们需要这顶图片的名称
                                //此后面的.png也可以根据实际的图片数据来进行动态
                                <v:shape id="${map.code}" o:spid="${map.code}" type="#_x0000_t75" style="width:247.3pt;height:121.45pt;visibility:visible;mso-wrap-style:square">
                                                               <v:imagedata src="wordml://${map.code}.png" o:title=""/>
                                                           </v:shape>
                            </w:pict>
                        </w:r>
                    </w:p>
                </w:tc>
    
                <w:tc>
                    <w:tcPr>
                        <w:tcW w:w="5055" w:type="dxa"/>
                        <w:tcBorders>
                            <w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                            <w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="000000"/>
                        </w:tcBorders>
                        <w:shd w:val="clear" w:color="auto" w:fill="auto"/>
                        <w:vAlign w:val="center"/>
                    </w:tcPr>
                    <w:p wsp:rsidR="00984D10" wsp:rsidRDefault="0031697E">
                        <w:pPr>
                            <w:widowControl/>
                            <w:rPr>
                                <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:cs="宋体"/>
                                <wx:font wx:val="黑体"/>
                                <w:color w:val="000000"/>
                                <w:kern w:val="0"/>
                                 <w:sz-cs w:val="21"/>
                            </w:rPr>
                        </w:pPr>
                        <w:r>
                            <w:rPr>
                                <w:rFonts w:ascii="黑体" w:fareast="黑体" w:h-ansi="黑体" w:cs="宋体" w:hint="fareast"/>
                                <wx:font
                                wx:val="黑体"/>
                                <w:color w:val="000000"/>
                                <w:kern w:val="0"/>
                                <w:sz-cs w:val="21"/>
                            </w:rPr>
                            //输出文字
                            <w:t>${map.info}</w:t>
                        </w:r>
                    </w:p>
                </w:tc>
            </w:tr>
            </#list>
    

    将xml模板转换为flt

    这里建议在改变文件后缀时再idea工具中进行,这样可以有效避免编码的问题
    转换后
    在这里插入图片描述

    编写工具类

    导出word工具类

    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.net.URLEncoder;
    import java.util.Map;
    
    public class WordUtils {
        private static Configuration configuration = null;
        private static final String templateFolder = WordUtils.class.getClassLoader().getResource("").getPath();
    
        static {
            configuration = new Configuration(Configuration.VERSION_2_3_23);
            configuration.setDefaultEncoding("utf-8");
            try {
                configuration.setDirectoryForTemplateLoading(new File(templateFolder));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        private WordUtils() {
            throw new AssertionError();
        }
        public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException {
            //ftl模板文件
            //这里需要将模板文件放在项目的resources目录下
            configuration.setClassForTemplateLoading(WordUtils.class,"/");
            //获取模板
            Template template = configuration.getTemplate(ftlFile);
            File file = null;
            InputStream fin = null;
            ServletOutputStream out = null;
            try {
                // 调用工具类的createDoc方法生成Word文档
                file = createDoc(map, template);
                fin = new FileInputStream(file);
                String fileName = title + ".doc";
                response.setCharacterEncoding("utf-8");
                response.setContentType("application/msword");
                // 设置浏览器以下载的方式处理该文件名
                response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
                out = response.getOutputStream();
                byte[] buffer = new byte[512];  // 缓冲区
                int bytesToRead = -1;
                // 通过循环将读入的Word文件的内容输出到浏览器中
                while ((bytesToRead = fin.read(buffer)) != -1) {
                    out.write(buffer, 0, bytesToRead);
                }
            } finally {
                if (fin != null) {
                    fin.close();
                }
                if (out != null) {
                    out.close();
                }
                if (file != null) {
                    file.delete();
                } // 删除临时文件
            }
        }
    	//渲染文件
        private static File createDoc(Map<?, ?> dataMap, Template template) {
            String name = "test.doc";
            File f = new File(name);
            Template t = template;
            try {
                // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
                Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
                t.process(dataMap, w);
                w.close();
            } catch (Exception ex) {
                ex.printStackTrace();
                throw new RuntimeException(ex);
            }
            return f;
        }
    }
    
    

    获取远程图片

    import sun.misc.BASE64Encoder;
    import java.io.*;
    import java.net.URL;
    /**
     * 读取远程文件为base64
     */
    public class FileDown {
    	//urlImage文件的远程地址
        public static String getImageStr(String urlImage) throws Exception {
            InputStream in = null;
            byte[] data = null;
            try {
            //这里的处理是为了在读取文件的时候因为带宽影响转换
                String newNumber = urlImage.replace("http://域名地址/image/", "http://对应服务器内部地址/image/");
                in = getInputStream(newNumber);
                data = new byte[in.available()];
                in.read(data);
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            BASE64Encoder encoder = new BASE64Encoder();
            return encoder.encode(data);
        }
    
        public static InputStream getInputStream(String imageUrl) throws Exception {
            URL url = new URL(imageUrl);
            InputStream ism = url.openStream();
            return ism;
        }
    
        public static void main(String[] args) throws Exception {
            getImageStr("https://xxx/xxx.png");
        }
    }
    

    使用示例

    使用示例–springboot

    		//存储的整体数据
    		Map<String, Object> dataMap = new HashMap<String, Object>();
            dataMap.put("无需循环的值", "无需循环的值");
            List<Map<String, String>> singlemaps = new ArrayList<Map<String, String>>();
            if (report.getConstructionUrl()!=null&&report.getConstructionInfo()!=null){
                Map<String, String> map = new HashMap<String, String>();
                map.put("循环值", "循环值");
                map.put("循环值图", FileDown.getImageStr("图片路径")/直接填写bsae64);
                map.put("循环图片编号","03000001/建议数字");
                singlemaps.add(map);
            }
            WordUtils.exportMillCertificateWord(request, response, dataMap/参数map集合, "文件名称", "mb.flt/模板文件名称");
    

    在这里插入图片描述

    展开全文
  • 图片标注的区域,都是通过WORD模板生成的,特别是循环生成区域,估计都是大家想要的。下面就一步步来吧。 第一:引入Aspose.Words.dll ,网上都可以下载,这里不细说了。 第二:WORD模板操作核心方法: using ...

    网上有很多的关于WORD模板操作的文章,看了后,总是被其中一些关键点给打断了,在经过多次测试后,总算是成功生成了自己的WORD,今天详细分享下,希望能帮到需要的小白们。

    首先来看下导出的效果

    图片标注的区域,都是通过WORD模板生成的,特别是循环生成区域,估计都是大家想要的。下面就一步步来吧。

    第一:引入Aspose.Words.dll ,网上都可以下载,这里不细说了。

    第二:WORD模板操作核心方法:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web;
    using System.IO;
    //这里的前提,你需要引用Aspose.Words.dll文件
    using Aspose.Words;
    using System.Data;
    
    ///VanClean.Office 是我的命名空间,你可以自己调整
    namespace VanClean.Office
    {
        /// <summary>
        /// 通过WORD模板导出文档
        /// </summary>
        public class WordModelEvent
        {
            /// <summary>
            /// WORD模板操作
            /// </summary>
            /// <param name="modelDoc">模板路径</param>
            /// <param name="exptDoc">导出文件名</param>
            /// <param name="fieldNames"></param>
            /// <param name="fieldValues"></param>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static string ExpertWordToModel(string modelDoc,string exptDoc, 
                String[] fieldNames, Object[] fieldValues,DataTable dt)
            {
                try
                {
                    //WORD模板存放位置
                    string tempPath = HttpContext.Current.Server.MapPath("~/templates/" + modelDoc + ".docx");
                    //导出的WORD存放的位置
                    const string saveFold = "uploads/word/";
                    string outputPath = HttpContext.Current.Server.MapPath("~/" + saveFold);
                    if (!Directory.Exists(outputPath))
                        Directory.CreateDirectory(outputPath); 
                    //生成的WORD文件名
                    string fileName = exptDoc + "[" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "].docx";
                    outputPath += fileName;
                    //载入模板
                    Document doc = new Document(tempPath); 
                    doc.MailMerge.Execute(fieldNames, fieldValues);                
                    //将我们获得的DataTable类型的数据:EduDataTable放入doc方法中做处理
                    doc.MailMerge.ExecuteWithRegions(dt);
                    //获取下载地址
                    String StrVisitURL = saveFold + fileName;
                    //合并模版,相当于页面的渲染
                    doc.MailMerge.Execute(new[] { "PageCount" }, new object[] { doc.PageCount });
                    //保存合并后的文档
                    doc.Save(outputPath);
                    return StrVisitURL; 
                }
                catch (Exception er)
                {
                    return er.Message;
                }
            }
        }
    }
    

    第三:通过WORD模板生成新文件

    return PublicCode.RetTrueMsg(StrVisitURL);我返回的是JSON格式数据,你可直接返回 return StrVisitURL;即下载地址。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data;
    using System.Data.SqlClient;
    
    /// <summary>
            /// 根据WORD模板生成住户基础信息
            /// </summary>
            /// <param name="houseid"></param>
            /// <returns></returns>
            public static string GetWordEvent(string houseid)
            {
                try
                {
                    String[] fieldNames = new String[]
                        {
                        "Fanghao",
                        "RegDate",
                        "UserName",
                        "Gender",
                        "Minzu",
                        "Zhengzhimm",
                        "IdCard",
                        "Qianchudi",
                        "Tel",
                        "Shuxing",
                        "BankZh",
                        "Gongyigang"
                        };
                    PersonBase pb = SelectOne("", houseid);//通过houseid返回PersonBase对象,里面包括了fieldNames需要的字段信息,PersonBase自己定义下吧,SeleectOne()方法自己写一个。
                    if(pb == null)
                    {
                        return PublicCode.RetFalseMsg("没有查询到户主信息,请检查住户基础登记信息!");
                    }
    
                    Object[] fieldValues = new object[fieldNames.Length];                
                    fieldValues[0] = FormatFanghao(pb.Fanghao);
                    fieldValues[1] = DateTime.Now.ToString("yyyy年MM月dd日");
                    fieldValues[2] = pb.Name;
                    fieldValues[3] = pb.Xingbie;
                    fieldValues[4] = pb.Minzu;
                    fieldValues[5] = pb.Zhengzhimm;
                    fieldValues[6] = pb.IdCard;
                    fieldValues[7] = pb.qc_Xiangzhen + pb.qc_Xingzhengcun + pb.qc_Cunminxiaozu;
                    fieldValues[8] = pb.Tel;
                    fieldValues[9] = "";//属性
                    fieldValues[10] = "";//银行账号
                    fieldValues[11] = "";//公益岗
    
                    
                    string sql = "select Name,Huzhuguanxi,Xingbie,IdCard Card,'' Qita,'' UserGongyi";
                    sql += " from TableName where HouseID='" + houseid + "' order by id asc";                
                    DataTable dt = getDataTable(sql);
                    //这里的UserList很关键,要与WORD模板的域设置对应,不是随便写的,后面还会用到
                    dt.TableName = "UserList";
                    //VanClean.Office这里命名空间注意修改
                    string StrVisitURL = VanClean.Office.WordModelEvent.ExpertWordToModel("model", pb.Fanghao + pb.Name, fieldNames, fieldValues, dt);
                    return PublicCode.RetTrueMsg(StrVisitURL);
                }
                catch(Exception er)
                {
                    return er.Message;
                }
            }
            /// <summary>
            /// 格式化房号
            /// </summary>
            /// <param name="fanghao"></param>
            /// <returns></returns>
            private static string FormatFanghao(string fanghao)
            {
                try
                {
                    string[] tmp = fanghao.Split('-');
                    string str = Int32.Parse(tmp[0]).ToString() + "栋" + Int32.Parse(tmp[1]).ToString() + "单元" + Int32.Parse(tmp[2]).ToString() + "室";
                    return str;
                }
                catch(Exception er)
                {
                    return fanghao;
                }
            }
    
    /// 通过SQL获得 DataTable
    /// ConnectionString 你的数据链接字符串
    private DataTable getDataTable(string sql)
            {
                SqlConnection cn = new SqlConnection(ConnectionString);
                SqlDataAdapter da = new SqlDataAdapter(sql, cn);
                DataTable ds = new DataTable();
                da.Fill(ds);
                return ds;
            }
    
    

    第四:在运行前,你还需要建立WORD模板。

    创建方法:

    打开WORD-插入-文档部件-域

    如图输入域名,记得与 fieldNames 中字字段对应。

    String[] fieldNames = new String[]
                        {
                        "Fanghao",
                        "RegDate",
                        "UserName",
                        "Gender",
                        "Minzu",
                        "Zhengzhimm",
                        "IdCard",
                        "Qianchudi",
                        "Tel",
                        "Shuxing",
                        "BankZh",
                        "Gongyigang"
                        };

    循环生成区域插入:输入开始标识:TableStart:UserList,这里的 UserList 要与 dt.TableName = "UserList"对应,这样DataTable中的数据才会对应填充到表格中。

    再输入其他字段

    最后记得同样输入一个结束标识:TableEnd:UserList,把下方多余的行删除,在WORD模板生成时,会自动向下填充的。

    第五:完成以上工作,就可以调用了,调用就很简单了。

    我使用的WEB服务,然后使用AJAX调用,你也可以直接使用方法就可以调用了。

    HTML代码
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="comm_test" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
            </div>
        </form>
    </body>
    </html>
    
    调用代码
    protected void Button1_Click(object sender, EventArgs e)
        {
            string houseid = "testid";
            GetWordEvent(houseid);
        }

     

    展开全文
  • <?...namespace Home\Controller; ... use Think\Controller; class TestController extends ... * word模板生成word文档 * composer安装命令:composer require phpoffice/phpword * 地址:https://packagist.o.
  • 最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,包括试卷格式的排版和图片的写入。这是用freemarker模板生成word文档。里面包括完整代码和所需jar包。
  • 用word模板导出word文档

    千次阅读 热门讨论 2016-09-05 21:10:19
    项目需求要把页面上的分析结果导出为word文档,实现的办法是POI。查了一下网上很多方式都采用FreeMark,自己认为比较麻烦,所以还是采取了POI导出。之前的框架是SSH的,现在换成了Spring MVC,这次也把导出代码整理...
  • C# 替换Word文档中的图片

    千次阅读 2017-06-05 17:08:33
    图片Word文档中非常常见的一种元素,我们在处理Word文档时经常会对图片进行如添加,提取,替换和删除等操作。之前我已经介绍过如何提取Word文档中的图片,这篇文章将介绍如何使用C#和免费Word组件Free Spire.Doc来...
  • 该文档从第三行开始,每一行代表一个化石及其相关的登记资料,如图1,现在需要将每一行数据的内容,填写到对应的word文档中,并将入库照片编号对应的照片插入对应位置,如图2,最后要求不能生成单个的word文档,因为...
  • 使用word模板生成word文档的各类方案生成word的各种方案word另存xml进行后续处理2003版本word(.doc)的xml处理并生成word2007版本word(.docx)的xml处理poi直接操作word对象进行文本替换生成word使用poi-tl库对模板...
  • C# 设置Word文档图片的大小

    千次阅读 2018-02-09 16:59:26
    在创建Word文档时,我们经常需要向文档中插入图片,但插入图片的大小有时候可能会太大或太小,这时候我们就需要对图片的大小进行调整,使得图片与文章更加协调、美观。这篇文章将介绍如何使用Free Spire.Doc组件和C#...
  • 根据模板生成带有图片word 文档

    千次阅读 2017-11-29 11:06:09
    word 模板 java 获取数据替换模板中的变量 //将替换的变量放在map 中 //①文本 Map map = new HashMap(); map.put("${TITLE}", title); map.put("${ORGNAME}", orgname); map.put("${TJDATE}", ...
  • 使用poi组件自动填充模板word的内容和图片.
  • 最近因为java项目中有大量的图片需要导出到word(采用freemarker导出模板),导出的过程中发现一个问题:导出饼图的时候会随着浏览器的大小不同被拉长或者拉伸,查阅很多质料但网上并没有找到相关的解决办法,因此...
  • Python 技术篇-操作word文档插入图片和表格实例演示

    千次阅读 多人点赞 2020-10-22 22:31:10
    Python 技术篇-操作word文档插入图片和表格实例演示。 from docx import Document from docx.shared import Pt # 添加图片,后面的参数设置图片尺寸,可以选填 doc.add_picture(path + 'cat.jpg', width=Pt(300)) # ...
  • C#、NPOI生成Word文档模板

    万次阅读 2018-08-03 16:23:05
    敲代码要养成好习惯,项目需要集成word导出,学习接触了npoi,因为做的时候网上文档资源不是很多,也比较杂乱,所以查了查,整理了整理,做个记录,也顺便把NPOI操作Word文档的一些基本套路分享给有需要的朋友。...
  • VB.NET实现将数据导入WORD模板中,并生成新的WORD文档,需要在WORD中设置书签,用数据替换即可。可以将图片导入WORD,但是无法控制图片位置。
  • 最近项目中要使用到导出word这项功能,参考了许多导出的方法,发现使用freemarker模板导出word的效果最好可以保持原样。 导入freemarker的架包 1.首先我们需要用word制作一份模板,打开word编辑我们想要的word样式...
  • c#基于模板Word文档操作,读取,添加行,内容及图片的添加!
  • freemarker 简介: FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。...它不仅可以用作表现层的实现技术,而且还可以用于...找到Word模板文件,将文件另存为*xml 格式 修改xml 文件,添加...
  • 使用模板引擎生成复杂Word文档

    千次阅读 2018-05-22 00:09:52
    先准备好word文档模板,进行排版等操作,在需要替换填写变量字符,然后保存为xml格式。例如在word中写入以下信息2.另存为xml格式(个人使用时都是保存为2003的xml,最好别用wps,生成的xml可能会有些出...
  • 前言 最近因项目需要要自定义标准word模板,并以编码方式操作word模板、填充数据和生成word文档,...
  • 使用freemarker模板生成word文档

    千次阅读 2019-02-19 11:07:41
    如下图,先准备好一个(office2003)word文档当做模板。文档中图片、姓名、性别和生日已经使用占位符代替,生成过程中将会根据实际情况进行替换。 然后将word文档另存为“Word XML文档” 使用xml编辑器打开...
  • 按照模板java动态生成word文档

    千次阅读 2019-01-18 16:04:24
    最近在做一个出卷系统,需要通过试卷模板从数据库中抽取题目,然后按照模板的样式生成完整的试卷,所以研究了一下,通过Java生成word文档的方法。我尝试了不同的方法,1、使用freemarker模板生成word文档;2、使用...
  • 利用freemarker导出word文档 表格含图片 先贴上效果图 实现步骤 1.制作Word文档,完成后另存为.xml文件,在需要填充参数的地方${xxx}代替,需要显示图片的地方插入图片占个位置 2.xml文件模板 ,需要动态循环的行 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,960
精华内容 7,184
关键字:

word文档模板图片