2009-11-09 60 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。为什么?我不知道,但它的工作。