- VS C# WinForm,如果实现对于EXCEL表的操作:
① 从无到有创建EXCEL表
② 如果已经有EXCEL表,根据文件名打开EXCEL
③ 往空白的已经存在的EXCEL表中写入数据
④ 往空白的新建的EXCEL表中写入数据
⑤ 对Open的EXCEL新建工作簿
⑥ 对Open的EXCEL插入列
⑦ 对Open的EXCEL插入行
因为做项目的时候很多软件都需要具备把数据不仅备份到数据库中,也写如EXCEL中,可以随时打开浏览。
我当时为了实现这些操作,第一次是用网上的方法:
string mystring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=”+filepathname +”,User ID=admin;Password=;Extended properties='Excel 8.0;IMEX=1;HDR=NO;'";
OleDbConnection cnnxls = new OleDbConnection(mystring);
cnnxls.Open();
OleDbDataAdapter myDa = new OleDbDataAdapter("Select * from [Sheet1$]", cnnxls);
当时我遇到的问题是cnnxls.Open()报错:遇到外部的表不是预期的表(这个BUG我用了一天,不是EXCEL版本问题,不是差jet引用,不是string字符串里写错了,最后我想调试系统函数Open函数,但是问题还在,我果断放弃该方法)
我就静下来想了一种方法(搞了一天,有多烦躁你懂的),本来随便一个文本文件是很简单的,对不对?一分钟给你,你绝对能打开一个已经存在的.txt文件,那EXCEL跟.txt只是文件类型不同,我为什么不先把数据存在一个东西(DataTable)里,然后最后打开或关闭文件的时候,也用打开.txt的方式,只是把打开类型换成EXCEL,就成功了(遇到一个问题,切忌去找别人的答案,先有一个自己的答案,然后找一定没问题):
- 从无到有创建EXCEL表,如果已经有EXCEL表,根据文件名打开EXCEL
FileStream fs = new FileStream("D://TvMacInfo.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
你可以会困惑怎么没有Open()呢?如果有Open,那么对应Open就会有很多个Exception:异常处理,我是认为处理一个new过程可能出现的异常,然后就可以实现打开或创建一个Excel表,挺好的。
- 实例一个DataTable,然后插入列或行数据:
DataTable dt;
dt = new DataTable();//创建表
dt.Columns.Add("Number",typeof(Int32));
dt.Columns.Add("Time", typeof(DateTime));
dt.Columns.Add("Serials Number of TV", typeof(String));//添加列
dt.Columns.Add("LAN MAC of TV", typeof(String));
dt.Columns.Add("WIFI 2G MAC of TV", typeof(String));
dt.Rows.Add(new object[] { Number,Time, serial, lanmac,wifi2 }); //添加行
只有把DataTable里的写入的列的数据和行的数据写入表视图DataView之后,才能写入打开的文件中
DataView dv = dt.DefaultView; //获取表视图
dv.ToTable(); //转为表
for (int k = 0; k < dt.Columns.Count; k++)
{
// 添加列名称
sb.Append(dt.Columns[k].ColumnName.ToString() + "\t");
}
sb.Append(Environment.NewLine);
// 添加行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow row = dt.Rows[i];
for (int j = 0; j < dt.Columns.Count; j++)
{
// 根据列数追加行数据
sb.Append(row[j].ToString() + "\t");
}
sb.Append(Environment.NewLine);
}
- 往新建或已经存在的EXCEL表中读取数据
string str = null;
string Number = "";
string Time = "";
string serial = "";
string lanmac = "";
string wifi2 = "";
int i = 0;
FileStream fs = new FileStream("D://TvMacInfo.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamReader reader = new StreamReader(fs, System.Text.Encoding.UTF8);
while ((str = reader.ReadLine()) != null)
{
i++;
if (i == 1)
{
continue;
}
else
{
string[] strs = str.Split('\t');
Number = strs[0];
Time = strs[1];
serial = strs[2];
lanmac = strs[3];
wifi2 = strs[4];
}
}
- 往新建或已经存在的EXCEL表中写入数据
DataTable dt;
//添加列
dt.Columns.Add("Number",typeof(Int32));
dt.Columns.Add("Time", typeof(DateTime));
dt.Columns.Add("Serials Number of TV", typeof(String));
dt.Columns.Add("LAN MAC of TV", typeof(String));
dt.Columns.Add("WIFI 2G MAC of TV", typeof(String));
//添加行
dt.Rows.Add(new object[] { Number,Time, serial, lanmac,wifi2 });
dt.Rows.Add(new object[] { Number,Time, serial, lanmac,wifi2 });
DataView dv = dt.DefaultView; //获取表视图
dv.ToTable(); //转为表
StreamWriter sw = new StreamWriter("D://TvMacInfo.xls", false, Encoding.GetEncoding("gb2312"));
StringBuilder sb = new StringBuilder();
for (int k = 0; k < dt.Columns.Count; k++)
{
// 添加列名称
sb.Append(dt.Columns[k].ColumnName.ToString() + "\t");
}
sb.Append(Environment.NewLine);
// 添加行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow row = dt.Rows[i];
for (int j = 0; j < dt.Columns.Count; j++)
{
// 根据列数追加行数据
sb.Append(row[j].ToString() + "\t");
}
sb.Append(Environment.NewLine);
}
sw.Write(sb.ToString());
sw.Flush();
sw.Close();
sw.Dispose();
- 如果你当前的项目里需要处理软件产生的数据写入Excel表中:
//整个操作过程中新建一张DataTable表,把该表的列设置好,因为如果你是把数据往新建的Excel表中写数据,肯定要自己写入列名和行数据;如果你是往一个已经有列名而且已经有数据的Excel表中写入数据,你可以先打开存在的Excel表,把里面的数据读出来存储在DataTable里,这样在你程序中,你就可以通过一张DataTable表对你的所有数据进行任何数据处理操作都可以
DataTable dt;
dt = new DataTable();//创建表
//因为可能是需要新建Excel表,所以自己写入列名
dt.Columns.Add("Number",typeof(Int32));
dt.Columns.Add("Time", typeof(DateTime));
dt.Columns.Add("Serials Number of TV", typeof(String));//添加列
dt.Columns.Add("LAN MAC of TV", typeof(String));
dt.Columns.Add("WIFI 2G MAC of TV", typeof(String));
string str = null;
string Number = "";
string Time = "";
string serial = "";
string lanmac = "";
string wifi2 = "";
int i = 0;
//因为可能存在Excel表了,打开已经存在的Excel表,读取里面的数据
FileStream fs = new FileStream("D://TvMacInfo.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
StreamReader reader = new StreamReader(fs, System.Text.Encoding.UTF8);
while ((str = reader.ReadLine()) != null)
{
i++;
if (i == 1)
{
continue;
}
else
{
string[] strs = str.Split('\t');
Number = strs[0];
Time = strs[1];
serial = strs[2];
lanmac = strs[3];
wifi2 = strs[4];
//把已经存储在Excel里的数据读出写入DataTable中,因为对于数据,多半会有需要排序,刷新,修改等操作,放在DataTable里很好操作
dt.Rows.Add(new object[] { Number,Time, serial, lanmac,wifi2 }); //添加行
}
}
//在你的项目软件里产生数据的时候,把产生的数据(dt.Rows.Count+1).ToString()是序号,DateTime.Now产生该数据的当天日期,uScanCode条形码,sRecieveLanMac本地Mac地址,sRecieveWifi2Mac Wifi的Mac地址)放入DataTable中
dt.Rows.Add(new object[] { (dt.Rows.Count+1).ToString(),DateTime.Now,uScanCode, sRecieveLanMac, sRecieveWifi2Mac }); //添加行
//为了在获得数据,处理数据后,把数据写入Excel表中,需要把DataTable里的数据写入表视图里
DataView dv = dt.DefaultView; //获取表视图
dv.ToTable();
//打开之前创建或存在打开的Excel表
StreamWriter sw = new StreamWriter("D://TvMacInfo.xls", false, Encoding.GetEncoding("gb2312"));
StringBuilder sb = new StringBuilder();
for (int k = 0; k < dt.Columns.Count; k++)
{
// 添加列名称
sb.Append(dt.Columns[k].ColumnName.ToString() + "\t");
}
sb.Append(Environment.NewLine);
// 添加行数据
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow row = dt.Rows[i];
for (int j = 0; j < dt.Columns.Count; j++)
{
// 根据列数追加行数据
sb.Append(row[j].ToString() + "\t");
}
sb.Append(Environment.NewLine);
}
//把所有数据写入Excel表中
sw.Write(sb.ToString());
sw.Flush();
sw.Close();
sw.Dispose();