zoukankan      html  css  js  c++  java
  • .net读取excel

    Excel分类:

    •.xls格式       Office2003及以下版本
    •.xlsx格式    Office2007 及以上版本
    •.csv格式       以逗号分隔的字符串文本(可以将上述两种文件类型另存为此格式)   
    读取前两种格式和读取后一种格式会用两种不同的方法。

    下面看程序:
    页面前台:
    <div> 
           <%-- 文件上传控件  用于将要读取的文件上传 并通过此控件获取文件的信息--%> 
           <asp:FileUpload ID="fileSelect" runat="server" />   
             <%-- 点击此按钮执行读取方法--%> 
           <asp:Button ID="btnRead" runat="server" Text="ReadStart" /> 
    </div> 
         

    后台代码:

    View Code ====================================
    1 //声明变量(属性)
    2 string currFilePath = string.Empty; //待读取文件的全路径
    3 string currFileExtension = string.Empty;  //文件的扩展名

    5 //Page_Load事件 注册按钮单击事件
    6 protected void Page_Load(object sender,EventArgs e)
    7 {
    8     this.btnRead.Click += new EventHandler(btnRead_Click);
    9 }
    10
    11
    12 //按钮单击事件  
    //里面的3个方法将在下面给出
    13 protected void btnRead_Click(object sender,EventArgs e)
    14  {
    15     Upload(); 
    //上传文件方法
    16     if(this.currFileExtension ==".xlsx" || this.currFileExtension ==".xls")
    17       {
    18            DataTable dt = ReadExcelToTable(currFilePath);  //读取Excel文件(.xls和.xlsx格式)
    19       }
    20       else if(this.currFileExtension == ".csv")
    21        
              {
    22          DataTable dt = ReadExcelWidthStream(currFilePath);  //读取.csv格式文件
    23        }
    24  }
    下面列出按钮单击事件中的3个方法

    ///<summary>
    ///上传文件到临时目录中
    ///</ummary>
    private void Upload()
    {    
    HttpPostedFile file = this.fileSelect.PostedFile;    
    string fileName = file.FileName;    
    string tempPath = System.IO.Path.GetTempPath();   //获取系统临时文件路径     
    fileName = System.IO.Path.GetFileName(fileName); //获取文件名(不带路径)    
    this.currFileExtension = System.IO.Path.GetExtension(fileName);   //获取文件的扩展名    
    this.currFilePath = tempPath + fileName; //获取上传后的文件路径 记录到前面声明的全局变量    
    file.SaveAs(this.currFilePath);  //上传
    }


    ///<summary>
    ///读取xls\xlsx格式的Excel文件的方法
    ///</ummary>
    ///<param name="path">待读取Excel的全路径</param>
    ///<returns></returns>
    private DataTable ReadExcelToTable(string path)
    {
       //连接字符串
    string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  // Office 07及以上版本不能出现多余的空格 而且分号注意
    //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 
    //Office 07以下版本 因为本人用Office2010 所以没有用到这个连接字符串  可根据自己的情况选择 或者程序判断要用哪一//个连接字符串

    using(OleDbConnection conn = new OleDbConnection(connstring))
    {  
    conn.Open();  
    DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  //得到所有sheet的名字   
    string firstSheetName = sheetsName.Rows[0][2].ToString();   //得到第一个sheet的名字   
    string sql = string.Format("SELECT * FROM [{0}],firstSheetName);  //查询字符串    
    OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);    
    DataSet set = new DataSet();    
    ada.Fill(set);    
    return set.Tables[0];   
     }
    }


    ///<summary>
    ///读取csv格式的Excel文件的方法
    ///</ummary>
    ///<param name="path">待读取Excel的全路径</param>
    ///<returns></returns>
    private DataTable ReadExcelWithStream(string path)
    {  
    DataTable dt = new DataTable();  
    bool isDtHasColumn = false;   //标记DataTable 是否已经生成了列  
    StreamReader reader = new StreamReader(path,System.Text.Encoding.Default);  //数据流  
    while(!reader.EndOfStream)   
    {      
     string meaage = reader.ReadLine();      
     string[] splitResult = message.Split(new char[]{','},StringSplitOption.None);  //读取一行 以逗号分隔 存入数组            DataRow row = dt.NewRow();      
    for(int i = 0;i<splitResult.Length;i++)         
    {             
    if(!isDtHasColumn) //如果还没有生成列                 
    {                       
    dt.Columns.Add("column" + i,typeof(string));                   
    }                   
    row[i] = splitResult[i];            
    }           
      dt.Rows.Add(row);  //添加行           
     isDtHasColumn = true;  //读取第一行后 就标记已经存在列   再读取以后的行时,就不再生成列    
     }   
     return dt;
    }

    http://www.cnblogs.com/fengzheng/archive/2011/09/28/2194181.html

  • 相关阅读:
    【翻译九】java-同步方法
    【翻译八】java-内存一致性错误
    【翻译七】java-同步
    【翻译六】java-连接和实例
    【翻译五】java-中断机制
    【翻译四】java-并发之线程暂停
    [topcoder]TheGridDivTwo
    [topcoder]TheConsecutiveIntegersDivOne
    [leetcode]Maximum Product Subarray
    [leetcode]Find Minimum in Rotated Sorted Array
  • 原文地址:https://www.cnblogs.com/honkcal/p/2229624.html
Copyright © 2011-2022 走看看