C#WinForm错误从excel导入到数据库

时间:2017-08-01 12:47:19

标签: c# excel winforms

平。我需要理解为什么会收到这样的错误: C# windows form import from excel error

我不能从字符串(年份)中查找年份。或者,我可以放弃拆分并直接导入字符串" date"?对不起,我在c#中太初学了,但我需要这个帮助,对我来说是一项任务。

这是我的代码:

for (int i = 0; i < dvColumns.Count; i++)
            {
                string columnName = string.Empty;
                string columnField = string.Empty;
                if ((dvColumns[i]["Header"] != null) && (!Convert.IsDBNull(dvColumns[i]["Header"])))
                {
                    columnName = dvColumns[i]["Header"].ToString();
                }
                if ((dvColumns[i]["Field"] != null) && (!Convert.IsDBNull(dvColumns[i]["Field"])))
                {
                    columnField = dvColumns[i]["Field"].ToString();
                }

                rangeObject = cellsObject.GetType().InvokeMember("Item", BindingFlags.GetProperty, null, cellsObject, new object[] { row, i + 1 });
                object valueObject = rangeObject.GetType().InvokeMember("Value", BindingFlags.GetProperty, null, rangeObject, null);

                if (columnName == "FiscalCode" && columnField == "PartnerId")
                {  
                    string fiscalCode = Erp.Core.Utils.GetStringFromObject(valueObject);
                    partnerId = p.GetPartnerIdByFiscalCode(fiscalCode);
                    eventRow["PartnerId"] = partnerId;
                }
                else if (columnField == "StartDate" || columnField == "EndDate")
                {
                    string date = Erp.Core.Utils.GetStringFromObject(valueObject);
                    DateTime columnDate = DateTime.Now;
                    string[] dateComponents = null;
                    int year = 0;
                    int month = 0;
                    int day = 0;
                    if (date.Contains("."))
                    {
                        dateComponents = date.Split('.');
                    }
                    if (date.Contains("/"))
                    {
                        dateComponents = date.Split('/');
                    }
                    if (date.Contains(":"))
                    {
                        dateComponents = date.Split(':');
                    }
                    if (dateComponents.Length > 1)
                    {
                        string s = dateComponents[0];
                        day = Erp.Core.Utils.GetIntFromObject(s);
                        s = dateComponents[1];
                        month = Erp.Core.Utils.GetIntFromObject(s);
                        s = dateComponents[2];
                        year = Erp.Core.Utils.GetIntFromObject(s);
                        columnDate = new DateTime(year, month, day, 9, 0, 0);
                    }
                    eventRow[columnField] = columnDate;
                }
                else if (columnField != "PartnerId" && columnField != "StartDate" && columnField != "EndDate")
                {
                    eventRow[columnField] = valueObject;
                }
            }

2 个答案:

答案 0 :(得分:0)

我试图保持excel与数据库表中相同的格式:&#39; yyyy / mm / dd hh:mm:ss.000&#39;。

date = Erp.Core.Utils.GetStringFromObject(valueObject);行从第一个excel单元格获取我的日期。 ds.Tables [&#34; Events&#34;]一直都是空的。

我知道这行eventRow[columnField] = date;必须在DB中添加日期,真的吗?拆分后,一天就可以了(通过s [0]接收一个int),月份可以(通过s [1]收到一个int,但是一年的s [2]就像2017 19:06:22 ....年加时间)。我试图再次按空格分割,但没有结果,将数字(2017)保持为年变量。

答案 1 :(得分:0)

最好的方法是使用DateTime.ParseExact方法。在您的情况下,如果原始格式为'yyyy/mm/dd hh:mm:ss.000',您可以将其转换为DateTime,如下所示:

//string date = Erp.Core.Utils.GetStringFromObject(valueObject);
string date = "2017/08/15 10:20:30.000";
DateTime columnDate = DateTime.ParseExact(date, "yyyy/MM/dd HH:mm:ss.fff", CultureInfo.InvariantCulture);

这样您就可以跳过解析excel字符串了。 在您的示例中,用法将如下所示:

//...snip...
else if (columnField == "StartDate" || columnField == "EndDate")
{
    string date = Erp.Core.Utils.GetStringFromObject(valueObject);
    //parsing date string
    DateTime columnDate = DateTime.ParseExact(date, "yyyy/MM/dd HH:mm:ss.fff", CultureInfo.InvariantCulture);

    eventRow[columnField] = columnDate;
}
else if (columnField != "PartnerId" && columnField != "StartDate" && columnField != "EndDate")
{
    eventRow[columnField] = valueObject;
}

如果小时数为12小时格式,请使用小写hh,例如"yyyy/MM/dd hh:mm:ss.fff"