精华内容
下载资源
问答
  • 背景:java 制作word模板中,多选框错误,如图所示 分析与处理:当前属性可能为office的关键字,换一个属性名即可,如图所示

    背景:java 制作word模板中,多选框错误,如图所示

                         

    分析与处理:当前属性可能为office的关键字,换一个属性名即可,如图所示

     

    展开全文
  • 展开全部先下载jacob_1.10.1.zip。解压后将jacob.dll放到windows/system32下面或\j2.../** Java2word.java** Created on 2007年8月13日, 上午10:32** Tochange this template, choose Tools | Template Manager* and...

    展开全部

    先下载jacob_1.10.1.zip。

    解压后将jacob.dll放到windows/system32下面或\j2sdk\bin下面。

    将jacob.jar加入项目。

    /*

    * Java2word.java

    *

    * Created on 2007年8月13日, 上午10:32

    *

    * To

    change this template, choose Tools | Template Manager

    * and open the template

    in the editor.

    */

    /*

    * 传入数据为HashMap对象,32313133353236313431303231363533e78988e69d8331333337396261对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。

    *

    word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……,

    以免执行错误的替换。

    *

    所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、

    .jpg、.gif)。

    *

    要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表

    word模板中的第N张表格;Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代

    表一行数据,ArrayList中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第三列、

    第五列的数据,则第一条记录为String[3]

    {“1”,”3”,”5”}。

    */

    package com.word.util;

    /**

    *

    * @author kdl

    */

    import java.util.ArrayList;

    import

    java.util.HashMap;

    import java.util.Iterator;

    import com.jacob.activeX.ActiveXComponent;

    import

    com.jacob.com.Dispatch;

    import com.jacob.com.Variant;

    public class Java2word {

    private boolean saveOnExit;

    /**

    * word文档

    */

    Dispatch doc = null;

    /**

    * word运行程序对象s

    */

    private ActiveXComponent

    word;

    /**

    * 所有word文档

    */

    private Dispatch

    documents;

    /**

    * 构造函数

    */

    public Java2word() {

    if(word==null){

    word = new

    ActiveXComponent("Word.Application");

    word.setProperty("Visible",new

    Variant(false));

    }

    if(documents==null)

    documents = word.getProperty("Documents").toDispatch();

    saveOnExit =

    false;

    }

    /**

    * 设置参数:退出时是否保存

    * @param

    saveOnExit boolean true-退出时保存文件,false-退出时不保存文件

    */

    public void

    setSaveOnExit(boolean saveOnExit) {

    this.saveOnExit =

    saveOnExit;

    }

    /**

    * 得到参数:退出时是否保存

    * @return

    boolean true-退出时保存文件,false-退出时不保存文件

    */

    public boolean

    getSaveOnExit() {

    return saveOnExit;

    }

    /**

    * 打开文件

    * @param inputDoc String 要打开的文件,全路径

    *

    @return Dispatch 打开的文件

    */

    public Dispatch open(String inputDoc)

    {

    return

    Dispatch.call(documents,"Open",inputDoc).toDispatch();

    //return

    Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new

    int[1]).toDispatch();

    }

    /**

    * 选定内容

    *

    @return Dispatch 选定的范围或插入点

    */

    public Dispatch select()

    {

    return word.getProperty("Selection").toDispatch();

    }

    /**

    * 把选定内容或插入点向上移动

    * @param selection

    Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public

    void moveUp(Dispatch selection,int count) {

    for(int i = 0;i <

    count;i ++)

    Dispatch.call(selection,"MoveUp");

    }

    /**

    * 把选定内容或插入点向下移动

    * @param selection

    Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public

    void moveDown(Dispatch selection,int count) {

    for(int i = 0;i <

    count;i ++)

    Dispatch.call(selection,"MoveDown");

    }

    /**

    * 把选定内容或插入点向左移动

    * @param selection

    Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public

    void moveLeft(Dispatch selection,int count) {

    for(int i = 0;i <

    count;i ++) {

    Dispatch.call(selection,"MoveLeft");

    }

    }

    /**

    * 把选定内容或插入点向右移动

    * @param

    selection Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public void moveRight(Dispatch selection,int count) {

    for(int i =

    0;i < count;i ++)

    Dispatch.call(selection,"MoveRight");

    }

    /**

    *

    把插入点移动到文件首位置

    * @param selection Dispatch 插入点

    */

    public

    void moveStart(Dispatch selection) {

    Dispatch.call(selection,"HomeKey",new Variant(6));

    }

    /**

    * 从选定内容或插入点开始查找文本

    * @param selection Dispatch

    选定内容

    * @param toFindText String 要查找的文本

    * @return boolean

    true-查找到并选中该文本,false-未查找到文本

    */

    public boolean find(Dispatch

    selection,String toFindText) {

    //从selection所在位置开始查询

    Dispatch find = word.call(selection,"Find").toDispatch();

    //设置要查找的内容

    Dispatch.put(find,"Text",toFindText);

    //向前查找

    Dispatch.put(find,"Forward","True");

    //设置格式

    Dispatch.put(find,"Format","True");

    //大小写匹配

    Dispatch.put(find,"MatchCase","True");

    //全字匹配

    Dispatch.put(find,"MatchWholeWord","True");

    //查找并选中

    return Dispatch.call(find,"Execute").getBoolean();

    }

    /**

    * 把选定内容替换为设定文本

    * @param selection

    Dispatch 选定内容

    * @param newText String 替换为文本

    */

    public

    void replace(Dispatch selection,String newText) {

    //设置替换文本

    Dispatch.put(selection,"Text",newText);

    }

    /**

    * 全局替换

    * @param selection Dispatch

    选定内容或起始插入点

    * @param oldText String 要替换的文本

    * @param newText

    String 替换为文本

    */

    public void replaceAll(Dispatch

    selection,String oldText,Object replaceObj) {

    //移动到文件开头

    moveStart(selection);

    if(oldText.startsWith("table") ||

    replaceObj instanceof ArrayList)

    replaceTable(selection,oldText,(ArrayList) replaceObj);

    else

    {

    String newText = (String) replaceObj;

    if(newText==null)

    newText="";

    if(oldText.indexOf("image") != -1&!newText.trim().equals("") ||

    newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 ||

    newText.lastIndexOf(".gif") != -1){

    while(find(selection,oldText)) {

    replaceImage(selection,newText);

    Dispatch.call(selection,"MoveRight");

    }

    }else{

    while(find(selection,oldText))

    {

    replace(selection,newText);

    Dispatch.call(selection,"MoveRight");

    }

    }

    }

    }

    /**

    * 替换图片

    * @param

    selection Dispatch 图片的插入点

    * @param imagePath String 图片文件(全路径)

    */

    public void replaceImage(Dispatch selection,String imagePath)

    {

    Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);

    }

    /**

    * 替换表格

    * @param selection Dispatch

    插入点

    * @param tableName String

    表格名称,形如table$1@1、table$2@1...table$R@N,R代表从表格中的第N行开始填充,N代表word文件中的第N张表

    * @param fields HashMap 表格中要替换的字段与数据的对应表

    */

    public void

    replaceTable(Dispatch selection,String tableName,ArrayList dataList)

    {

    if(dataList.size() <= 1) {

    System.out.println("Empty table!");

    return;

    }

    //要填充的列

    String[] cols = (String[])

    dataList.get(0);

    //表格序号

    String tbIndex =

    tableName.substring(tableName.lastIndexOf("@") + 1);

    //从第几行开始填充

    int fromRow =

    Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") +

    1,tableName.lastIndexOf("@")));

    //所有表格

    Dispatch tables =

    Dispatch.get(doc,"Tables").toDispatch();

    //要填充的表格

    Dispatch table = Dispatch.call(tables,"Item",new

    Variant(tbIndex)).toDispatch();

    //表格的所有行

    Dispatch rows =

    Dispatch.get(table,"Rows").toDispatch();

    //填充表格

    for(int

    i = 1;i < dataList.size();i ++) {

    //某一行数据

    String[] datas = (String[]) dataList.get(i);

    //在表格中添加一行

    if(Dispatch.get(rows,"Count").getInt() < fromRow +

    i - 1)

    Dispatch.call(rows,"Add");

    //填充该行的相关列

    for(int j = 0;j < datas.length;j ++)

    {

    //得到单元格

    Dispatch cell =

    Dispatch.call(table,"Cell",Integer.toString(fromRow + i -

    1),cols[j]).toDispatch();

    //选中单元格

    Dispatch.call(cell,"Select");

    //设置格式

    Dispatch font = Dispatch.get(selection,"Font").toDispatch();

    Dispatch.put(font,"Bold","0");

    Dispatch.put(font,"Italic","0");

    //输入数据

    Dispatch.put(selection,"Text",datas[j]);

    }

    }

    }

    /**

    * 保存文件

    * @param outputPath String

    输出文件(包含路径)

    */

    public void save(String outputPath) {

    Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);

    }

    /**

    * 关闭文件

    * @param document Dispatch

    要关闭的文件

    */

    public void close(Dispatch doc) {

    Dispatch.call(doc,"Close",new Variant(saveOnExit));

    word.invoke("Quit",new Variant[]{});

    word = null;

    }

    /**

    * 根据模板、数据生成word文件

    * @param inputPath

    String 模板文件(包含路径)

    * @param outPath String 输出文件(包含路径)

    * @param

    data HashMap 数据包(包含要填充的字段、对应的数据)

    */

    public void toWord(String

    inputPath,String outPath,HashMap data) {

    String oldText;

    Object newValue;

    try {

    if(doc==null)

    doc = open(inputPath);

    Dispatch selection =

    select();

    Iterator keys =

    data.keySet().iterator();

    while(keys.hasNext())

    {

    oldText = (String) keys.next();

    newValue = data.get(oldText);

    replaceAll(selection,oldText,newValue);

    }

    save(outPath);

    } catch(Exception

    e) {

    System.out.println("操作word文件失败!");

    e.printStackTrace();

    } finally {

    if(doc !=

    null)

    close(doc);

    }

    }

    本回答由电脑网络分类达人 李孝忠推荐

    2Q==

    已赞过

    已踩过<

    你对这个回答的评价是?

    评论

    收起

    展开全文
  • word模板出错解决

    2012-08-03 10:58:07
    解决word模板出错无法正常开启的情况,使用前必须确认word进程已经关闭。
  • * word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……, 以免执行错误的替换。 * 所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件...

    用到的工具:jacob-1.17-M2.zip,文件解压后主要有三个文件:jacob.jar、jacob-1.17-M2-x64.dll和jacob-1.17-M2-x86.dll。

    jacob.jar引入到项目工程中,jacob-1.17-M2-x64.dll放在C:\Windows\System32下,如果系统是32位的则把jacob-1.17-M2-x86.dll放在C:\Windows\System32下。

    注意:文件名要用.doc,万不能用.docx。那样会打不开文件

    代码示例:

    /*

    * Java2word.java

    *

    * Created on 2007年8月13日, 上午10:32

    *

    * To change this template, choose Tools | Template Manager

    * and open the template in the editor.

    */

    /*

    * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段,Value代表用来替换的值。

    * word模板中所有要替换的字段(即HashMap中的Key)以特殊字符开头和结尾,如:$code$、$date$……,

    以免执行错误的替换。

    * 所有要替换为图片的字段,Key中需包含image或者Value为图片的全路径(目前只判断文件后缀名为:.bmp、

    .jpg、.gif)。

    * 要替换表格中的数据时,HashMap中的Key格式为“table$R@N”,其中:R代表从表格的第R行开始替换,N代表

    word模板中的第N张表格;Value为ArrayList对象,ArrayList中包含的对象统一为String[],一条String[]代

    表一行数据,ArrayList中第一条记录为特殊记录,记录的是表格中要替换的列号,如:要替换第一列、第三列、

    第五列的数据,则第一条记录为String[3] {“1”,”3”,”5”}。

    */

    package yz;

    /**

    *

    * @author kdl

    */

    import java.util.ArrayList;

    import java.util.HashMap;

    import java.util.Iterator;

    import com.jacob.activeX.ActiveXComponent;

    import com.jacob.com.Dispatch;

    import com.jacob.com.Variant;

    public class Java2word {

    private boolean saveOnExit;

    /**

    * word文档

    */

    Dispatch doc = null;

    /**

    * word运行程序对象s

    */

    private ActiveXComponent word;

    /**

    * 所有word文档

    */

    private Dispatch documents;

    /**

    * 构造函数

    */

    public Java2word() {

    if(word==null){

    word = new ActiveXComponent("Word.Application");

    word.setProperty("Visible",new Variant(false));

    }

    if(documents==null)

    documents = word.getProperty("Documents").toDispatch();

    saveOnExit = false;

    }

    /**

    * 设置参数:退出时是否保存

    * @param saveOnExit boolean true-退出时保存文件,false-退出时不保存文件

    */

    public void setSaveOnExit(boolean saveOnExit) {

    this.saveOnExit = saveOnExit;

    }

    /**

    * 得到参数:退出时是否保存

    * @return boolean true-退出时保存文件,false-退出时不保存文件

    */

    public boolean getSaveOnExit() {

    return saveOnExit;

    }

    /**

    * 打开文件

    * @param inputDoc String 要打开的文件,全路径

    * @return Dispatch 打开的文件

    */

    public Dispatch open(String inputDoc) {

    return Dispatch.call(documents,"Open",inputDoc).toDispatch();

    //return Dispatch.invoke(documents,"Open",Dispatch.Method,new Object[]{inputDoc},new int[1]).toDispatch();

    }

    /**

    * 选定内容

    * @return Dispatch 选定的范围或插入点

    */

    public Dispatch select() {

    return word.getProperty("Selection").toDispatch();

    }

    /**

    * 把选定内容或插入点向上移动

    * @param selection Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public void moveUp(Dispatch selection,int count) {

    for(int i = 0;i < count;i ++)

    Dispatch.call(selection,"MoveUp");

    }

    /**

    * 把选定内容或插入点向下移动

    * @param selection Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public void moveDown(Dispatch selection,int count) {

    for(int i = 0;i < count;i ++)

    Dispatch.call(selection,"MoveDown");

    }

    /**

    * 把选定内容或插入点向左移动

    * @param selection Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public void moveLeft(Dispatch selection,int count) {

    for(int i = 0;i < count;i ++) {

    Dispatch.call(selection,"MoveLeft");

    }

    }

    /**

    * 把选定内容或插入点向右移动

    * @param selection Dispatch 要移动的内容

    * @param count int 移动的距离

    */

    public void moveRight(Dispatch selection,int count) {

    for(int i = 0;i < count;i ++)

    Dispatch.call(selection,"MoveRight");

    }

    /**

    * 把插入点移动到文件首位置

    * @param selection Dispatch 插入点

    */

    public void moveStart(Dispatch selection) {

    Dispatch.call(selection,"HomeKey",new Variant(6));

    }

    /**

    * 从选定内容或插入点开始查找文本

    * @param selection Dispatch 选定内容

    * @param toFindText String 要查找的文本

    * @return boolean true-查找到并选中该文本,false-未查找到文本

    */

    public boolean find(Dispatch selection,String toFindText) {

    //从selection所在位置开始查询

    Dispatch find = word.call(selection,"Find").toDispatch();

    //设置要查找的内容

    Dispatch.put(find,"Text",toFindText);

    //向前查找

    Dispatch.put(find,"Forward","True");

    //设置格式

    Dispatch.put(find,"Format","True");

    //大小写匹配

    Dispatch.put(find,"MatchCase","True");

    //全字匹配

    Dispatch.put(find,"MatchWholeWord","True");

    //查找并选中

    return Dispatch.call(find,"Execute").getBoolean();

    }

    /**

    * 把选定内容替换为设定文本

    * @param selection Dispatch 选定内容

    * @param newText String 替换为文本

    */

    public void replace(Dispatch selection,String newText) {

    //设置替换文本

    Dispatch.put(selection,"Text",newText);

    }

    /**

    * 全局替换

    * @param selection Dispatch 选定内容或起始插入点

    * @param oldText String 要替换的文本

    * @param newText String 替换为文本

    */

    public void replaceAll(Dispatch selection,String oldText,Object replaceObj) {

    //移动到文件开头

    moveStart(selection);

    if(oldText.startsWith("table") || replaceObj instanceof ArrayList)

    replaceTable(selection,oldText,(ArrayList) replaceObj);

    else {

    String newText = (String) replaceObj;

    if(newText==null)

    newText="";

    if(oldText.indexOf("image") != -1&!newText.trim().equals("") || newText.lastIndexOf(".bmp") != -1 || newText.lastIndexOf(".jpg") != -1 || newText.lastIndexOf(".gif") != -1){

    while(find(selection,oldText)) {

    replaceImage(selection,newText);

    Dispatch.call(selection,"MoveRight");

    }

    }else{

    while(find(selection,oldText)) {

    replace(selection,newText);

    Dispatch.call(selection,"MoveRight");

    }

    }

    }

    }

    /**

    * 替换图片

    * @param selection Dispatch 图片的插入点

    * @param imagePath String 图片文件(全路径)

    */

    public void replaceImage(Dispatch selection,String imagePath) {

    Dispatch.call(Dispatch.get(selection,"InLineShapes").toDispatch(),"AddPicture",imagePath);

    }

    /**

    * 替换表格

    * @param selection Dispatch 插入点

    * @param tableName String 表格名称,形如table$1@1、table$2@1...table$R@N,R代表从表格中的第N行开始填充,N代表word文件中的第N张表

    * @param fields HashMap 表格中要替换的字段与数据的对应表

    */

    public void replaceTable(Dispatch selection,String tableName,ArrayList dataList) {

    if(dataList.size() <= 1) {

    System.out.println("Empty table!");

    return;

    }

    //要填充的列

    String[] cols = (String[]) dataList.get(0);

    //表格序号

    String tbIndex = tableName.substring(tableName.lastIndexOf("@") + 1);

    //从第几行开始填充

    int fromRow = Integer.parseInt(tableName.substring(tableName.lastIndexOf("$") + 1,tableName.lastIndexOf("@")));

    //所有表格

    Dispatch tables = Dispatch.get(doc,"Tables").toDispatch();

    //要填充的表格

    Dispatch table = Dispatch.call(tables,"Item",new Variant(tbIndex)).toDispatch();

    //表格的所有行

    Dispatch rows = Dispatch.get(table,"Rows").toDispatch();

    //填充表格

    for(int i = 1;i < dataList.size();i ++) {

    //某一行数据

    String[] datas = (String[]) dataList.get(i);

    //在表格中添加一行

    if(Dispatch.get(rows,"Count").getInt() < fromRow + i - 1)

    Dispatch.call(rows,"Add");

    //填充该行的相关列

    for(int j = 0;j < datas.length;j ++) {

    //得到单元格

    Dispatch cell = Dispatch.call(table,"Cell",Integer.toString(fromRow + i - 1),cols[j]).toDispatch();

    //选中单元格

    Dispatch.call(cell,"Select");

    //设置格式

    Dispatch font = Dispatch.get(selection,"Font").toDispatch();

    Dispatch.put(font,"Bold","0");

    Dispatch.put(font,"Italic","0");

    //输入数据

    Dispatch.put(selection,"Text",datas[j]);

    }

    }

    }

    /**

    * 保存文件

    * @param outputPath String 输出文件(包含路径)

    */

    public void save(String outputPath) {

    Dispatch.call(Dispatch.call(word,"WordBasic").getDispatch(),"FileSaveAs",outputPath);

    }

    /**

    * 关闭文件

    * @param document Dispatch 要关闭的文件

    */

    public void close(Dispatch doc) {

    Dispatch.call(doc,"Close",new Variant(saveOnExit));

    word.invoke("Quit",new Variant[]{});

    word = null;

    }

    /**

    * 根据模板、数据生成word文件

    * @param inputPath String 模板文件(包含路径)

    * @param outPath String 输出文件(包含路径)

    * @param data HashMap 数据包(包含要填充的字段、对应的数据)

    */

    public void toWord(String inputPath,String outPath,HashMap data) {

    String oldText;

    Object newValue;

    try {

    if(doc==null)

    doc = open(inputPath);

    Dispatch selection = select();

    Iterator keys = data.keySet().iterator();

    while(keys.hasNext()) {

    oldText = (String) keys.next();

    newValue = data.get(oldText);

    replaceAll(selection,oldText,newValue);

    }

    save(outPath);

    } catch(Exception e) {

    System.out.println("操作word文件失败!");

    e.printStackTrace();

    } finally {

    if(doc != null)

    close(doc);

    }

    }

    public synchronized static void word(String inputPath,String outPath,HashMap data){

    Java2word j2w = new Java2word();

    j2w.toWord(inputPath,outPath,data);

    }

    public static void main(String[] args) {

    HashMap data = new HashMap();

    data.put("$code$","2007-8-1");

    data.put("$date$","2007-8-2");

    data.put("$img$","E:\\资料\\1.jpg");

    /*

    ArrayList table = new ArrayList(3);

    String[] fieldName = {"1","3","5"};

    table.add(fieldName);

    String[] field1 = {"1","751002","华夏证券"};

    table.add(field1);

    String[] field2 = {"2","751004","国泰君安"};

    table.add(field2);

    String[] field3 = {"3","751005","海通证券"};

    table.add(field3);

    data.put("table$3@2",table);

    ArrayList table1 = new ArrayList(3);

    String[] fieldName1 = {"1","2","3"};

    table1.add(fieldName1);

    String[] field11 = {"1","751002","华夏证券"};

    table1.add(field11);

    String[] field21 = {"2","751004","国泰君安"};

    table1.add(field21);

    String[] field31 = {"3","751005","海通证券"};

    table1.add(field31);

    data.put("table$2@1",table1);

    */

    Java2word j2w = new Java2word();

    long time1 = System.currentTimeMillis();

    j2w.toWord("E:\\资料\\Template.doc","E:\\资料\\result.doc",data);

    System.out.println("time cost : " + (System.currentTimeMillis() - time1));

    }

    }

    展开全文
  • word2003模板

    2011-06-21 11:27:59
    word无法打开,提示错误,安全模式下打开,需要更换此模板,重装软件都不好用。必须替换此模板
  • java根据word模板导出word文件

    千次阅读 2020-10-27 15:08:03
    前言:java导出word有很多方式,这里介绍最简单的一种,利用freemark模板导出word文档。 说明:这里用导出一个list列表数据到word文档来举例 首先导入freeamark依赖,版本号最好不要太低,在maven依赖官网找使用...

    前言:java导出word有很多方式,这里介绍最简单的一种,利用freemark模板导出word文档。


    说明:这里用导出一个list列表数据到word文档来举例

    首先导入freeamark依赖,版本号最好不要太低,在maven依赖官网找使用次数最多的附maven依赖地址:https://mvnrepository.com/

    1、将list数据导出到word数据模板如图所示,字段的值暂时用数字1-7代替,这里说明一下为什么要用1-7的数字代替字段值,因为一会要把doc格式的文件转换成xml,这里如果直接填写变量的值的话变量值如果过长会导致word格式发生变化,从而导致解析出来的xml有问题,到最后会影响导出的word文档格式没都没了的情况(这是个坑,我试了很多次才发现是因为变量过长导致的word格式变形从而导致的解析出来的xml文件有问题)

     2.模板建好以后直接另存为xml,这里上图给你们讲一下怎么另存xml,我发现好多人不知道怎么另存为xml,我这里以wps为例子(word office 也一样),点击左上角的文件,找到另存为,选择另存的位置以及格式,这里选择xml如图所示

     

    3.之后我们可以在存放文件的地方得到一个xml文件如图所示

     

    4.使用 可以打开xml文件的工具打开文件,我这里用的是Notepad++

    将文件中的内容复制出来,去在线格式化一下格式,我这里用的是菜鸟教程的在线格式化地址:https://c.runoob.com/front-end/710 

    将格式化之后的内容复制回 Notepad++,接下来就是对xml中的内容做修改。

    5.我们的word表格一共两行,第一行为标题,第二行为我们需要设置的字段值,找到文件中第二个<w:tr></w:tr>标签

     因为我们是将list数据循环设置到word中,所以需要遍历值,遍历语法是freemark的遍历语法,挺简单的,用<#list userList as user></#list>标签将第二行的<w:tr></w:tr>包裹起来如图所示,userList就是你要遍历的list,user就是list中的每个元素,相当于foreach中的item=userList var=user都是一个意思,实在看不懂建议百度一下吧。

    写完外面的循环标签,在设置里面的字段值,找到之前我们填写1-7数字的地方,1为序号,我们用${user_index+1}表示,这样可以自增序号,2-7为user这个实体中的属性,直接替换成${user.属性}即可,不过这里有一点需要注意,就是要对值进行非空判断,不然如果有的值为空就会出现模板解析错误。这里只写一个例子,其他的同理,如图所示

     

     所有属性都替换成如上图的格式以后保存xml文件,然后转换成ftl格式的文件,这里转换不需要像doc转xml一样,直接重命名然后改后缀名即可,如图所示

    6.这样我们的模板就做好了,个人认为模板这里是最麻烦的,因为坑比较多,所以我也是踩了好多坑,最后才成功了,还有一点要说一下,这里最好用doc格式。代码部分比较简单,直接贴代码了,直接copy就可以用

    	/**
    	 * 导出word
    	 *
    	 * @param request
    	 * @param response
    	 */
    	@RequestMapping(params = "exportDoc")
    	public void exportDoc(HttpServletRequest request, HttpServletResponse response,String proId) {
    		//查询专家列表数据
    		List<TSUser> expertList = sinoExaminepaperServiceI.selPaperUser(proId, 0);
            Map<String, List<TSUser>> dataMap = new HashMap<>();
            List<TSUser> list = new ArrayList<>();
            if (expertList != null && expertList.size() > 0) {
    			for (TSUser tsUser : expertList) {
    			    list.add(tsUser);
    			}
    		}
    		dataMap.put("userList",list);
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_29);
            configuration.setDefaultEncoding("utf-8");
    
            PrintWriter out = null;
            Template t = null;
            try {
                configuration.setDirectoryForTemplateLoading(new File(request.getSession().getServletContext().getRealPath("/")+"webpage/com/sino/secretariatexamine/word/"));
                response.reset();
                response.setHeader("Content-Disposition", "attachment;filename=\"" + new String("征求意见专家名单.doc".getBytes("GBK"), "iso8859-1") + "\"");
                response.setContentType("application/x-download;charset=GBK");
                response.setCharacterEncoding("utf-8");
                out = response.getWriter();
                t = configuration.getTemplate("expertList.ftl","utf-8");
                t.process(dataMap, out);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                out.close();
            }
    
    
        }

     这里是我的业务代码部分,想要使用的要做相应的修改,我做的是一个专家列表数据导出功能,list根据情况修改成要查询的list数据,注意list的key userList,这里的key是和模板中<#list userList as user></#list> 中对应的。

    根据各自情况需要修改的有以下几个部分

    1.查询出来的list

    2.new Configuration(Configuration.VERSION_2_3_29),这里的freemark模板版本改成你maven中导入的freemark模板的版本

    3.设置模板加载地址的路径需要做相应的修改,可以参考https://www.cnblogs.com/fangjian0423/p/freemarker-templateloading-question.html 看下configuration设置加载模板的三个方法

    4.configuration.getTemplate里面填写你的模板名字(我这里将ceshi.ftl改成了expertList.ftl)

     

    补充:如果不是导出list列表数据,只导出一个实体数据,比如自动填写简历那种,更简单,直接将dataMap.put中的list改为实体就行了,然后制作模板的时候去掉外层的list循环,在字段的地方直接${实体的属性}这样就行了,我这里是设置了响应头下载了,如果在本地玩还可以直接将word生成写到磁盘文件中,代码我就不贴了,有需要的可以去百度下。

     

    代码部分相对来说比较简单,只要搞清楚一些设置参数的含义,修改成你项目中相对应的参数就可以了。然后启动项目进行测试就OK了,结果如图,大功告成!

     

     

     

     

     

     

    展开全文
  • 使用java Apache poi 根据word模板生成word报表

    万次阅读 多人点赞 2018-03-24 16:19:37
    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行。 代码示例下载:...
  • Java根据word模板生成word文档之后台解析和实现及部分代码(一)后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换。首先想多说一句就是jacob会每次...
  • 因为客户发了一个模板我,让我照着模板做个导出功能,因为有很多客户自己用word画的图片,然后我按照正常操作,做好后,导出的word一直提示文件错误,无法打开!代码错误行就是显示这行docOleData代码有问题,这个...
  • 此应用程序为Word 打开提示安全启动 | Word模版错误~在公司或单位很多人会遇到此类问题,若非专业人员感觉头痛无比,此程序为一键修复方便快捷,绝对是你心目中的救星! 程序说明:小程序为个人编写,程序中无任何...
  • 按理说用poi是可以解决的,但是目前的痛点在于,监测数据的种类很多,每种监测数据的word模板也各不相同,并且在将来文档模板内容以及排版样式还会有变化。使用poi的方式,会使工作量剧增,将来扩展也存在很大的问题...
  • 打开word新建你的模板文档。 另存为,选择保存类型为xxx模板,这时保存位置会发生变化,不要修改,直接保存。 新建,点击 自定义 进入文件夹 便可找到。
  • /*** 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段。Value代表用来替换的值。* word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾。* 如:$code$、$date$……。以免执行错误的...
  • /** * @program demo01 * @description 核心工具类 * @author: Sun Jinxin * @create: 2021/11/30 14:50 */ public class WorderToNewWordUtils { /** * 根据模板生成word文档 * * @param inputUrl 模板路径 * @...
  • 打开word时424错误

    千次阅读 多人点赞 2020-12-02 10:02:27
    原因:word启动时自动加载的模板出现了问题 解决办法:将路径C:\user\(用户名)\AppData\Roaming\Microsoft\Word\Startup下的文件全部删除即可
  • .Net NPOI Word模板关键内容替换

    千次阅读 2019-04-26 17:34:32
    一、问题需求 在开发的一个项目中,需要根据给定的文档模板,将...第二页的数据会显示在封面中,而且使用SetLeading也无法把控间距,后来想到了,使用Word模板,将需要替换的内容设置成固定的标签,然后将新的word...
  • C#操作Word书签模板

    千次阅读 2017-04-18 11:30:05
    C#操作Word书签模板 一制作模板   1 新建一个文档,设置文档内容。对于循环的部分,建议放到表格内,这样容易定位、选择、复制、粘贴。 2 将鼠标定位到要插入书签的位置,从菜单上,“插入”->“书签”,弹出...
  • 文章目录1、背景首次签合同人员.xlsx模板:简易劳动合同.docx2、python代码问题3、word vba1) 根据模板批量生成文件2) 批量打印文件4、总结:5、PS: 1、背景 行政部的同事每次都要根据excel里面的信息,制作word版的...
  • 关于用Java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数...首先我们的需求是通过一个指定的word模板来生成新的word并且填充内容,内容是我们在布局页面上面就写好的,比如说EditText,TextView
  • VS使用NPOI替换word模板中的关键字

    千次阅读 2019-04-26 12:05:07
    使用NPOI替换word模板中的关键字简介思路模板实例引入NPOI程序扩展代码实现使用实例结果实例请多指教 简介 由于项目需求,需要根据现有的word模板,进行批量生成word报表,为了方便,选用的是 NPOI (NPOI是一个开源...
  • 自己总结的近千行常见算法代码,有备注标明错误提示。包括了基本的输入输出,以及函数传参,还有众多常见的算法,比如斐波那契数列等等。标明了诸多易错点,最重要的是是在word中实现了代码的完美统一,可以直接复制...
  • word模板损坏修复

    2021-01-14 15:23:16
    将引号里面的“%appdata%\microsoft\templates”粘贴到“运行”,回车:删除normal.dot。2.删除微软输入法3.0(右键点击输入法图标——设置——设置)3、点开始,在运行中输入“winword/a”,启动word,,依次点击工具...
  • Word模板中的语法 Word的基本语法(与jinja2相似) 基本语法 变量取值 {{ }} 条件控制{% %} 注释{# #} 过滤器 title: 把值中每个单词的首字母都转换成大写 trim: 把值的首尾空格去掉 join: 拼接多个值为字符串 ...
  • 使用Tkinter可以避免打字错误,并且可以在30秒内创建字母,而不是手动打开每个单词模板,而是仔细地输入适当的字段以避免输入错误,并将Word和PDF文件保存在正确的位置。 在Word中以包含合并字段的字母开头(在...
  • 总结,之前在网上查到这个资料怎么调试都失败,后来经过反复查找发现是编码问题导致生成word格式错误,已经修正,希望能给大家带来帮助。 效率测试生成100000行数据大概4000毫秒左右 完整程序代码已经上传! 关于...
  • Java使用模板导出word文档需要导入freemark的jar包使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置。尽量不要在写字符串的时候就加上${},xml文件会让它和字符串...
  • 首先,我们需要安装docx-mailmerge包。在命令行中输入语句开始安装包。...这个词在模板,将鼠标光标移动到你的地方插入数据,然后操作如下图所示:点击后,选择邮件合并,MergeField域名。域名可以理解为...
  • //word模板存放地址 String templateName = temp + ".ftl"; // 文件写入地址 String tempOut = Const.ZSYJH_ATTACH_ROOTPATH; File filexls = new File(tempOut); if (!filexls.exists() && !filexls....
  • 2021数模美赛LaTeX+Word论文模板更新!

    千次阅读 多人点赞 2021-02-01 20:42:51
    前言 题目 摘要 关键词 正文 参考文献 附录 最新的2021美赛模板 WORD写作模板 Latex排版模板
  • 在Qt中使用已有模板创建新Word文档

    千次阅读 2018-07-14 22:07:03
    本文主要介绍如何在Qt下操作Word

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,777
精华内容 13,510
关键字:

word错误模板怎么删除