2009-11-09 62 views
1

我試圖導入Excel文件到一個數據表,可以使用GemBox,我不斷收到此錯誤:1,和SourceColumnIndex:C#GemBox Excel導入錯誤

在SourceRowIndex抽取到數據表時

無效數據值1。

據我可以告訴我的代碼是正確的,我的文件是文件很好。有沒有人有任何想法?

謝謝。

ExcelWorksheet Ew = ExFi.Worksheets[0]; 

for (int i = 0; i < Ew.Columns.Count; ++i) 
{ 
    if (Ew.Rows[0].Cells[0, i].Value != null) 
     dsTable.Columns.Add(Ew.Rows[0].Cells[0, i].Value.ToString(), typeof(string)); 
} 

try 
{ 
    Ew.ExtractToDataTable(dsTable, Ew.Rows.Count, ExtractDataOptions.StopAtFirstEmptyRow, Ew.Rows[1], Ew.Columns[0]); 
} 

回答

4

GemBox.Spreadsheet部件不會自動號碼轉換爲字符串在ExtractToDataTable()方法。

這主要是因爲文化問題;有人會認爲12.4被轉換爲「12.4」,其他人轉換爲「12,4」。

因此,如果您的Excel文件的單元格的值類型爲int,並且相應的列的類型爲string - >將拋出異常。要覆蓋它,您可以使用ExcelWorksheet.ExtractDataEvent

這裏的樣本:

// Create new ExcelFile 
ExcelFile ef = new ExcelFile(); 

// Add sheet 
ExcelWorksheet ws = ef.Worksheets.Add("Sheet1"); 
// Fill sheet 
for (int i = 0; i < 5; i++) 
{ 
    ws.Cells[i, 0].Value = i; // integer value 
    ws.Cells[i, 1].Value = "Row: " + i; // string value 
} 

// Initialize DataTable 
DataTable dt = new DataTable(); 
dt.Columns.Add("id", typeof(string)); 
dt.Columns.Add("text", typeof(string)); 

// Manage ExtractDataError.WrongType error 
ws.ExtractDataEvent += (sender, e) => 
{ 
    if (e.ErrorID == ExtractDataError.WrongType) 
    { 
     e.DataTableValue = e.ExcelValue == null ? null : e.ExcelValue.ToString(); 
     e.Action = ExtractDataEventAction.Continue; 
    } 
}; 

// Extract data to DataTable 
ws.ExtractToDataTable(dt, 1000, ExtractDataOptions.StopAtFirstEmptyRow, ws.Rows[0], ws.Columns[0]); 
+0

優雅的解決方案與錯誤恢復,但相當糟糕的設計 - 獲得'CultureInfo',使用本地機器作爲默認的一個,如果沒有給出。 請參閱http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx – 2012-02-08 20:22:27

1

我有一些問題,我克服它通過明確訪問工作表單元格

DataTable dtResult = new DataTable(); 
int nRows = ws.Rows.Count; 
int nCols = 3; //change this according to number of columns in your sheet, for some reason ws.columns.count returns 0 
for (int i = 0; i < nCols ; i++) 
    dtResult.Columns.Add(); 

for (int i = 0; i < nRows; i++) 
{ 
    if (ws.Cells[i, 0].Value != null) 
     dtResult.Rows.Add(ws.Cells[i, 0].Value.ToString(), ws.Cells[i, 1].Value.ToString(), ws.Cells[i, 2].Value.ToString()); 
} 

return dtResult; 
0

我有同樣的問題。我一直在使用Typed DataSets,所以當我嘗試填充我的表中的一個時,出現了該錯誤。

這裏的問題是Excel文件中的十進制數字。 Initialy我將具有十進制值的列分配給System.Decimal,並引發錯誤。

解決方法是將列的類型更改爲System.Double。爲什麼?我不知道,但它的工作。