繁体   English   中英

如何使用ASP.NET C#将Excel数据导入SQL Server,其中表的数据不在第一行开始?

[英]How do you import Excel data to SQL Server using ASP.NET C# where the table's data does not start at the first row?

我想将数据从excel文件导入到sql server数据库。 数据表不在excel的第一行开始。 就像这张照片:

在此输入图像描述

点击按钮时这是我的代码:

protected void btnUpload_Click(object sender, EventArgs e)
        {
            if (fileUpload.HasFile)
            {
                string path = string.Concat(Server.MapPath("~/File/" + fileUpload.FileName));
                fileUpload.SaveAs(path);

                string connExcelString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0 Xml;HDR=YES;IMEX=1\";", path);
                OleDbConnection ExcelConn = new OleDbConnection(connExcelString);
                try
                {


                    OleDbCommand cmd = new OleDbCommand("select * from [Sheet1$]", ExcelConn);

                    ExcelConn.Open();
                    OleDbDataReader dr = cmd.ExecuteReader();


                    string connSql = @"Data Source=.; Database=dbtest; User Id=sa; Password=mypassword;";

                    SqlBulkCopy bulkcopy = new SqlBulkCopy(connSql);

                    SqlBulkCopyColumnMapping mapNPM = new SqlBulkCopyColumnMapping("npm", "npm");
                    bulkcopy.ColumnMappings.Add(mapNPM);
                    SqlBulkCopyColumnMapping mapProdi = new SqlBulkCopyColumnMapping("prodi", "prodi");
                    bulkcopy.ColumnMappings.Add(mapProdi);
                    SqlBulkCopyColumnMapping mapGrade = new SqlBulkCopyColumnMapping("grade", "grade");
                    bulkcopy.ColumnMappings.Add(mapGrade);

                    bulkcopy.DestinationTableName = "testUpload";
                    bulkcopy.WriteToServer(dr);

                    msg.Text = "success";
                }
                catch (Exception ex)
                {
                    msg.Text = ex.Message.ToString();
                }
                finally
                {
                    ExcelConn.Close();
                }
            }

        }

当我尝试上传文件excel时,第一行是数据表,数据被成功导入到sql server中。 但是当文件数据excel看起来就像那张图片时,返回的消息是: The given ColumnName 'npm' does not match up with any column in data source.

你能帮我解决我的问题吗?

我找到了自己问题的答案。 我改变了从excel文件中检索数据的方式,而不是使用OLEDB更改为使用Office Interop。 所以我添加了一个引用Office Interop并修改源代码如下:

protected void btnUpload_Click(object sender, EventArgs e)
        {
            if (fileUpload.HasFile)
            {
                string path = string.Concat(Server.MapPath("~/File/" + fileUpload.FileName));
                fileUpload.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("npm");
                dt.Columns.Add("prodi");
                dt.Columns.Add("grade");

                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 connSql = @"Data Source=.; Database=dbkuring; User Id=sa; Password=pohodeui;";

                    SqlBulkCopy bulkcopy = new SqlBulkCopy(connSql);

                    SqlBulkCopyColumnMapping mapNPM = new SqlBulkCopyColumnMapping("npm", "npm");
                    bulkcopy.ColumnMappings.Add(mapNPM);
                    SqlBulkCopyColumnMapping mapProdi = new SqlBulkCopyColumnMapping("prodi", "prodi");
                    bulkcopy.ColumnMappings.Add(mapProdi);
                    SqlBulkCopyColumnMapping mapGrade = new SqlBulkCopyColumnMapping("grade", "grade");
                    bulkcopy.ColumnMappings.Add(mapGrade);

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

                    msg.Text = "success";
                }
                catch (Exception ex)
                {
                    msg.Text = ex.Message.ToString();
                }


            }
        }

要跳过读取数据的行数,我只需编辑此代码: for (int Rnum = 3; Rnum <= rowCount; Rnum++)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM