Excel Interop的set_value方法会损坏值

时间:2013-03-29 20:02:11

标签: c# excel office-interop excel-interop

我在使用set_value方法时发现了一个问题。我写了最简单的代码来排除我的错误。

当我读取一些单元格然后使用set_value将它们写回到工作表时:

  • 任何过滤器在xlsx文件中都处于活动状态,

  • 获取/设置2个或更多列,

某些单元格已损坏(它们是空的或包含像#N / D这样的垃圾!)。当我在使用set_value之前在工作表或程序中禁用过滤时,一切正常。我在谷歌找不到关于这个特定问题的任何信息,我做的事情真是愚蠢吗?

Excel.Workbooks workbooks;
Excel.Workbook workbook = null;
Excel.Worksheet sheet = null;
Excel.Application excelApplication;
excelApplication = new Excel.Application();
excelApplication.Visible = false;
workbooks = excelApplication.Workbooks;
workbook = workbooks.OpenXML(file);
sheet = workbook.Sheets[1];

Excel.Range excelRangeR = sheet.UsedRange;
object[,] valueArrayR = (object[,])excelRangeR.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);
//if uncomment line     below (or manualy disable filters in XLSX file), set_value works fine
//sheet.AutoFilterMode = false;
excelRangeR.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, valueArrayR);

workbook.Save();
workbook.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelRangeR);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
excelApplication.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApplication);

1 个答案:

答案 0 :(得分:1)

您可以启用过滤器,但如果工作表上有活动过滤器,则必须在设置单元格的值之前将其删除。我认为发生的事情是,当您设置对象[,]变量时,它会使用范围内的所有数据填充数组,包括不可见的行,但是当您将范围的值设置为对象时[ ,]数组,它只覆盖可见行。就是那个,反之亦然。

很抱歉,如果此代码不正确。我只是猜测C#Interop语法。我不经常使用它。

if (sheet.get_FilterMode()) {
    sheet.ShowAllData();
}

不幸的是,没有一种简单的方法来保存工作表过滤器的当前值,因此如果您需要能够在粘贴操作后恢复过滤器,那将很难。