2012-08-29 66 views
4

我正在尋找寫一個使用C#的Excel工作表的大型二維數組。如果數組爲500×500,我會用它來寫,這是如下代碼:寫一個大的二維數組到Excel

var startCell = Worksheet.Cells[1, 1]; 
var endCell = Worksheet.Cells[500, 500]; 
var writeRange = (Excel.Range)Worksheet.Cells[startCell, endCell; 
writeRange.Value = myArray; 

我得到一個異常在這條線:

var endCell = Worksheet.Cells[500, 500]; 

正如任何人誰使用C#和通過COM的Excel可以證明,收到的錯誤信息幾乎沒有用。我認爲問題在於,當我第一次創建工作表時,用於工作表的基礎數據結構的大小不足以索引單元500,500。

有沒有人知道如何達到預期的效果?我希望有一種簡單的方法可以在創建Range之前重新調整底層數據結構的大小。

謝謝。

編輯:錯誤信息是:

{"Exception from HRESULT: 0x800A03EC"} 

隨着和Excel -2146827284錯誤代碼。

更新:下面的評論中提供的鏈接暗示了在兼容模式下打開Excel工作表的問題。這似乎是問題所在。如果我在運行我的代碼之前以.xlsx或.xlsm格式保存文檔,這似乎工作。我的問題是,我不能指望我的用戶每次都這樣做。有沒有實現這一目標的方案?是否僅僅是打開文件,檢查擴展名,然後在需要時將其保存爲新格式?

+0

雖然它「非常無用」,但您可以告訴我們您看到的內容會很有趣。也許你有這個問題(http://stackoverflow.com/questions/7099770/hresult-0x800a03ec-on-worksheet-range)? –

+2

請注意,在舊版本的Excel(例如2003)中,您的工作表不能超過256列(最後一個是IV)和65536行,因此它們不能包含500 * 500矩陣而不拆分它 –

回答

3

找到了解決辦法。

而不是使用Worksheet.Cells [x,x],而是使用Worksheet.get_range(x,x)。

1

我剛剛寫了一個小例子,爲我工作。最初發現於SO this answer。我有這個答案適應在我的Interop程序集(的Excel 14的對象庫)有沒有更多的方法Worksheet.get_Range(.., ..)

var startCell = ws.Cells[1, 1]; 
int row = 500, col = 500; 
var endCell = ws.Cells[row, col]; 
try 
{ 
    // access range by Property and cells indicating start and end   
    var writeRange = ws.Range[startCell, endCell]; 
    writeRange.Value = myArray; 
} 
catch (COMException ex) 
{ 
    Debug.WriteLine(ex.Message); 
    Debugger.Break(); 
} 
+0

這與我上面的代碼非常相似,並且這在一般情況下都能正常工作。問題出現在工作簿以兼容模式打開時。 –

+0

我目前正在研究一個新的例子。請確認一些假設:程序將根據當前版本的文件打開一個文件(

相關問題