In this article I will explain with an example, how to read and import 
Excel file (sheet) data to 
SQL Server database using 
OpenXml in ASP.Net with C# and VB.Net.
		 
	
		 
	
		
			Install DocumentFormat.OpenXml package
	
	
	
		 
	
		 
	
		
			Database
	
	
		I have made use of the following table Customers with the schema as follows. CustomerId is an Auto-Increment (Identity) column.
	![Import Excel file to Database using OpenXML in ASP.Net]() 
	
		 
	
		Note: You can download the database table SQL by clicking the download link below.
		
	 
	
		 
	
		 
	
		
			HTML Markup
	
	
		The HTML Markup consists of following controls:
	
		FileUpload – For selecting 
Excel file.
 
	
		Button – For reading 
Excel file data and insert into database.
 
	
		The Button has been assigned with an OnClick event handler.
	
		
			<asp:FileUpload ID="fuUpload" runat="server" />
		
			<asp:Button ID="btnImport" runat="server" Text="Import" OnClick="ImportExcel" />
	 
	
		 
	
		 
	
		
			Namespaces
	
	
		You will need to import the following namespaces.
	
		C#
	
		
			using System.IO;
		
			using System.Data;
		
			using System.Data.SqlClient;
		
			using System.Configuration;
		
			using DocumentFormat.OpenXml.Packaging;
		
			using DocumentFormat.OpenXml.Spreadsheet;
	 
	
		 
	
		VB.Net
	
		
			Imports System.IO
		
			Imports System.Data
		
			Imports System.Data.SqlClient
		
			Imports System.Configuration
		
			Imports DocumentFormat.OpenXml.Packaging
		
			Imports DocumentFormat.OpenXml.Spreadsheet
	 
	
		 
	
		 
	
		
			Importing Excel data to database using OpenXml
	
	
		When the 
Import Button is clicked, the uploaded 
Excel file is saved to a folder named 
Files and then it is opened and read using 
OpenXml SpreadsheetDocument class object.
		After that, the instance of the first Sheet is determined and all the rows present in the Sheet are fetched.
	
		Then, using nested FOR EACH loop is executed over the fetched rows and GetValue method (explained later) is called and columns are added to the DataTable.
	
		 
	
		
			GetValue
	
	
		The GetValue function accepts SpreadsheetDocument and Cell class objects as a parameter where a cell value is determined and initialized.
	
		Then, a check is performed if cell datatype NOT equal to NULL and cell value is string then, it returns the cell value.
	
		 
	
		Now, a connection is established with the database and the SqlBulkCopy object is initialized and the name of the Table is specified using the DestinationTableName property.
	
		Finally, the columns are mapped and all the rows from the 
DataTable are inserted into the 
SQL Server table.
		Note: The mapping of columns of the 
