c#操作excel方式二:采用OleDB操作Excel文件

内容:1.dataset转excel函数代码

          2.excel转dataset函数代码

         3.运用实例:

        3.1写入excel

        3.2读取excel

 

 

 

dataset格式写入excel函数如下:

    public void DSToExcel(string Path, DataSet oldds)
        {
            //先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构
   string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
            //string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
            //string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
            //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。//      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 


            OleDbConnection myConn = new OleDbConnection(strCon);
            string strCom = "select * from [Sheet1$]";
            myConn.Open();
            OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
            System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand);
            //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
            builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)
            builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)
            DataSet newds = new DataSet();
            myCommand.Fill(newds, "Table1");
            for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
            {
                //在这里不能使用ImportRow方法将一行导入到news中,
                //因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
                //在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
                DataRow nrow = newds.Tables["Table1"].NewRow();
                for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
                {
                    nrow[j] = oldds.Tables[0].Rows[i][j];
                    
                }
                newds.Tables["Table1"].Rows.Add(nrow);
            }
            myCommand.Update(newds, "Table1");
            myConn.Close();
        }

读取excel函数如下:

 public DataSet ExcelToDS(string Path)
        {
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            string strExcel = "";
            OleDbDataAdapter myCommand = null;
            DataSet ds = null;
            strExcel = "select * from [sheet1$]";
            myCommand = new OleDbDataAdapter(strExcel, strConn);
            ds = new DataSet();
            myCommand.Fill(ds, "table1");
            return ds;
        }


 


 

运用例子:

添加一个opendiog用于选择要写入的excel

 

引用命名空间:

using System.Data.SqlClient;
using System.Data.OleDb;
using System.IO;

 

定义dataset转excel函数:

      public void DSToExcel(string Path, DataSet oldds)
        {
            //先得到汇总Excel的DataSet 主要目的是获得Excel在DataSet中的结构
   string strCon= "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
            //string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件
            //string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)
            //备注: "HDR=yes;"是说Excel文件的第一行是列名而不是数据,"HDR=No;"正好与前面的相反。//      "IMEX=1 "如果列中的数据类型不一致,使用"IMEX=1"可必免数据类型冲突。 


            OleDbConnection myConn = new OleDbConnection(strCon);
            string strCom = "select * from [Sheet1$]";
            myConn.Open();
            OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, myConn);
            System.Data.OleDb.OleDbCommandBuilder builder = new OleDbCommandBuilder(myCommand);
            //QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。
            builder.QuotePrefix = "[";     //获取insert语句中保留字符(起始位置)
            builder.QuoteSuffix = "]"; //获取insert语句中保留字符(结束位置)
            DataSet newds = new DataSet();
            myCommand.Fill(newds, "Table1");
            for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
            {
                //在这里不能使用ImportRow方法将一行导入到news中,
                //因为ImportRow将保留原来DataRow的所有设置(DataRowState状态不变)。
                //在使用ImportRow后newds内有值,但不能更新到Excel中因为所有导入行的DataRowState!=Added
                DataRow nrow = newds.Tables["Table1"].NewRow();
                for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
                {
                    nrow[j] = oldds.Tables[0].Rows[i][j];
                    
                }
                newds.Tables["Table1"].Rows.Add(nrow);
            }
            myCommand.Update(newds, "Table1");
            myConn.Close();
        } 



 

 

写入按钮代码(从sql数据库中提取一些数据到dataset中,把datatable写入excel中): 

 private void button1_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=Student;User ID=sa;Password=123;");  
       conn.Open(); 
           SqlDataAdapter adapter = new SqlDataAdapter();
           SqlCommand cmdSelect = new SqlCommand("select * from score");  
        cmdSelect.Connection = conn;  
        adapter.SelectCommand = cmdSelect;  
  
 
        DataSet ds = new DataSet();  
        adapter.Fill(ds,"class");

        this.dataGridView1.DataSource = ds;
        this.dataGridView1.DataMember="class";

        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
         

            string path=openFileDialog.FileName;
            DSToExcel(openFileDialog.FileName, ds);
            MessageBox.Show("写入结束");
        }

       

          

        }


 

 可能遇到的问题:

1.不能连接数据库

解决方法:

(1)注意连接语句的版本是否正确

string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";//string strCon = "Provider=Microsoft.Jet.OleDb.4.0;" + "data source=" +Path+ ";Extended Properties='Excel 8.0; HDR=Yes; IMEX=1'"; //此连接只能操作Excel2007之前(.xls)文件

//string strCon = "Provider=Microsoft.Ace.OleDb.12.0;" + "data source=" + Path + ";Extended Properties='Excel 12.0; HDR=No; IMEX=0'"; //此连接可以操作.xls与.xlsx文件 (支持Excel2003 和 Excel2007 的连接字符串)

 

(2)检查路径是否正确

(3)路径时检查文件夹是否有写入权限

 

2.操作必须使用一个可更新的查询

注意连接的参数,这里 我用IMEX=0时才能写入成功

  A: HDR ( HeaDer Row )设置
    若指定值为Yes,代表 Excel 档中的工作表第一行是栏位名称

    若指定值為 No,代表 Excel 档中的工作表第一行就是資料了,沒有栏位名称

    B:IMEX ( IMport EXport mode )设置

     IMEX 有三种模式,各自引起的读写行为也不同,容後再述:
     0 is Export mode
     1 is Import mode
     2 is Linked mode (full update capabilities)
    

      我这里特别要说明的就是 IMEX 参数了,因为不同的模式代表著不同的读写行为:

      当 IMEX=0 时为“汇出模式”,这个模式开启的 Excel 档案只能用来做“写入”用途。

      当 IMEX=1 时为“汇入模式”,这个模式开启的 Excel 档案只能用来做“读取”用途。

      当 IMEX=2 时为“连結模式”,这个模式开启的 Excel 档案可同时支援“读取”与“写入”用途。

 

 

 

3.无法找到列

 

 观察到 我们这里的newds.Tables["Table1"]表是通过 select * from [Sheet1$]产生的,则它的表结构跟excel的表结构一样

 

如果你的dataset有4列,而excel是空表(默认为一列),则会报这个错误

 

所有我们要先打开excel,定好有多少列

 

 

最终结果:

 

好 写入完成 下面是读取

 

定义读取函数:

  public DataSet ExcelToDS(string Path)
        {
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            string strExcel = "";
            OleDbDataAdapter myCommand = null;
            DataSet ds = null;
            strExcel = "select * from [sheet1$]";
            myCommand = new OleDbDataAdapter(strExcel, strConn);
            ds = new DataSet();
            myCommand.Fill(ds, "table1");
            return ds;
        }


读取按钮的代码:

    private void button2_Click(object sender, EventArgs e)
        {
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            DataSet da=ExcelToDS(openFileDialog.FileName);
            this.dataGridView1.DataSource = da;
            this.dataGridView1.DataMember = "table1";
        }

        }


 

 

 

 

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
C是一种非常重要的计算机编程语言。它最初由美国贝尔实验室的Dennis Ritchie在20世纪70年代末和80年代初开发,是一种基于程序和数据结构的高级语言。 C语言的设计目标是提供一种简单高效的编程语言,以便开发底层操作系统和嵌入式系统。相比其他编程语言,C语言的语法相对简单,但功能强大。正因为如此,C成为了许多计算机科学教育中的基础课程。 C语言的特点是它的移植性和高效性。它可以编写与硬件平台无关的程序,因此可以在不同的操作系统和处理器上运行。此外,通过使用低级的内存管理和指针操作,C语言可以实现对计算机资源的精细控制,从而实现高效的程序执行。 C语言提供了丰富的标准库,其中包括各种各样的函数和数据结构,以帮助程序员快速开发各种应用程序。除了标准库外,C语言还支持使用自定义的库,可以根据具体需求进行扩展和重用。 虽然C语言具有许多优势,但也有一些缺点。例如,由于C语言没有内置的面向对象编程特性,因此实现复杂的数据结构和算法可能需要更多的代码和工作。此外,C语言对错误处理的支持相对较弱,需要程序员自行处理异常和错误情况。 总之,C语言是一种功能强大的编程语言,被广泛用于底层系统开发和嵌入式系统。它的简单性和高效性使得它成为学习编程的好选择,并且在许多行业中仍然持续使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小凡vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值