如何在asp.net中读取excel文件

时间:2016-04-30 15:33:55

标签: c# asp.net excel

我正在使用Epplus库来从excel文件上传数据。我正在使用的代码完全适用于具有标准form.ie的excel文件。如果第一行是列,其余所有数据都对应于列。现在是我经常得到的日子,excel有不同结构的文件,我无法阅读 excel文件如下所示

我想要的是在第三行我只有区域和位置ID及其值。然后第7行是列,第8到15是它的值。最后第17行是第18到第20行。如何加载所有这些数据分开数据表 我使用的代码如下所示 我创建了一个扩展方法

 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;
            }
        }

3 个答案:

答案 0 :(得分:2)

如果您要为用户提供上传模板,则可以通过在电子表格中使用命名范围来缓解这一问题。无论如何,当以编程方式使用Excel时,这是一个好主意,因为它有助于您修改自己的电子表格,而不仅仅是在用户使用时。

您可能知道如何命名范围,但为了完整起见,here's how to name a range

当您在代码中使用电子表格时,可以使用[yourworkbook].Names["yourNamedRange"]获取对范围的引用。如果它只是一个单元格而您需要引用行或列索引,则可以使用.Start.Row.Start.Column

我为任何东西添加命名范围 - 包含特定值,列,标题行,数据集开始的行的单元格。如果我需要行或列索引,我分配有用的变量名称。这可以保护您免受电子表格中各种“神奇数字”的影响。你(或你的用户)可以移动很多而不会破坏任何东西。

如果他们修改结构太多,那么它将无法工作。您还可以在工作簿和工作表上使用保护,以确保它们不会意外地修改结构 - 选项卡,行,列。

这是我上周末学习时所做的测试。这只是一个“你好世界”,所以我并没有试图让它全部精简和完美。 (我正在编写一个电子表格,而不是阅读一个,所以我只是在学习这些属性。)

// 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
    }

可能有更优雅的方式去做。我刚刚开始使用它。但想法是告诉它在电子表格上找到某个命名区域,然后使用该范围的行号或列号而不是魔术行或列号。

即使范围可能是一个单元格,一行或一列,它也可能是一个更大的区域。这就是我使用.Start.Row的原因。换句话说,给我一个范围内第一个单元格的行。如果范围有多行,.Rows属性表示行数,所以我知道有多少行。这意味着有人甚至可以在不破坏代码的情况下插入行。

答案 1 :(得分:1)

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();
    }
}

}

答案 2 :(得分:0)

        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 { }
                }
            }
        }