最近项目要实现下载打印的功能,想了想,用水晶报表实在是大材小用, 用office组件直接就能够实现这一功能。web
引用类 using Microsoft.Office.Interop.Word;安全
创建两个实体类 一个是导出word须要替换内容的配置,一个是替换内容的实体app
public class AgentInfoEntity { private string comname; ide
public string ComName { get { return comname; } set { comname = value; } } private string linkname; 工具
public string LinkName { get { return linkname; } set { linkname = value; } } private string comemail; post
public string ComEmail { get { return comemail; } set { comemail = value; } } private string sn; ui
public string SN { get { return sn; } set { sn = value; } } code
private string comtel; orm
public string ComTel { get { return comtel; } set { comtel = value; } } private string comcontact; 对象
public string ComContact { get { return comcontact; } set { comcontact = value; } } private string registercomname;
public string RegisterComName { get { return registercomname; } set { registercomname = value; } } private string regaddresstel;
public string RegAddressTel { get { return regaddresstel; } set { regaddresstel = value; } } private string bank;
public string Bank { get { return bank; } set {bank = value; } } private string tax;
public string Tax { get { return tax; } set { tax = value; } } private string regtel;
public string Regtel { get { return regtel; } set { regtel = value; } } private string sendaddress; public string SendAddress { get { return sendaddress; } set { sendaddress = value; } } private string postaddress;
public string PostAddress { get { return postaddress; } set { postaddress = value; } }
private string agentaccount;
public string AgentAccount { get { return agentaccount; } set { agentaccount = value; } }
private string postcontact;
public string PostContact { get { return postcontact; } set { postcontact = value; } }
private string invoicetel;
public string InvoiceTel { get { return invoicetel; } set { invoicetel = value; } } private string financecontact;
public string FinanceContact { get { return financecontact; } set { financecontact = value; } } private string financetel;
public string FinanceTel { get { return financetel; } set { financetel = value; } } private string financefax;
public string FinanceFax { get { return financefax; } set { financefax = value; } } private string financepost;
public string FinancePost { get { return financepost; } set { financepost = value; } } private string deliveryarea;
public string DeliveryArea { get { return deliveryarea; } set { deliveryarea = value; } } private string deliverypost;
public string DeliveryPost { get { return deliverypost; } set { deliverypost = value; } } }
public class AgentInfoEntity { private string comname;
public string ComName { get { return comname; } set { comname = value; } } private string linkname;
public string LinkName { get { return linkname; } set { linkname = value; } } private string comemail;
public string ComEmail { get { return comemail; } set { comemail = value; } } private string sn;
public string SN { get { return sn; } set { sn = value; } }
private string comtel;
public string ComTel { get { return comtel; } set { comtel = value; } } private string comcontact;
public string ComContact { get { return comcontact; } set { comcontact = value; } } private string registercomname;
public string RegisterComName { get { return registercomname; } set { registercomname = value; } } private string regaddresstel;
public string RegAddressTel { get { return regaddresstel; } set { regaddresstel = value; } } private string bank;
public string Bank { get { return bank; } set {bank = value; } } private string tax;
public string Tax { get { return tax; } set { tax = value; } } private string regtel;
public string Regtel { get { return regtel; } set { regtel = value; } } private string sendaddress; public string SendAddress { get { return sendaddress; } set { sendaddress = value; } } private string postaddress;
public string PostAddress { get { return postaddress; } set { postaddress = value; } }
private string agentaccount;
public string AgentAccount { get { return agentaccount; } set { agentaccount = value; } }
private string postcontact;
public string PostContact { get { return postcontact; } set { postcontact = value; } }
private string invoicetel;
public string InvoiceTel { get { return invoicetel; } set { invoicetel = value; } } private string financecontact;
public string FinanceContact { get { return financecontact; } set { financecontact = value; } } private string financetel;
public string FinanceTel { get { return financetel; } set { financetel = value; } } private string financefax;
public string FinanceFax { get { return financefax; } set { financefax = value; } } private string financepost;
public string FinancePost { get { return financepost; } set { financepost = value; } } private string deliveryarea;
public string DeliveryArea { get { return deliveryarea; } set { deliveryarea = value; } } private string deliverypost;
public string DeliveryPost { get { return deliverypost; } set { deliverypost = value; } } }
/// <summary> /// l根据实体取得属性的值。 /// </summary> /// <param name="ainfo"></param> /// <param name="key"></param> /// <returns></returns> public string getProperties(AgentInfoEntity ainfo,string key) { string tStr = string.Empty; if (ainfo== null) { return tStr; } System.Reflection.PropertyInfo[] properties = ainfo.GetType().GetProperties(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public);
if (properties.Length <= 0) { return tStr; } foreach (System.Reflection.PropertyInfo item in properties) { string name = item.Name; object value = item.GetValue(ainfo,null); if (item.PropertyType.IsValueType || item.PropertyType.Name.StartsWith("String")) { //tStr += string.Format("{0}:{1},", name, value); if (name.ToLower() == key) { tStr =(string)value; break; } } } return tStr; }
/// <summary> /// 替换内容并导出 /// </summary> /// <param name="templetePathandName"></param> /// <param name="saasPathandFile"></param>
/// <param name="eword"></param>
/// <param name="agentinfo"></param> /// <returns></returns>
public void ExportWordForTemplete(string templetePathandName,string saasPathandFile,ExWordValue eword,AgentInfoEntity agentinfo) { //生成WORD程序对象和WORD文档对象 string p_TemplatePath = templetePathandName; //例如"/templete.doc"; string p_SavePath = saasPathandFile; Application appWord = new Application(); Document doc = new Document();
object oMissing = System.Reflection.Missing.Value;//这是一个疑问
//打开模板文档,并指定doc的文档类型 object filename = ""; try { object objTemplate = Server.MapPath(p_TemplatePath); object objDocType = WdDocumentType.wdTypeDocument; object objFalse = false, objTrue = true; doc = (Document)appWord.Documents.Add(ref objTemplate, ref objFalse, ref objDocType, ref objTrue); //获取模板中全部的书签 Bookmarks odf = doc.Bookmarks; //循环全部的书签,并给书签赋值 for (int oIndex = 0; oIndex <eword.ItemValue.Count ; oIndex++) { object obDD_Name =eword.ItemValue[oIndex]; doc.Bookmarks.get_Item(ref obDD_Name).Range.Text = getProperties(agentinfo, (string)obDD_Name); //p_TestReportTable.Rows[0][testTablevalues[oIndex]].ToString();//此处Range也是WORD中很重要的一个对象,就是当前操做参数所在的区域 } //第四步 生成word,将当前的文档对象另存为指定的路径,而后关闭doc对象。关闭应用程序 filename = Server.MapPath(saasPathandFile); object miss = System.Reflection.Missing.Value; doc.SaveAs(ref filename, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss); object missingValue = Type.Missing; object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges; doc.Close(ref doNotSaveChanges, ref missingValue, ref missingValue); appWord.Application.Quit(ref miss, ref miss, ref miss); doc = null; appWord = null;
} catch (System.Threading.ThreadAbortException ex) { object miss = System.Reflection.Missing.Value; object missingValue = Type.Missing; object doNotSaveChanges = WdSaveOptions.wdDoNotSaveChanges; doc.Close(ref doNotSaveChanges, ref missingValue, ref missingValue); appWord.Application.Quit(ref miss, ref miss, ref miss); }
//导出 string file = filename.ToString(); FileInfo fi = new FileInfo(file); Response.Clear(); Response.ClearHeaders(); Response.Buffer = false; //Response.AppendHeader("Content-Disposition","attachment;filename=" +HttpUtility.UrlEncode(Path.GetFileName(destFileName),System.Text.Encoding.Default)); Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(Path.GetFileName(file), System.Text.Encoding.UTF8)); Response.AppendHeader("Content-Length", fi.Length.ToString()); Response.ContentType = "application/octet-stream"; Response.WriteFile(file); Response.Flush(); Response.End(); }
以上是代码,可是对于引用的dll它是com组件,若是不对它的权限进行设置将会报错。
调用COM组件发布IIS时常见错误 80070005解决方案
症状:
oWordApplic = New Word.Application
当程序运行到这句时出现下面的错误:
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,缘由是出现如下错误: 80070005。
oWordApplic = New Word.Application
当程序运行到这句时出现下面的错误:
检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件时失败,缘由是出现如下错误: 80070005。
解决方法一:
控制面板-》管理工具-》组件服务-》计算机-》个人电脑-》DCom配置-》找到Microsoft Word文档
以后
单击属性打开此应用程序的属性对话框。
2. 单击标识选项卡,而后选择交互式用户。
3.单击"安全"选项卡,分别在"启动和激活权限"和"访问权限"组中选中"自定义",而后
自定义->编辑->添加ASP.NET帐户和IUSER_计算机名
* 这些账户仅在计算机上安装有 IIS 的状况下才存在。
13. 确保容许每一个用户访问,而后单击肯定。
14. 单击肯定关闭 DCOMCNFG。
解决方法二:
若是上述方法不能解决问题,就应该是权限问题,请尝试用下面的方法:
在web.config中使用身份模拟,在<system.web>节中加入 <identity impersonate="true" userName="你的用户名" password="密码"/>
</system.web>