DataTable and the 
SQL Server table is optional and you need to do only in case where your 
DataTable and/or the 
SQL Server Table do not have same number of columns or the names of columns are different.
 
	
		 
	
		C#
	
		
			protected void ImportExcel(object sender, EventArgs e)
		
			{
		
			    //Save the uploaded Excel file.
		
			    string filePath = Server.MapPath("~/Files/") + Path.GetFileName(fuUpload.PostedFile.FileName);
		
			    fuUpload.SaveAs(filePath);
		
			 
		
			    //Open the Excel file in Read Mode using OpenXml.
		
			    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false))
		
			    {
		
			        //Read the first Sheets from Excel file.
		
			        Sheet sheet = doc.WorkbookPart.Workbook.Sheets.GetFirstChild<Sheet>();
		
			 
		
			        //Get the Worksheet instance.
		
			        Worksheet worksheet = (doc.WorkbookPart.GetPartById(sheet.Id.Value) as WorksheetPart).Worksheet;
		
			 
		
			        //Fetch all the rows present in the Worksheet.
		
			        IEnumerable<Row> rows = worksheet.GetFirstChild<SheetData>().Descendants<Row>();
		
			 
		
			        //Create a new DataTable.
		
			        DataTable dt = new DataTable();
		
			 
		
			        //Loop through the Worksheet rows.
		
			        foreach (Row row in rows)
		
			        {
		
			            //Use the first row to add columns to DataTable
		
			            if (row.RowIndex.Value == 1)
		
			            {
		
			                foreach (Cell cell in row.Descendants<Cell>())
		
			                {
		
			                    dt.Columns.Add(this.GetValue(doc, cell));
		
			                }
		
			            }
		
			            else
		
			            {
		
			                //Add rows to DataTable.
		
			                dt.Rows.Add();
		
			                int i = 0;
		
			                foreach (Cell cell in row.Descendants<Cell>())
		
			                {
		
			                    dt.Rows[dt.Rows.Count - 1][i] = this.GetValue(doc, cell);
		
			                    i++;
		
			                }
		
			            }
		
			        }
		
			 
		
			        //Insert the Data read from the Excel file to Database Table.
		
			        string constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
		
			        using (SqlConnection con = new SqlConnection(constr))
		
			        {
		
			            using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
		
			            {
		
			                //Set the database table name.
		
			                sqlBulkCopy.DestinationTableName = "dbo.Customers";
		
			 
		
			                //[OPTIONAL]: Map the Excel columns with that of the database table.
		
			                sqlBulkCopy.ColumnMappings.Add("Id", "CustomerId");
		
			                sqlBulkCopy.ColumnMappings.Add("Name", "Name");
		
			                sqlBulkCopy.ColumnMappings.Add("Country", "Country");
		
			 
		
			                con.Open();
		
			                sqlBulkCopy.WriteToServer(dt);
		
			                con.Close();
		
			            }
		
			        }
		
			    }
		
			}
		
			 
		
			private string GetValue(SpreadsheetDocument doc, Cell cell)
		
			{
		
			    string value = cell.CellValue.InnerText;
		
			    if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
		
			    {
		
			        return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(int.Parse(value)).InnerText;
		
			    }
		
			    return value;
		
			}
	 
	
		 
	
		VB.Net
	
		
			Protected Sub ImportExcel(sender As Object, e As EventArgs)
		
			    'Save the uploaded Excel file.
		
			    Dim filePath As String = Server.MapPath("~/Files/") + Path.GetFileName(fuUpload.PostedFile.FileName)
		
			    fuUpload.SaveAs(filePath)
		
			 
		
			    'Open the Excel file in Read Mode using OpenXml.
		
			    Using doc As SpreadsheetDocument = SpreadsheetDocument.Open(filePath, False)
		
			        'Read the first Sheets from Excel file.
		
			        Dim sheet As Sheet = doc.WorkbookPart.Workbook.Sheets.GetFirstChild(Of Sheet)()
		
			 
		
			        'Get the Worksheet instance.
		
			        Dim worksheet As Worksheet = TryCast(doc.WorkbookPart.GetPartById(sheet.Id.Value), WorksheetPart).Worksheet
		
			 
		
			        'Fetch all the rows present in the Worksheet.
		
			        Dim rows As IEnumerable(Of Row) = worksheet.GetFirstChild(Of SheetData)().Descendants(Of Row)()
		
			 
		
			        'Create a new DataTable.
		
			        Dim dt As New DataTable()
		
			 
		
			        'Loop through the Worksheet rows.
		
			        ForEach row As Row In rows
		
			            'Use the first row to add columns to DataTable
		
			            If row.RowIndex.Value = 1 Then
		
			                ForEach cell As Cell In row.Descendants(Of Cell)()
		
			                    dt.Columns.Add(Me.GetValue(doc, cell))
		
			                Next
		
			            Else
		
			                'Add rows to DataTable.
		
			                dt.Rows.Add()
		
			                Dim i As Integer = 0
		
			                For Each cell As Cell In row.Descendants(Of Cell)()
		
			                    dt.Rows(dt.Rows.Count - 1)(i) = Me.GetValue(doc, cell)
		
			                    i += 1
		
			                Next
		
			            End If
		
			        Next
		
			 
		
			        'Insert the Data read from the Excel file to Database Table.
		
			        Dim constr As String = ConfigurationManager.ConnectionStrings("constr").ConnectionString
		
			        Using con As New SqlConnection(constr)
		
			            Using sqlBulkCopy As New SqlBulkCopy(con)
		
			                'Set the database table name.
		
			                sqlBulkCopy.DestinationTableName = "dbo.Customers"
		
			 
		
			                '[OPTIONAL]: Map the Excel columns with that of the database table.
		
			                sqlBulkCopy.ColumnMappings.Add("Id", "CustomerId")
		
			                sqlBulkCopy.ColumnMappings.Add("Name", "Name")
		
			                sqlBulkCopy.ColumnMappings.Add("Country", "Country")
		
			 
		
			                con.Open()
		
			                sqlBulkCopy.WriteToServer(dt)
		
			                con.Close()
		
			            End Using
		
			        End Using
		
			    End Using
		
			End Sub
		
			 
		
			Private Function GetValue(doc As SpreadsheetDocument, cell As Cell) As String
		
			    Dim value As String = cell.CellValue.InnerText
		
			    If cell.DataType IsNot Nothing AndAlso cell.DataType.Value = CellValues.SharedString Then
		
			        Return doc.WorkbookPart.SharedStringTablePart.SharedStringTable.ChildElements.GetItem(Integer.Parse(value)).InnerText
		
			    End If
		
			    Return value
		
			End Function
	 
	
		 
	
		 
	
		
			Screenshots
	
	![Import Excel file to Database using OpenXML in ASP.Net]() 
	
		 
	
		
			The Excel File
	
	![Import Excel file to Database using OpenXML in ASP.Net]() 
	
		 
	
		
			Table containing the data from the Excel file
	
	![Import Excel file to Database using OpenXML in ASP.Net]() 
	
		 
	
		 
	
		
			Downloads