C#OWC11.DLL失敗: 80040154

時間:2020/09/17

背景:之前的舊版本項目(Windows2003 VS2008),發佈到新升級的電腦上(Windows2016 VS2010),導致一系列的問題,今天的問題是導出Excel報錯:由於發生下列錯誤,為具有 CLSID {0002E559-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80040154。 

大致問題:

1、ASP.NET 版本

2、Microsoft .NET Framework 版本

2、水晶報表問題(CRRedist2008_x86/CRRedist2008_x64),安裝這個大概可解決70%的dll報錯(因項目而異)

3、其他問題,具體問題具體分析(安裝Office也可解決一部份問題,尤其跟Excel有關的)

結果:FAIL!!我折騰了一上午,最終還是沒搞定,還是百度了個生成Excel的方法,不需要用OWC11.DLL的方法。

代碼如下:

    /// <summary>
    /// 生成csv文件
    /// </summary>
    /// <param name="report">就是一個SQL(是一個類去根據條件生成SQL)</param>
    public void ExportToSvc(Report report)
    {
        DataAccess conn = DataAccessFactory.CreateDataAccess(Config.DatabaseConnection("ORACLEDB"));

        conn.Open();
        DataSet dt = conn.ExecuteDataset(report.SQLStatment);
      
        string FileName;

        FileName = fPage.Server.MapPath("..\\tempfiles\\" + fPage.Session.SessionID + "_" + DateTime.Now.Ticks.ToString() + ".csv");
        
        if (File.Exists(FileName))
        {
            File.Delete(FileName);
        }
        //先打印标头

        StringBuilder strColu = new StringBuilder();
        StringBuilder strValue = new StringBuilder();
        int i = 0;
        try
        {
            StreamWriter sw = new StreamWriter(new FileStream(FileName, FileMode.CreateNew), Encoding.GetEncoding("UTF-8"));
            for (i = 0; i <= dt.Tables[0].Columns.Count - 1; i++)
            {
                strColu.Append(dt.Tables[0].Columns[i].ColumnName);
                strColu.Append(",");
            }
            strColu.Remove(strColu.Length - 1, 1);//移出掉最后一个,字符
            sw.WriteLine(strColu);
            foreach (DataRow dr in dt.Tables[0].Rows)
            {
                strValue.Remove(0, strValue.Length);//移出
                for (i = 0; i <= dt.Tables[0].Columns.Count - 1; i++)
                {
                    if (dr[i].ToString().IndexOf(",") > 0)
                        strValue.Append("\"" + dr[i].ToString().Replace(@"""", "") + "\"");
                       // strValue.Append(dr[i].ToString().Replace(@"""", "") + "\"");
                    else
                    {
                        if (dr[i].ToString() != "")
                            //strValue.Append(" " + dr[i].ToString().Replace(@"""", ""));
                            strValue.Append(dr[i].ToString().Replace(@"""", ""));
                        else
                            strValue.Append(dr[i].ToString().Replace(@"""", ""));
                    }
                    strValue.Append(",");
                }
                strValue.Remove(strValue.Length - 1, 1);//移出掉最后一个,字符
              
                sw.WriteLine(strValue);
            }
            
            sw.Close();
            GC.Collect();
            HttpResponse resp;
            resp = fPage.Response;
            resp.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");
          //  resp.ContentType = "text/csv";
            string DownFileName = DateTime.Now.Ticks.ToString() + ".csv";
            resp.AppendHeader("Content-Disposition", "attachment;filename=" + DownFileName);
            FileInfo MyFileInfo;
            long StartPos = 0, FileSize;
            MyFileInfo = new FileInfo(FileName);
            FileSize = MyFileInfo.Length;
            resp.WriteFile(FileName, StartPos, FileSize);
            resp.Flush();
            MyFileInfo.Delete();
            //resp.CacheControl = "no-cache";
            fPage.Response.End();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            conn.Close();
        }
        
    }

參考文檔:

https://dotblogs.com.tw/chou/2013/06/14/105497

https://dotblogs.com.tw/henryli/2015/06/30/151686

https://petereagle1.wordpress.com/2011/03/08/%E7%99%BC%E7%94%9F%E4%B8%8B%E5%88%97%E9%8C%AF%E8%AA%A4%EF%BC%8C%E7%82%BA%E5%85%B7%E6%9C%89-clsid-%E7%9A%84%E5%85%83%E4%BB%B6%E6%93%B7%E5%8F%96-com-class-factory-%E5%A4%B1%E6%95%97/

https://social.msdn.microsoft.com/Forums/zh-TW/fad4bbcc-05d8-48b4-adee-d328f596067d/35531218392098629694clsid376793549235201245904063635299com-class?forum=232

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值