0

だから私はExcelシートテーブルとmssqlテーブルを持っています.2つはLINQを使用してExcelテーブル列0(最初)とmssql列textfield2で結合されています. 英数字の値を結合するときに私が抱えている問題は、うまくいかないようです。値が数値の場合は機能します。

        var adapter = new OleDbDataAdapter("SELECT * FROM [Sheet1$]", excconnectionstring);
        var adapter2 = new SqlDataAdapter("SELECT * FROM Table1", sqlconnectionstring);

        var ds = new DataSet();
        adapter.Fill(ds, "excel");
        adapter2.Fill(ds, "sql");

        var excel = ds.Tables["excel"].AsEnumerable();
        var esqel = ds.Tables["sql"].AsEnumerable();

        var query = from exc in excel
                    from sql in esqel
                    where exc[0].ToString() == sql.Field<string>("textfield2")
                    select new
                    {
                        debnr = sql.Field<string>("debnr"),
                        bedrag = double.Parse(exc[5].ToString())/100,
                        description = DateTime.Parse(exc[7].ToString(), new CultureInfo("nl-NL")).ToString("MMM yyyy"),
                        text1 = exc[0].ToString(),
                        projectno = sql.Field<string>("textfield1"),
                        central = sql.Field<string>("CentralizationAccount").Trim()
                    };

編集:Excelシートで英数字の値を上に並べると、英数字が機能するようです。しかし、数値では機能しないという問題があります..

4

1 に答える 1

0

他の人が言ったように、OleDb が最初の数行に基づいて列の型を推測するために問題が発生しました。Interop TextToColumn を使用して、Excel 列のデータ型をテキストに変更します。これを行うために使用するコードは次のとおりです。

        Workbook workBook = _excelApp.Workbooks.Open(Directory.GetCurrentDirectory() + "\\" + thisFileName,
            0, false, 5, "", "", false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);


        object fieldInfo = new int[1, 2] { { 1, 2 } };
        Range _range = ((Worksheet)workBook.Worksheets.get_Item("Sheet1")).UsedRange.Columns[1, Type.Missing];

        _range.TextToColumns(
 _range, XlTextParsingType.xlDelimited,
 XlTextQualifier.xlTextQualifierNone, Type.Missing,
 Type.Missing, Type.Missing, Type.Missing,
 Type.Missing, Type.Missing,
 Type.Missing,
 fieldInfo,
 Type.Missing, Type.Missing);

        _excelApp.DisplayAlerts = false;
        _excelApp.ScreenUpdating = false;
        _excelApp.Visible = false;
        _excelApp.UserControl = false;
        _excelApp.Interactive = false;

        workBook.SaveAs(Directory.GetCurrentDirectory() + "\\" + thisFileName, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange,
        Type.Missing, Type.Missing, Type.Missing, Type.Missing,
        Type.Missing);
        workBook.Close(false, thisFileName, null);
        Marshal.ReleaseComObject(workBook);
        _excelApp.Quit();
于 2012-12-06T14:32:57.407 に答える