将 Excel 导入 SQL 将日期存储为 ASP.NET 中的数值

Posted

技术标签:

【中文标题】将 Excel 导入 SQL 将日期存储为 ASP.NET 中的数值【英文标题】:Importing Excel to SQL stores dates as numeric values in ASP.NET 【发布时间】:2020-05-01 18:13:49 【问题描述】:

我有一个将 Excel 文件(使用 asp.net 的用户输入)加载到 SQL 表的 sn-p,我一直试图将日期保留为“DD/MM/YYYY”而不是“438xx”。我尝试使用.NumberFormat,但它没有给出任何解决方案,因为数据表除了 ToString() 之外不允许任何东西,它也将值存储为 int 值。有什么方法可以转换这些数据?

if (subeArchivo.HasFile)
            
                string path = string.Concat(Server.MapPath("~/" + subeArchivo.FileName));
                subeArchivo.SaveAs(path);

                Microsoft.Office.Interop.Excel.Application appExcel;
                Microsoft.Office.Interop.Excel.Workbook workbook;
                Microsoft.Office.Interop.Excel.Range range;
                Microsoft.Office.Interop.Excel._Worksheet worksheet;

                appExcel = new Microsoft.Office.Interop.Excel.Application();
                workbook = appExcel.Workbooks.Open(path, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                worksheet = (Microsoft.Office.Interop.Excel._Worksheet)workbook.Sheets[1];
                range = worksheet.UsedRange;

                int rowCount = range.Rows.Count;
                int colCount = range.Columns.Count;

                System.Data.DataTable dt = new System.Data.DataTable();
                dt.Columns.Add("ID_USU_CAR");
                dt.Columns.Add("RUT_DCT");
                dt.Columns.Add("TIP_CON");
                dt.Columns.Add("ID_CON");
                dt.Columns.Add("INI_BEN"); //date values as int
                dt.Columns.Add("FIN_BEN"); //date values as int
                dt.Columns.Add("MON_CLP");

                for (int Rnum = 3; Rnum <= rowCount; Rnum++)
                
                    DataRow dr = dt.NewRow();
                    //Reading Each Column value From sheet to datatable Colunms                  
                    for (int Cnum = 1; Cnum <= colCount; Cnum++)
                    
                        dr[Cnum - 1] = (range.Cells[Rnum, Cnum]).Value2.ToString();
                    
                    dt.Rows.Add(dr); // adding Row into DataTable
                    dt.AcceptChanges();
                

                workbook.Close(true);
                appExcel.Quit();

                try
                

                string cadenaConn = ConfigurationManager.ConnectionStrings["cadenaConn"].ConnectionString.ToString();

                    SqlBulkCopy bulkcopy = new SqlBulkCopy(cadenaConn);

                    SqlBulkCopyColumnMapping ID_USU_CAR = new SqlBulkCopyColumnMapping("ID_USU_CAR", "ID_USU_CAR");
                    bulkcopy.ColumnMappings.Add(ID_USU_CAR);
                    SqlBulkCopyColumnMapping RUT_DCT = new SqlBulkCopyColumnMapping("RUT_DCT", "RUT_DCT");
                    bulkcopy.ColumnMappings.Add(RUT_DCT);
                    SqlBulkCopyColumnMapping TIP_CON = new SqlBulkCopyColumnMapping("TIP_CON", "TIP_CON");
                    bulkcopy.ColumnMappings.Add(TIP_CON);
                    SqlBulkCopyColumnMapping ID_CON = new SqlBulkCopyColumnMapping("ID_CON", "ID_CON");
                    bulkcopy.ColumnMappings.Add(ID_CON);
                    SqlBulkCopyColumnMapping INI_BEN = new SqlBulkCopyColumnMapping("INI_BEN", "INI_BEN");
                    bulkcopy.ColumnMappings.Add(INI_BEN);
                    SqlBulkCopyColumnMapping FIN_BEN = new SqlBulkCopyColumnMapping("FIN_BEN", "FIN_BEN");
                    bulkcopy.ColumnMappings.Add(FIN_BEN);
                    SqlBulkCopyColumnMapping MON_CLP = new SqlBulkCopyColumnMapping("MON_CLP", "MON_CLP");
                    bulkcopy.ColumnMappings.Add(MON_CLP);

                    bulkcopy.DestinationTableName = "TBL";
                    bulkcopy.WriteToServer(dt);

                    lblConfirma.Text = "CARGA EXITOSA";
                
                catch (Exception ex)
                
                    lblConfirma.Text = ex.Message.ToString();
                


            

【问题讨论】:

您能否分享一些 Excel 文件中的值示例以及 datatable 中的预期值是什么?你得到的输出是什么? 【参考方案1】:

Excel 将日期存储为双精度数,计算自固定 epoc 以来的天数。您可以拨打DateTime.FromOADate进行转换。

【讨论】:

个人,而不是将excel范围复制到DataTable。我会实现一个IDataReader 直接从范围中提取数据,并根据 SqlBulkCopy 尝试读取的列类型转换每个值。 你好,我在哪里可以调用日期时间?大容量复制或数据表都不允许我:( DateTime.FromOADate((range.Cells[Rnum, Cnum]).Value2),当然要知道是哪一列...

以上是关于将 Excel 导入 SQL 将日期存储为 ASP.NET 中的数值的主要内容,如果未能解决你的问题,请参考以下文章

将csv文件/excel导入sql数据库asp.net

使用 excel 日期导入 phpmyadmin sql

将我的日期列从 Excel 导入/转换为 SQL Server 中的日期时间数据类型?

使用asp.net将Excel文件数据导入Sql server

我是不是需要在服务器中安装 office 2007,以便我可以使用 ASP.NET 将 excel 2007 导入 SQL?

asp网页中EXCEL 表格导入SQL2000数据库问题