2013-03-29 200 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