2013-03-29 202 views
0

我在使用set_value方法时发现问题。我写了最简单的代码来排除我的错误。Excel Interop的set_value方法损坏值

当我读一些细胞,然后使用SET_VALUE它们写回片而:

  • 任何过滤器在XLSX文件活性,

  • 2或更多的列是获得/设置,

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

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

可以保留在滤膜上,但如果有片材,其具有设置单元的值之前除去上有源滤波器。我认为发生的事情是当你设置object [,]变量时,它将使用范围内的所有数据填充数组,包括不可见的行,但是当你将范围的值设置为object [ ,]数组,它只覆盖可见的行。不是那个,反之亦然。

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

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

遗憾的是没有一个简单的方法来保存工作表过滤器的电流值,所以如果你需要的是能够粘贴操作后恢复过滤器这将是困难的。

+0

我试图read-> write->读取测试范围,并且似乎get_values正确读取所有数据,set_values在第一个过滤后隐藏的行后产生一个随机混乱。 我希望我犯了一个错误,并且有一些方法可以用有效的过滤器编写值,但似乎我必须使用您的代码:) –

+0

是的,我之前遇到过这个问题。我发现的唯一解决方案是清除过滤器或一次一行地粘贴数据,这对于大量数据来说非常缓慢。 – Tmdean