【问题标题】:C# GemBox Excel Import ErrorC# GemBox Excel 导入错误
【发布时间】:2024-01-23 20:09:01
【问题描述】:

我正在尝试使用 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]);
}

【问题讨论】:

    标签: c# excel file import gembox-spreadsheet


    【解决方案1】:

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

    【讨论】:

    • 带有错误恢复的优雅解决方案,但设计不佳 - 获取CultureInfo,如果没有给出,则使用本地机器作为默认机器。见msdn.microsoft.com/en-us/library/…
    【解决方案2】:

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

    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;
    

    【讨论】:

      【解决方案3】:

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

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

      解决方案是将列的类型更改为 System.Double。为什么?我不知道,但它确实有效。

      【讨论】: