時間: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