peter
peter

Reputation: 8662

How to read excel file in asp.net

I am using Epplus library in order to upload data from excel file.The code i am using is perfectly works for excel file which has standard form.ie if first row is column and rest all data corresponds to column.But now a days i am getting regularly , excel files which has different structure and i am not able to read excel file like as shown below

what i want is on third row i wan only Region and Location Id and its values.Then 7th row is columns and 8th to 15 are its values.Finally 17th row is columns for 18th to 20th .How to load all these datas to seperate datatables code i used is as shown below I created an extension method

 public static DataSet Exceltotable(this string path)
        {
            DataSet ds = null;
            using (var pck = new OfficeOpenXml.ExcelPackage())
            {
                try
                {
                    using (var stream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        pck.Load(stream);
                    }
                    ds = new DataSet();
                    var wss = pck.Workbook.Worksheets;
                    ////////////////////////////////////
                    //Application app = new Application();
                    //app.Visible = true;
                    //app.Workbooks.Add("");
                    //app.Workbooks.Add(@"c:\MyWork\WorkBook1.xls");
                    //app.Workbooks.Add(@"c:\MyWork\WorkBook2.xls");
                    //for (int i = 2; i <= app.Workbooks.Count; i++)
                    //{
                    //    for (int j = 1; j <= app.Workbooks[i].Worksheets.Count; j++)
                    //    {
                    //        Worksheet ws = app.Workbooks[i].Worksheets[j];
                    //        ws.Copy(app.Workbooks[1].Worksheets[1]);
                    //    }
                    //}

                    ///////////////////////////////////////////////////

                    //for(int s=0;s<5;s++)
                    //{
                    foreach (var ws in wss)
                    {
                        System.Data.DataTable tbl = new System.Data.DataTable();
                        bool hasHeader = true; // adjust it accordingly( i've mentioned that this is a simple approach)
                        string ErrorMessage = string.Empty;
                        foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
                        {

                            tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));

                        }
                        var startRow = hasHeader ? 2 : 1;
                        for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
                        {
                            var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                            var row = tbl.NewRow();
                            foreach (var cell in wsRow)
                            {
                                //modifed by faras
                                if (cell.Text != null)
                                {
                                    row[cell.Start.Column - 1] = cell.Text;
                                }
                            }
                            tbl.Rows.Add(row);
                            tbl.TableName = ws.Name;
                        }
                        DataTable dt = RemoveEmptyRows(tbl);
                        ds.Tables.Add(dt);
                    }
                }
                catch (Exception exp)
                {


                }
                return ds;
            }
        }

Upvotes: 3

Views: 17438

Answers (4)

Jdslk
Jdslk

Reputation: 97

I found this article to be very helpful.

It lists various libraries you can choose from. One of the libraries I used is EPPlus as shown below.

Nuget: EPPlus Library

Excel Sheet 1 Data
Cell A2 Value   : 
Cell A2 Color   :
Cell B2 Formula :
Cell B2 Value   :
Cell B2 Border  :

Excel Sheet 2 Data
Cell A2 Formula :
Cell A2 Value   :
static void Main(string[] args)
{
    using(var package = new ExcelPackage(new FileInfo("Book.xlsx")))
    {
        var firstSheet = package.Workbook.Worksheets["First Sheet"];
        Console.WriteLine("Sheet 1 Data");
        Console.WriteLine($"Cell A2 Value   : {firstSheet.Cells["A2"].Text}");
        Console.WriteLine($"Cell A2 Color   : {firstSheet.Cells["A2"].Style.Font.Color.LookupColor()}");
        Console.WriteLine($"Cell B2 Formula : {firstSheet.Cells["B2"].Formula}");
        Console.WriteLine($"Cell B2 Value   : {firstSheet.Cells["B2"].Text}");
        Console.WriteLine($"Cell B2 Border  : {firstSheet.Cells["B2"].Style.Border.Top.Style}");
        Console.WriteLine("");

        var secondSheet = package.Workbook.Worksheets["Second Sheet"];
        Console.WriteLine($"Sheet 2 Data");
        Console.WriteLine($"Cell A2 Formula : {secondSheet.Cells["A2"].Formula}");
        Console.WriteLine($"Cell A2 Value   : {secondSheet.Cells["A2"].Text}");
    }
}

Upvotes: 0

Mouli Reddy
Mouli Reddy

Reputation: 21

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.OleDb;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace ReadData
{
public partial class ImportExelDataInGridView : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void btnUpload_Click(object sender, EventArgs e)
    {
        //Coneection String by default empty
        string ConStr = "";
        //Extantion of the file upload control saving into ext because 
        //there are two types of extation .xls and .xlsx of excel 
        string ext = Path.GetExtension(FileUpload1.FileName).ToLower();
        //getting the path of the file 
        string path = Server.MapPath("~/MyFolder/"+FileUpload1.FileName);
        //saving the file inside the MyFolder of the server
        FileUpload1.SaveAs(path);
        Label1.Text = FileUpload1.FileName + "\'s Data showing into the GridView";
        //checking that extantion is .xls or .xlsx
        if (ext.Trim() == ".xls")
        {
            //connection string for that file which extantion is .xls
            ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
        }
        else if (ext.Trim() == ".xlsx")
        {
            //connection string for that file which extantion is .xlsx
            ConStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
        }
        //making query
        string query = "SELECT * FROM [Sheet1$]";
        //Providing connection
        OleDbConnection conn = new OleDbConnection(ConStr);
        //checking that connection state is closed or not if closed the 
        //open the connection
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }
        //create command object
        OleDbCommand cmd = new OleDbCommand(query, conn);
        // create a data adapter and get the data into dataadapter
        OleDbDataAdapter da = new OleDbDataAdapter(cmd);
        DataSet ds = new DataSet();
        //fill the excel data to data set
        da.Fill(ds);
        if (ds.Tables != null && ds.Tables.Count > 0)
        {
            for (int i = 0; i < ds.Tables[0].Columns.Count; i++)
            {
                if (ds.Tables[0].Columns[0].ToString() == "ID" && ds.Tables[0].Columns[1].ToString() == "name")
                {

                }

                //else if (ds.Tables[0].Rows[0][i].ToString().ToUpper() == "NAME")
                //{

                //}
                //else if (ds.Tables[0].Rows[0][i].ToString().ToUpper() == "EMAIL")
                //{

                //}
            }
        }

        //set data source of the grid view
        gvExcelFile.DataSource = ds.Tables[0];
        //binding the gridview
        gvExcelFile.DataBind();
        //close the connection
        conn.Close();
    }
}

}

Upvotes: 1

Venura Jayadewa
Venura Jayadewa

Reputation: 1

        try
        {
            System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel");
            foreach (System.Diagnostics.Process p in process)
            {
                if (!string.IsNullOrEmpty(p.ProcessName))
                {
                    try
                    {

                        p.Kill();


                    }
                    catch { }
                }
            }


            REF_User oREF_User = new REF_User();
            oREF_User = (REF_User)Session["LoggedUser"];
            string pdfFilePath = Server.MapPath("~/FileUpload/" + oREF_User.USER_ID + "");
            if (Directory.Exists(pdfFilePath))
            {
                System.IO.DirectoryInfo di = new DirectoryInfo(pdfFilePath);
                foreach (FileInfo file in di.GetFiles())
                {
                    file.Delete();
                }
                Directory.Delete(pdfFilePath);
            }
            Directory.CreateDirectory(pdfFilePath);
            string path = Server.MapPath("~/FileUpload/" + oREF_User.USER_ID + "/");

            if (Path.GetExtension(FileUpload1.FileName) == ".xlsx")
            {


                string fullpath1 = path + Path.GetFileName(FileUpload1.FileName);
                if (FileUpload1.FileName != "")
                {
                    FileUpload1.SaveAs(fullpath1);


                }


                FileStream Stream = new FileStream(fullpath1, FileMode.Open);
                IExcelDataReader ExcelReader = ExcelReaderFactory.CreateOpenXmlReader(Stream);
                DataSet oDataSet = ExcelReader.AsDataSet();
                Stream.Close();
                bool result = false;
                foreach (System.Data.DataTable oDataTable in oDataSet.Tables)
                {


                  //ToDO code 




                }




                oBL_PlantTransactions.InsertList(oListREF_PlantTransactions, null);
                ShowMessage("Successfully saved!", REF_ENUM.MessageType.Success);
            }
            else
            {
                ShowMessage("File Format Incorrect", REF_ENUM.MessageType.Error);
            }
        }
        catch (Exception ex)
        {
            ShowMessage("Please check the details and submit again!", REF_ENUM.MessageType.Error);
            System.Diagnostics.Process[] process = System.Diagnostics.Process.GetProcessesByName("Excel");
            foreach (System.Diagnostics.Process p in process)
            {
                if (!string.IsNullOrEmpty(p.ProcessName))
                {
                    try
                    {

                        p.Kill();


                    }
                    catch { }
                }
            }
        }

Upvotes: 0

Scott Hannen
Scott Hannen

Reputation: 29222

If you're providing the template for users to upload, you can mitigate this some by using named ranges in your spreadsheet. That's a good idea anyway when programmatically working with Excel because it helps when you modify your own spreadsheet, not just when the user does.

You probably know how to name a range, but for the sake of completeness, here's how to name a range.

When you're working with the spreadsheet in code you can get a reference to the range using [yourworkbook].Names["yourNamedRange"]. If it's just a single cell and you need to reference the row or column index you can use .Start.Row or .Start.Column.

I add named ranges for anything - cells containing particular values, columns, header rows, rows where sets of data begin. If I need row or column indexes I assign useful variable names. That protects you from having all sorts of "magic numbers" in your spreadsheet. You (or your users) can move quite a bit around without breaking anything.

If they modify the structure too much then it won't work. You can also use protection on the workbook and worksheet to ensure that they can't accidentally modify the structure - tabs, rows, columns.


This is loosely taken from a test I was working with last weekend when I was learning this. It was just a "hello world" so I wasn't trying to make it all streamlined and perfect. (I was working on populating a spreadsheet, not reading one, so I'm just learning the properties as I go.)

// Open the workbook
using (var package = new ExcelPackage(new FileInfo("PriceQuoteTemplate.xlsx")))
{
    // Get the worksheet I'm looking for
    var quoteSheet = package.Workbook.Worksheets["Quote"];

    //If I wanted to get the text from one named range
    var cellText = quoteSheet.Workbook.Names["myNamedRange"].Text

    //If I wanted to get the cell's value as some other type
    var cellValue = quoteSheet.Workbook.Names["myNamedRange"].GetValue<int>();

    //If I had a named range and I wanted to loop through the rows and get 
    //values from certain columns
    var myRange = quoteSheet.Workbook.Names["rangeContainingRows"];

    //This is a named range used to mark a column. So instead of using a
    //magic number, I'll read from whatever column has this named range.
    var someColumn = quoteSheet.Workbook.Names["columnLabel"].Start.Column;

    for(var rowNumber = myRange.Start.Row; rowNumber < myRange.Start.Row + myRange.Rows; rowNumber++)
    {  
        var getTheTextForTheRowAndColumn = quoteSheet.Cells(rowNumber, someColumn).Text
    }

There might be a more elegant way to go about it. I just started using this myself. But the idea is you tell it to find a certain named range on the spreadsheet, and then you use the row or column number of that range instead of a magic row or column number.

Even though a range might be one cell, one row, or one column, it can potentially be a larger area. That's why I use .Start.Row. In other words, give me the row for the first cell in the range. If a range has more than one row, the .Rows property indicates the number of rows so I know how many there are. That means someone could even insert rows without breaking the code.

Upvotes: 3

Related Questions