C#GemBox Excel导入错误

我想使用GemBox导入一个Excel文件到数据表中,我不断收到这个错误:

在SourceRowIndex:1和SourceColumnIndex:1上提取到DataTable时无效的数据值。

据我可以告诉我的代码是正确的,我的文件是文件很好。 有没有人有任何想法?

谢谢。

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]); } 

GemBox.Spreadsheet组件不会自动将数字转换为ExtractToDataTable()方法中的string。

这主要是因为文化问题。 有人会认为12.4被转换为“12.4”,其他人被转换为“12,4”。

因此,如果您的Excel文件的单元格的值为inttypes,并且相应的列的types为string – >将引发exception。 要覆盖它,你可以使用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]); 

我遇到了一些问题,我通过显式访问工作表单元克服了这个问题

 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; 

我有同样的问题。 我一直在使用Typed DataSets,所以当我尝试填充我的一个表时,我有这个错误。

这里的问题是Excel文件中的十进制数字。 最初,我将十进制值的列分配给System.Decimal,并引发错误。

解决scheme是将列的types更改为System.Double。 为什么? 我不知道,但它的工作。