技术频道导航
HTML/CSS
.NET技术
IIS技术
PHP技术
Js/JQuery
Photoshop
Fireworks
服务器技术
操作系统
网站运营

赞助商

分类目录

赞助商

最新文章

搜索

C# .NET访问OLEDB或StreamReader读取Excel(.xls/.xlsx/.csv)文件

作者:admin    时间:2023-5-23 14:32:13    浏览:

Excel 文件分为三种类型:

  • .xls 格式 Office 2003 及旧版本
  • .xlsx 格式 Office 2007 及最新版本
  • .csv 格式 String 文本,以逗号分隔(以上两种格式都可以另存为这种格式。)

我们需要使用不同的方式来读取第一格式文件、第二格式文件和第三格式文件。

在本文中,我将展示一种使用 .NET 读取 Excel 文件内容的方法。

HTML代码

<div>  
       <%-- 文件上传控件,用于上传要读取的文件,获取文件信息 --%>  
       <asp:FileUpload ID="fileSelect" runat="server" />    
       <%-- 点击这个按钮运行读取方法 --%>  
       <asp:Button ID="btnRead" runat="server" Text="ReadStart" />  
</div> 

后台代码

//声明变量(属性)  
string currFilePath = string.Empty; //文件全路径  
string currFileExtension = string.Empty; //文件扩展名  
  
//Page_Load事件,注册按钮点击事件  
protected void Page_Load(object sender, EventArgs e) {  
  this.btnRead.Click += new EventHandler(btnRead_Click);  
}  
  
//按钮点击事件   
protected void btnRead_Click(object sender, EventArgs e) {  
  Upload(); //上传文件方法  
  if (this.currFileExtension == ".xlsx" || this.currFileExtension == ".xls") {  
    DataTable dt = ReadExcelToTable(currFilePath); //读取Excel文件(.XLS 和 .XLSX 格式)  
  } else if (this.currFileExtension == ".csv") {  
    DataTable dt = ReadExcelWidthStream(currFilePath); //读取 .CSV 文件  
  }  

下面展示了按钮点击事件中的三个方法。

///<summary>  
///上传文件到临时目录  
///</summary>  
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 文件的方法  
///</summary>
///<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 2007及上一版本不能出现多余的空格。我们需要注意分号。  
  string connstring = Provider = Microsoft.JET.OLEDB .4 .0;  
  Data Source = " + path + ";  
  Extended Properties = " 'Excel 8.0;HDR=NO;IMEX=1';"; //此连接字符串适用于 Office 2007 及旧版本。我们可以根据Office版本或者我们的程序选择最合适的连接字符串。  
  using(OleDbConnection conn = new OleDbConnection(connstring)) {  
    conn.Open();  
    DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); //获取所有工作表名称  
    string firstSheetName = sheetsName.Rows[0][2].ToString(); //获取第一个工作表名称  
    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格式的方法
///</summary>  
///<param name="path">读取文件完整路径</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;  

总结

本文仅供参考,方便学习。因此,该方法没有考虑复杂的情况。如果要读取稍微复杂的Excel文件,可以看看下面的方法。

相关文章

标签: CSharp  asp.net  CSV  Excel  
x
  • 站长推荐
/* 左侧显示文章内容目录 */