今日的记录如标题所示,废话不多说,我们直接讲解步骤。
首先,我们在新建的C#winform程序页面中的窗体form1中先加入一个按钮button1,将其text属性设置为“insert”;然后再加入一个文本框textBox1以及一个数据表格控件DataGridView1。
需要的引用如下:
using System;
using System.Data;
using System.Windows.Forms;
using System.IO;
using System.Data.OleDb;
using System.Web.Script.Serialization;
要注意的是,在使用如下引用时
using System.Web.Script.Serialization;
要在System.Web.Extensions的引用条件下才行,具体方法如下:
1、右键“引用”–>>> 添加引用–>>> .NET->>> 选择System.Web.Extensions
2、 using System.Web.Script.Serialization
接下来是代码:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
**String[] aa =new String[2048];**
private void button1_Click(object sender, EventArgs e)
{
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel文件|*.xlsx|所有文件|*.*";
ofd.Title = "打开文件夹";
string b="";
ofd.InitialDirectory = "e:\\";
ofd.FilterIndex = 1;
if (ofd.ShowDialog() == DialogResult.OK) //如果点击的是打开文件
{
b = ofd.FileName;
}
string tablename = gete(b);
string TSql = "SELECT*FROM[" + tablename + "]";
DataTable table = etds(b,TSql).Tables[0];
dataGridView1.DataSource = table; //将DataSet类对象table中存储的excel中的值放入
**for (int i = 0;i < 2048;i++)
{
aa[i] = table.Rows[i]["WaveLength"].ToString();
}**
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
首先,我们来看以下代码
OpenFileDialog ofd = new OpenFileDialog();
ofd.Filter = "Excel文件|*.xlsx|所有文件|*.*";
ofd.Title = "打开文件夹";
string b="";
ofd.InitialDirectory = "e:\\";
ofd.FilterIndex = 1;
文件对话框(FileDialog)主要包括文件浏览对话框,以及用于查找、打开、保存文件的功能,OpenFileDialog即为文件的读入操作类。
Filter的意思即是设置读入文件的类型,其规则为“文件名|*.后缀”;Title即为弹出的窗体中的按键的text属性值;InitialDirectory即为设置所选文件的限定范围,FilterIndex即为导入文件的数量。
if (ofd.ShowDialog() == DialogResult.OK) //如果点击的是打开文件
{
b = ofd.FileName;
}
string tablename = gete(b);
string TSql = "SELECT*FROM[" + tablename + "]";
DataTable table = etds(b,TSql).Tables[0];
dataGridView1.DataSource = table; //将DataSet类对象table中存储的excel中的值放入dataGridView1中
以上代码难点已经标出,具体函数后面会说明,这里就不细说了。注意TSql的创建是为了函数public static DataSet etds(string,string);
的调用。
接下来是两个自己创建的函数的讲解
public static string gete(string path)
{
string tablename = null;
if (File.Exists(path))
{
using (OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
+ path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"))
{
conn.Open();
tablename = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0][2].ToString().Trim();
}
}
return tablename;
}
首先是函数public static string gete(string );
这个函数的作用是将需要导入的excel文件的具体名称提取出来。
对于不同的.net数据提供者,ADO.NET采用不同的Connection对象连接数据库。OleDbConneetion连接支持OLE DB的数据库,如Access、excel等。关于"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'"
的代码在上一篇博客中我说的足够清楚,就不再进行强调了
```csharp
conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null).Rows[0][2].ToString().Trim();
这行代码的作用就是将OleDbConneetion连接的excel文件中数据导入DataSet中
接下来是另一个函数public static DataSet etds(string ,string)
public static DataSet etds(string filename,string tsql)
{
DataSet ds;
string strcon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
+ filename + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'";
OleDbConnection myConn = new OleDbConnection(strcon);//带参数的构造方法,传递string类的对象作为参数
string strcom = tsql;
myConn.Open();//打开数据库链接
OleDbDataAdapter mycommand = new OleDbDataAdapter(strcom, myConn);//带参数的构造方法,strcom参数是指定对数据表执行的SQL语句,myConn是数据库的连接对象
ds = new DataSet();
mycommand.Fill(ds); //使用OleDbDataAdapter对象mycommand将查询结果填充到DataTable对象ds中
myConn.Close();
return ds;
}
这个函数内重要的语句功能都已经进行了标注,再要注意的一点就是若使用OleDbConnection.Open();
打开数据库链接,在代码运行结束后就一定要加一个OleDbConnection.Close();
最后是将DataTable中数据导入String[]。首先是建立一个足够大的String数组aa,长度取决于每个人的需要,这里我的数据铁定为2048个,所以我的String数组的长度为2048。
String[] aa =new String[2048];
接着是将数据从之前的DataTable中导入String[]的代码。
for (int i = 0;i < 2048;i++)
{
aa[i] = table.Rows[i]["WaveLength"].ToString();
}
for循环相信没什么人是不知道的,就不多讲了,不懂的可以上网查,重要的是代码aa[i] = table.Rows[i]["WaveLength"].ToString();
,这段代码的意思是将名为table的DataTable类数据中的名为“WaveLength”的那一列的第i个数据提取了出来。
这里要注意的是,一般excel的第一行的命名就会默认为列的名字。举个例子,你导入的excel数据表的第一列有“姓名”、“学号”、“成绩”三个量,那么系统在使用这些代码将数据导入进DataTable中后,就会默认这三列的名字为“姓名”、“学号”、“成绩”,假如在“姓名”栏目的第3行为“小明”,那么如果有如下代码
string bb=table.Rows[3]["姓名"].ToString();//DataTable的名字是table
那么此时string类数据bb中就会写入“小明”这个字符串。
那么再来看回这个代码,就能明白它是利用for循环将名为“WaveLength”的列中的1-2048个数据分别写入了String[]类的数据aa[0]~aa[2047]中去了。