OleDB & mixed Excel datatypes : missing data

后端 未结 6 952
长发绾君心
长发绾君心 2020-11-22 03:04

I have an Excel worksheet I want to read into a datatable - all is well except for one particular column in my Excel sheet. The column, \'ProductID\', is a mix of values lik

6条回答
  •  有刺的猬
    2020-11-22 04:05

    No problem sh4, glad it helps w/ the mixed type issue.

    The DateTime column is whole other animal that I recall caused me grief in the past... we have one excel file we process that the OleDbDataAdapter will sometimes convert dates to a double data type (apparently Excel stores dates as doubles, which encode the number of days elapsed since January 0, 1900 ).

    The workaround was to use:

    OleDbConnection mobjExcelConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + txtExcelFile.Text + @";Extended Properties=""Excel 8.0;IMEX=1;HDR=Yes;""");
    
    OleDbDataAdapter mobjExcelDataAdapter = new OleDbDataAdapter("Select * from [" + txtSheet.Text + "$] where [Supplier ID] <> '' ", mobjExcelConn);
    
    
    DateTime dtShipStatus = DateTime.MinValue;
    shipStatusOrig = excelRow["Est Ship Date"].ToString(); // excelRow is DataRow in the DataSet via the OleDbDataAdapter             
    
    if (shipStatusOrig != string.Empty)
    {
        // Date may be read in via oledb adapter as a double
        if (IsNumeric(shipStatusOrig))
        {
            double d = Convert.ToDouble(shipStatusOrig);
            dtShipStatus = DateTime.FromOADate(d);
    
            if (DateTime.TryParse(dtShipStatus.ToString(), out dtShipStatus))
            {
                validDate = true;
                Debug.WriteLine("{0} converted: ", dtShipStatus.ToString("s"));
            }
        }
        else
        {
            if (ValidateShipDate(shipStatusOrig))
            {
                dtShipStatus = DateTime.Parse(shipStatusOrig);
                validDate = true;
                Debug.WriteLine("{0} converted: ", dtShipStatus.ToString("s"));
            }
            else
            {
                validDate = false;
                MessageBox.Show("Invalid date format in the Excel spreadsheet.\nLine # " + progressBar1.Value + ", the 'Ship Status' value '" + shipStatusOrig + "' is invalid.\nDate should be in a valid date time format.\ne.g. M/DD/YY, M.D.Y, YYYY-MM-DD, etc.", "Invaid Ship Status Date");
            }
        }
    ...
    }
            public static Boolean IsNumeric (Object Expression)
            {
                if(Expression == null || Expression is DateTime)
                    return false;
    
                if(Expression is Int16 || Expression is Int32 || Expression is Int64 || Expression is Decimal || Expression is Single || Expression is Double || Expression is Boolean)
                    return true;
    
                try
                {
                    if(Expression is string)
                        Double.Parse(Expression as string);
                    else
                       Double.Parse(Expression.ToString());
                    return true;
                } catch {} // just dismiss errors but return false
    
                return false;
            }
    
            public bool ValidateShipDate(string shipStatus)
            {
                DateTime startDate;
                try
                {
                    startDate = DateTime.Parse(shipStatus);
                    return true;
                }
                catch
                {
                    return false;
                }
            }
    

提交回复
热议问题