1

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

3 に答える 3

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]);
于 2010-03-02T09:37:38.653 に答える
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;
于 2011-02-16T14:44:08.333 に答える
0

私も同じ問題を抱えていました。型指定されたデータセットを使用していたので、テーブルの 1 つにデータを入力しようとすると、そのエラーが発生しました。

ここでの問題は、Excel ファイルの 10 進数です。最初に、10 進数値の列を System.Decimal に割り当てたところ、そのエラーがスローされました。

解決策は、列のタイプを System.Double に変更することです。なんで?わかりませんが、うまくいきました。

于 2012-08-31T18:20:12.727 に答える