問題1.
引用 Microsoft.Office.Interop.Excel
無法使用 mySheet = (Worksheet)myBook.Worksheets[1];
生成時
One or more types required to compile a dynamic expression cannot be found. Are you missing a reference?
解決方案:
引用Microsoft.Office.Interop.Excel 右擊屬性將 Embed interop type 改成false才可以
問題2 異常信息
異常1.(0x80040154): 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80040154 没有注册类
異常2.未能加载文件或程序集“office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”或它的某一个依赖项。系统找不到指定的文件。文件名:“office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c”
解決方案是安裝Office excel
(採用WPS的方法只裝了WPS時,也出現這個異常,乾脆就直接裝了Office excel)
採用時WPS,引用etapi.dll,wppapi.dll,wpsapi.dll 三個DLL 方法同Office的一樣,只需using不同的dll即可
問題3 打開 Office 的excel時,提示stdole32.tlb丢失或损坏的解决方法
重裝Office,從別的地方拷貝到system32下都不起作用(之前system32下面原來就有一個)
方案1.(未解決-有緩解-有自動更新框)找到excel的安裝目錄,修改excel.exe的兼容性,如下圖,問題並沒有解決,只是打開excel,提示信息變了,變成直接重新更新安裝了(跟之前提示"stdole32.tlb丢失或损坏的解决方法"對話框,關掉后的效果一樣)
方案2.(未解決-有緩解-直接打開)修改WPS的兼容性,如下圖, (之後打開excel正常,但是感覺問題還是沒有修復,後面的問題會再提到這個問題,暫時認為解決了)
問題4
检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。
採用WInform程式,可以正常操作,網站操作失敗提示以上信息
方案1.(未解決-異常變化)在網站的web.Config文件里添加 <identity impersonate="true" userName="administrator" password="XXXX"/>
異常變成 System.Runtime.InteropServices.COMException (0x800A03EC): 异常来自 HRESULT:0x800A03EC
此異常 問題5可以解決
方案2(未解決) 調整IIS 應用池高級屬性調整 標示 networkService 異常提示 依然是{00024500-0000-0000-C000-000000000046}
方案3(解決-成功) 做如下設置
控制面板-》管理工具-》组件服务-》计算机-》我的电脑-》DCom配置-》Microsoft Excel应用程序 -》屬性
如果不成功,可以將 "Microsoft Excel应用程序" 刪掉 重新添加后重新設置(添加方法見問題5)
刪除方法如下 打開註冊表,找到如下 HKEY_CLASSES_ROOT/Appid/{00020812-0000-0000-C000-000000000046}
問題5 DCom配置里找不到Microsoft Excel应用程序
方案1.
運行 "mmc -32" 打開 控制臺->檔案->新增或移除嵌入式管理單元->原件服務->新增,點擊確定之後重新打開 "dcomcnfg.exe"打開元件服務就可以了
方案2:
需要重新註冊 Excel (Word,PPT同理)
找到Excel的安裝目錄"C: \Program Files\Microsoft Office\OFFICE11\EXCEL.exe"
win+R (運行) "C: \Program Files\Microsoft Office\OFFICE11\EXCEL.exe" /regserver
執行這個命令時 問題3的提示"stdole32.tlb丢失或损坏的解决方法"又彈出來,註冊命令依然能執行完畢
問題6 出现如下的错误
Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码。 (Exception from HRESULT: 0x8000401A).
方案1
打开组件服务—— 计算机——我的电脑——DCOM配置 中找到Microsoft Excel应用程序,右击“属性”
选择“安全”选项卡,将 启动和激活权限、访问权限以及配置权限中添加 IIS_IUSER,IUSER
選擇"標示"選項卡,選擇"啟動用戶" ---網上都是改成交互用戶 本例用 啟動用戶時,成功
以下是關於操作Excel的相關代碼
修改Excel里的單元格值
Application myExcel = null;//引用Excel Application类別
Workbook myBook = null;//引用活页簿类別
Worksheet mySheet = null;//引用工作表类別
Range myRange = null;//引用Range类別
string excelPath = "";
public ExcelModify(string filePath)
{
excelPath = filePath;
try
{
myExcel = new Application();//实例化Excel Application
myBook = myExcel.Workbooks._Open(excelPath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
myExcel.DisplayAlerts = false;//停用警告
myExcel.Visible = false; //Excel 不可见
// Microsoft.Office.Interop.Excel 引用的屬性 Embed interop type 改成false才可以
mySheet = (Worksheet)myBook.Worksheets[1];//Excel文件打开工作簿的第一个文件
}
catch (Exception ex)
{
this.Close();
throw ex;
}
}
public void Modify(int rowindex, int columnIndex, string sValue)
{
try
{
// Microsoft.Office.Interop.Excel 引用的屬性 Embed interop type 改成false才可以
//修改单元格
myRange = (Range)mySheet.Cells[rowindex + 1, columnIndex + 1];
myRange.Value = sValue;//把坐标是[1,2]的单元格值修改成12
//{//修改单元格引用函数=Sum(A1:A3)
// myRange = mySheet.Cells[rowindex, columnIndex];
// string strColName1 = getExcelColumnLabel(cindex + 1);
// myRange.Formula = string.Format("=SUM({0}:{1})", strColName1 + (rindex - 3), strColName1 + (rindex - 1));
//}
}
catch (Exception ex)
{
this.Close();
throw ex;
}
}
xml轉化xls
public void xmlToxls(string xmlPath, string xlsPath)
{
try
{
Application _appliation;
Workbook _workbook;
_appliation = new Application();
Object missing = System.Reflection.Missing.Value;
if (_appliation == null)
_appliation = new Application();
_workbook = (Workbook)_appliation.Workbooks.Open(xmlPath, missing, missing, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing);
_workbook.SaveAs(xlsPath, XlFileFormat.xlExcel9795);
//關掉當前sheet
_workbook.Close(missing, missing, missing);
//關掉excel
_appliation.Workbooks.Close();
//退出程序
_appliation.Quit();
}
catch (Exception ex)
{
throw ex;
}
}