代码改变世界

asp.net使用动态模版导出word

2019-01-09 16:37  NO.27  阅读(1466)  评论(0编辑  收藏  举报

具体思路:

  1.先制作Word模版,使用文本框+书签的方式来设计模版;

  2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件;

  3.后台取得数据,参照网页渲染的方式标记数据流,方便之后的写入操作;

  4.编辑新文件,根据程序中标记与书签的对应关系,利用类库中的方法来修改书签的内容,最后保存文件即可。

  优点:

  能够自定义元素的位置,方法也很简单易懂,如果只是表格之类的简单格式会很适用。

  缺点:

  灵活性不好,如果要套打的对象是网页,且不是表格形式的,还原程度不好,而且如果文字内容过多会出现超出文本框范围的情况。

  操作过程&代码:

  1)第一步,引入对应的程序集

  如果不是使用第三方的类库的话,是不需要下载的,只要你的系统完整安装了office,你的系统程序集中就会带有操作Word的程序集。

  首先,添加引用Microsoft.Office.Interop.Word,之后,在类中添加相对应的引用:

 using MSWord = Microsoft.Office.Interop.Word; //这里重命名为MSWord,之后使用的时候就可以简写了
 using System.IO;//要操作文件的话,要引用系统IO
 using System.Reflection;

  2)准备工作

 MSWord.Application wordApp = new MSWord.Application();//word应用程序变量
 MSWord.Document wordDoc;//word文档变量
 string TemplateFile = @"D:\Model.doc"; //模版文件的路径,
 string FileName = @"D:\" + DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".doc";//新文件的路径

  3)拷贝模版生成新文件

 File.Copy(TemplateFile, FileName);//首先要拷贝一份文件
 object obj_FileName = FileName;//新建一个obj变量用于操作

  4)设置操作类型,操作类型有很多中,这里要打开新文件,修改其中的内容

 wordDoc = wordApp.Documents.Open(ref obj_FileName);//打开新文件,进行操作
 
 wordDoc.Activate();//设置现在操作的文件

  5)依据书签修改word内容

//循环书签,判断书签名称,并为其赋值
  foreach (MSWord.Bookmark bm in wordDoc.Bookmarks)
  {
      if (bm.Name == "billno")
          {
           bm.Select();
           bm.Range.Text = "2008";
         }
          if (bm.Name == "dated")
             {
               bm.Select();
               bm.Range.Text = DateTime.Now.ToString();
             }
        }

  6)关闭文件

   wordDoc.SaveAs2(obj_FileName);//保存文件
   wordDoc.Close();//关闭文档对象
   wordApp.Quit();//关闭应用程序对象

  7)杀进程,有的情况下,关闭Word文件会不成功,会残留很多word进程

System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("WINWORD");
foreach (System.Diagnostics.Process p in processes)
   {
       bool b = p.MainWindowTitle == "";
       if (p.MainWindowTitle == "")
            {
              p.Kill();
            }
    }

  8)下载

Response.Clear();
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(FileName),
    System.Text.Encoding.UTF8));
Response.ContentType = "application/msword";
Response.TransmitFile(FileName);
Response.Flush();
Response.End();

  转自:https://www.cnblogs.com/jydeng/p/4398500.html

 

具体思路:

  1.先制作Word模版,使用文本框+书签的方式来设计模版;

  2.模版制作完之后,根据模版生成新文件,使用File.Copy方法,生成.doc格式新文件;

  3.后台取得数据,参照网页渲染的方式标记数据流,方便之后的写入操作;

  4.编辑新文件,根据程序中标记与书签的对应关系,利用类库中的方法来修改书签的内容,最后保存文件即可。

  优点:

  能够自定义元素的位置,方法也很简单易懂,如果只是表格之类的简单格式会很适用。

  缺点:

  灵活性不好,如果要套打的对象是网页,且不是表格形式的,还原程度不好,而且如果文字内容过多会出现超出文本框范围的情况。

  操作过程&代码:

  1)第一步,引入对应的程序集

  如果不是使用第三方的类库的话,是不需要下载的,只要你的系统完整安装了office,你的系统程序集中就会带有操作Word的程序集。

  首先,添加引用Microsoft.Office.Interop.Word,之后,在类中添加相对应的引用:

1 using MSWord = Microsoft.Office.Interop.Word; //这里重命名为MSWord,之后使用的时候就可以简写了
2 using System.IO;//要操作文件的话,要引用系统IO
3 using System.Reflection;

  2)准备工作

1 MSWord.Application wordApp = new MSWord.Application();//word应用程序变量
2 MSWord.Document wordDoc;//word文档变量
3 string TemplateFile = @"D:\Model.doc"; //模版文件的路径,
4 string FileName = @"D:\" + DateTime.Now.ToString("yyyyMMddHHmmssffffff") + ".doc";//新文件的路径

  3)拷贝模版生成新文件

1 File.Copy(TemplateFile, FileName);//首先要拷贝一份文件
2 object obj_FileName = FileName;//新建一个obj变量用于操作

  4)设置操作类型,操作类型有很多中,这里要打开新文件,修改其中的内容

1 wordDoc = wordApp.Documents.Open(ref obj_FileName);//打开新文件,进行操作
2 
3 wordDoc.Activate();//设置现在操作的文件

  5)依据书签修改word内容

复制代码
 1  //循环书签,判断书签名称,并为其赋值
 2   foreach (MSWord.Bookmark bm in wordDoc.Bookmarks)
 3   {
 4       if (bm.Name == "billno")
 5           {
 6            bm.Select();
 7            bm.Range.Text = "2008";
 8          }
 9           if (bm.Name == "dated")
10              {
11                bm.Select();
12                bm.Range.Text = DateTime.Now.ToString();
13              }
14         }
复制代码

  6)关闭文件

1   wordDoc.SaveAs2(obj_FileName);//保存文件
2   wordDoc.Close();//关闭文档对象
3   wordApp.Quit();//关闭应用程序对象

  7)杀进程,有的情况下,关闭Word文件会不成功,会残留很多word进程

复制代码
1 System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcessesByName("WINWORD");
2 foreach (System.Diagnostics.Process p in processes)
3    {
4        bool b = p.MainWindowTitle == "";
5        if (p.MainWindowTitle == "")
6             {
7               p.Kill();
8             }
9     }
复制代码