我正在使用一个基于Excel类的现有项目将值从一个工作表A复制到另一个工作表B.在ws A单元格中有一些公式和Addin函数。因此,复制代码仅用于将值复制到ws B.这是一段简化代码:
using Excel = Microsoft.Office.Interop.Excel;
....
object missing = System.Type.Missing;
Excel.Application app = new Excel.Application();
// Creating Excel application with source workbook in memory
Excel.Workbook workbook = app.Workbooks.Open("SourceA.xls",
Excel.XlUpdateLinks.xlUpdateLinksNever,....);
...
app.Calculate() // Forcing to recalculate value in cells.
...
//create destination workbook
Excel.Workbook destWb = app.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
Excel.WorkSheet destSheet = (Excel.Worksheet)destWb.Worksheets[1];
Excel.Range destRange = (Excel.Range)destSheet.Cells[1, 1];
//rename sheet 1
destSheet.Name = "wsB Report";
//Set Source Data Range from
Excel.WorkSheet sourceWA = (Excel.Worksheet)workbook.Worksheets["wsA"];
//Get the predefined named range "DataRange" from source wsA
Excel.Range sourceRange = sourceWA.get_Range("DataRange", missing);
//copy data
sourceRange.Copy(missing);
//paste values and number formats
destRange.PasteSpecial(Excel.XlPasteType.xlPasteValuesAndNumberFormats,
Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, missing, missing);
//paste formats
destRange.PasteSpecial(Excel.XlPasteType.xlPasteFormats,
Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, missing, missing);
//paste column widths
destRange.PasteSpecial(Excel.XlPasteType.xlPasteColumnWidths,
Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, missing, missing);
....
destWb.SaveAs("destB.xls", missing, ....);
我遇到的问题是destB.xls中的副本单元都标记为“#NAME?”。它们应该是复制的值。我打开源excel文件,我可以看到源范围中的数据是用值更新的。但是,当我运行我的代码时,这些值似乎不可用。
我想我在代码中创建的Excel应用程序可能没有启用宏。这可能是无法复制原因值的原因。例如,当我打开源excel文件时,我会看到启用或禁用宏的提示。如果单击“启用”按钮,则Excel将花费一些时间在数据单元格中显示值。
如果是这个原因,代码中是否有任何方法可以启用Macro,以便单元格中的所有公式都能够更新值?
另一个原因可能是操作系统或Windows安全更新引起的。不确定是否有任何Windows安全设置可能会影响Excel宏。如果是这种情况,我应该更改Windows安全级别或任何方式强制在项目中启用宏吗?
顺便说一句,我的项目在安装了Office Excel 2003的Windows XP和Windows 2008 Server中运行。该项目在VS 2008中完成。
答案 0 :(得分:1)
我进一步研究了我的代码,我发现通过使Excel应用程序可见,我能够看到实际发生了什么。作为Ben Voigt的建议,宏的安全设置可以在Excel中完成,但在代码中,无论设置如何,您都可以强制执行任何类似VBA的代码。以下是一些使Excel可见的代码,并查看所有提示对话框:
Excel.Application app = new Excel.Application();
Excel.Workbook workbook = app.Workbooks.Open("SourceA.xls", ...);
app.Visible = true; //set to 'true' when debbugging, Exec is visible
app.DisplayAlerts = true; //enable all the prompt alerts for debug.
...
例如,我在C#代码中重建链接,在单元格中设置值并刷新或计算值(模拟F9)。通过使Excel可见,我看到发生了什么,并发现我的代码中的错误没有做我想要的。