虽然我是一个PHPer,但项目有C#的需求,我也只能顶着头皮上了。
不过每一份付出都是收货,通过对C#的了解,更加的加深了我对PHP的熟悉程度,将来会另开一个系列单独讲解两个语言对比的文章。
这篇文章的代码,讲的是在WinForm中,制作一个"选择文件"按钮,可以选取Excel文件,并返回DataTable类型的Excel文件内容。
#region btnClick 点击"选择文件"按钮, 打开选择文件对话框
private void selectFileBtn_Click(object sender, EventArgs e) {
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Filter = "Files|*.xls;*.xlsx"; // 设定打开的文件类型
//openFileDialog.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory; // 打开app对应的路径
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // 打开桌面
// 如果选定了文件
string filePath = "";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
// 取得文件路径及文件名
filePath = openFileDialog.FileName;
dataGridView1.DataSource = null; // 每次打开清空内容
this.excelDataTable = ReadExcelToTable(filePath); // 读出excel并放入datatable
dataGridView1.DataSource = this.excelDataTable; // 测试用, 输出到dataGridView
}
}
#endregion
#region private 根据excle的路径把第一个sheet中的内容放入datatable
/// <summary>
/// 根据excle的路径把第一个sheet中的内容放入datatable
/// </summary>
/// <param name="path">excel文件存放的路径</param>
/// <returns>DataTable</returns>
private static DataTable ReadExcelToTable(string path) {
try {
// 连接字符串(Office 07及以上版本 不能出现多余的空格 而且分号注意)
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';";
using (OleDbConnection conn = new OleDbConnection(connstring))
{
conn.Open();
// 取得所有sheet的名字
DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" });
// 取得第一个sheet的名字
string firstSheetName = sheetsName.Rows[0][2].ToString();
// 查询字符串
string sql = string.Format("SELECT * FROM [{0}]", firstSheetName);
// OleDbDataAdapter是充当 DataSet 和数据源之间的桥梁,用于检索和保存数据
OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring);
// DataSet是不依赖于数据库的独立数据集合
DataSet set = new DataSet();
// 使用 Fill 将数据从数据源加载到 DataSet 中
ada.Fill(set);
return set.Tables[0];
}
} catch (Exception) {
return null;
}
}
#endregion