【发布时间】:2013-09-18 13:03:01
【问题描述】:
我有一个用 ASP.NET C# 编写的网页,可以打开一个带有 Microsoft.Office.Interop.Excel 类的 Excel 文件。
Excel 文件具有在 Workbook_BeforeClose 事件上运行的 VBA 代码。 使用 Excel 打开和关闭文件时,代码运行良好,并在代码运行后提示保存更改。
但是当使用 C# 在网页上做同样的事情时,页面只是毫无意义地加载。调试显示它在 myExcelWorkbook.Close(true); 行停止(等待?)
C# 代码如下所示:
using Excel = Microsoft.Office.Interop.Excel;
public string getExcelInfo(string value1, string value2, string mapPath)
{
Excel.Application myExcelApp;
Excel.Workbooks myExcelWorkbooks;
Excel.Workbook myExcelWorkbook;
object misValue = System.Reflection.Missing.Value;
myExcelApp = new Excel.Application();
myExcelWorkbooks = myExcelApp.Workbooks;
//Copy file to allow simultaneous executions
Random rnd = new Random();
int rand = rnd.Next(1000000);
File.Copy(mapPath+"/App_Data/ConfigAQNX01.xlsm", mapPath+"/App_Data/ConfigAQNX01"+rand.ToString() + ".xlsm");
//Open file, workbook and sheet
String fileName = mapPath+"/App_Data/ConfigAQNX01" + rand.ToString() + ".xlsm";
myExcelWorkbook = myExcelWorkbooks.Open(fileName, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue, misValue);
Excel.Worksheet myExcelWorksheet = (Excel.Worksheet)myExcelWorkbook.ActiveSheet;
//insert values
myExcelWorksheet.Cells[3, 2] = value1;
myExcelWorksheet.Cells[6, 2] = value2;
//Save so formulaes are executed
myExcelWorkbook.Save();
myExcelWorksheet = (Excel.Worksheet)myExcelWorkbook.ActiveSheet;
//read value in excel
Excel.Range currentRange = (Excel.Range)myExcelWorksheet.Cells[7, 4];
string Cost_Cad_Unit = currentRange.Value2.ToString();
//Close Excel
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(currentRange);
Marshal.ReleaseComObject(myExcelWorksheet);
//Set SaveChange to true on close
myExcelWorkbook.Close(true); //This line is where processing takes forever, literraly
Marshal.ReleaseComObject(myExcelWorkbook);
Marshal.ReleaseComObject(myExcelWorkbooks);
myExcelApp.Quit();
Marshal.ReleaseComObject(myExcelApp);
currentRange = null;
myExcelWorksheet = null;
myExcelWorkbook = null;
myExcelWorkbooks = null;
myExcelApp = null;
return Cost_Cad_Unit;
}
是否可以设置一些选项来运行 VBA 代码,或者知道是什么导致它挂起的方法?或者 Microsoft.Office.Interop.Excel 是否有限制运行 Workbook_BeforeClose 代码?
谢谢你,
【问题讨论】:
-
试试这个.. 将
myExcelWorkbook.Close(true);更改为myExcelWorkbook.Close(false);并在该行之前添加此行myExcelWorkbook.Save(); -
你能发布你的关闭事件代码吗?
-
我尝试改变
myExcelWorkbook.Close(true);到myExcelWorkbook.Close(false); myExcelWorkbook.Save();,但它没有改变任何东西。在 Excel 文件中,我将代码移到了一个名为 GenerateFiles 的单独方法中,并通过 C# 调用它,如下所示:myExcelApp.Run("GenerateFiles"),结果相同。 Excel 文件属于客户,所以我暂时无法发布他们的代码。 -
没关系,GenerateFiles 方法由于某些单元格中的无效值而崩溃,修复使调用工作