Hi Shivam07,
Check this example. Now please take its reference and correct your code.
HTML
Sheet Number: <asp:TextBox runat="server" ID="txtSheetNumber" />
<asp:Button ID="btnImport" runat="server" Text="Import" OnClick="ImportExcel" />
<hr />
<asp:GridView ID="GridView1" runat="server">
</asp:GridView>
Namespaces
C#
using System.Data;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
VB.Net
Imports System.Data
Imports System.Collections.Generic
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
Code
C#
protected void ImportExcel(object sender, EventArgs e)
{
string filePath = Server.MapPath("~/Files/Sample.xlsx");
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filePath, false))
{
Sheet sheet = (Sheet)doc.WorkbookPart.Workbook.Sheets.ChildElements.GetItem(Convert.ToInt32(txtSheetNumber.Text) - 1);
Worksheet worksheet = (doc.WorkbookPart.GetPartById(sheet.Id.Value) as WorksheetPart).Worksheet;
IEnumerable<Row> rows = worksheet.GetFirstChild<SheetData>().Descendants<Row>();
DataTable dt = new DataTable();
foreach (Row row in rows)
{
if (row.RowIndex.Value == 1)
{
foreach (Cell cell in row.Descendants<Cell>())
{
dt.Columns.Add(GetValue(doc, cell));
}
}
else
{
dt.Rows.Add();
int i = 0;
foreach (Cell cell in row.Descendants<Cell>())
{
dt.Rows[dt.Rows.Count - 1][i] = GetValue(doc, cell);
i++;
}
}
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
}
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)
Dim filePath As String = Server.MapPath("~/Files/Sample.xlsx")
Using doc As SpreadsheetDocument = SpreadsheetDocument.Open(filePath, False)
Dim sheet As Sheet = CType(doc.WorkbookPart.Workbook.Sheets.ChildElements.GetItem(Convert.ToInt32(txtSheetNumber.Text) - 1), Sheet)
Dim worksheet As Worksheet = TryCast(doc.WorkbookPart.GetPartById(sheet.Id.Value), WorksheetPart).Worksheet
Dim rows As IEnumerable(Of Row) = worksheet.GetFirstChild(Of SheetData)().Descendants(Of Row)()
Dim dt As New DataTable()
For Each row As Row In rows
If row.RowIndex.Value = 1 Then
For Each cell As Cell In row.Descendants(Of Cell)()
dt.Columns.Add(GetValue(doc, cell))
Next
Else
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) = GetValue(doc, cell)
i += 1
Next
End If
Next
GridView1.DataSource = dt
GridView1.DataBind()
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
Screenshot
