VS C# WinForm对于EXCEL表的操作

来源:互联网 发布:杜兰特2016西决数据 编辑:程序博客网 时间:2024/06/07 17:37
  1. 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,就成功了(遇到一个问题,切忌去找别人的答案,先有一个自己的答案,然后找一定没问题):

  1. 从无到有创建EXCEL表,如果已经有EXCEL表,根据文件名打开EXCEL
FileStream fs = new FileStream("D://TvMacInfo.xls", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);你可以会困惑怎么没有Open()呢?如果有Open,那么对应Open就会有很多个Exception:异常处理,我是认为处理一个new过程可能出现的异常,然后就可以实现打开或创建一个Excel表,挺好的。
  1. 实例一个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);} 
  1. 往新建或已经存在的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];      }}
  1. 往新建或已经存在的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();  
  1. 如果你当前的项目里需要处理软件产生的数据写入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();  
原创粉丝点击