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文件,可以看看下面的方法。
相关文章
- C# CSV解析器TinyCsvParser使用示例:自定义映射
- C# CSV解析器TinyCsvParser使用示例:映射数组
- C# CSV解析器TinyCsvParser使用示例:解析枚举
- C# CSV解析器TinyCsvParser使用示例:解析自定义格式
- TinyCsvParser - 使用C#解析CSV数据
- C# .NET fastCSV : 小巧快速、符合标准的CSV读写器
- 11示例教你用C# .NET CsvHelper读写CSV文件(2)
- 11示例教你用C# .NET CsvHelper读写CSV文件(1)
- C# .NET使用CsvHelper读写CSV文件,快速又易用
- C#创建的CSV文件Excel打开有乱码的原因及解决方法
相关文章
x
- 站长推荐