首页 > 编程语言 >c#操作excel方式二:采用OleDB操作Excel文件

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

时间:2023-08-08 22:39:02浏览次数:33  
标签:OleDB c# IMEX Excel DataSet Path new string


内容: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;
        }

 

 

运用例子:

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

添加一个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.操作必须使用一个可更新的查询

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

注意连接的参数,这里 我用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.无法找到列

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

 

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


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


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

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

 

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

 

最终结果:

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

 

好 写入完成 下面是读取

 

定义读取函数:

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";
        }

        }

 

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

 

 

 

标签:OleDB,c#,IMEX,Excel,DataSet,Path,new,string
From: https://blog.51cto.com/u_16218512/7013057

相关文章

  • c#生成随机数
    允许有重复:首先初始化一个随机数发生器,可以使用两种方式:第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:Randomro=newRandom();第二种方法可以指定一个int型参数作为随机种子:intiSeed=10;Randomro=newRandom(10);longtick=D......
  • TC脚本开发-窗口句柄的捕捉方法总结
    标题获得方法:整型窗口句柄窗口句柄=窗口.找到窗口("脚本编写算法.txt-记事本“)如果(窗口句柄==0)辅助.消息框("没有找到窗口")红色字体为窗口标题,必须输入准确的标题,不支持模糊捕捉。要找到准确的标题可以用AB抓抓捕捉.AB抓抓使用方法:先点击下图的鼠标窗口句柄。 然后点......
  • 使用ICTCLAS分词器 Java版
      ICTCLAS分词器 汉语词法分析系统ICTCLAS(InstituteofComputingTechnology,ChineseLexicalAnalysisSystem),主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。 词是最小的能够独立活动的有意义的语言成分,但汉语是以字为基本的书写单位,词语之间......
  • c#调用百度地图web服务api-----该方法可用在js跨域请求上
    百度地图Web服务API为开发者提供http接口,即开发者通过http形式发起检索请求,获取返回json或xml格式的检索数据。用户可以基于此开发JavaScript、C#、C++、Java等语言的地图应用。api官网说明链接:http://developer.baidu.com/map/webservice.htm可用接口列举:获取相关地址提示place......
  • soso地图api接口地理解析geocoder检索示例----并在信息框显示经纬度
    api官网:http://api.map.soso.com/doc_v2/example.html?sample-geocoding-simple#8map示例代码如下(保存为html打开可见效果):<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>......
  • c#怎么样让double或者float保留2位小数
      我们都知道float的位数比较多但是转成Tostring显示时还是会截断并且四舍五入。如果我们要进行精密的计算时比如计算0.9999999如果被截断了结果就会变成1。这与我们的预期结果不相符。那么我们怎么才能随心所欲的设置小数位数。可以参考下面的例子。我们以设置小数位......
  • perl通过unixODBC连接SQLServer
    本文讲述三个内容:一:说明二:环境配置三:操作脚本内容一:说明MS从来没有提供过SQLServerforLinux,所以大家也不要去尝试在Linux系统安装SQLServer,但是可以通过ODBC连接Windows系统的SQLServer数据库;WindowsServer2003用户注意:在WindowsServer2003系统上安装的SQLServer是不......
  • perl基本语言语法(与java,c#不同的地方积累)
    连接字符串 perl用.  “hello”+"hello" 可用x号 "hello"*3 “hellohellohello”java,c#用+"hello"+"hello"运算符perl等待输入:$line=<STDIN>;或者$line=<>;未定义的字符值undef--不会报错当作数字使用时为0当作字符串使用时为空判断是否为空用defined()数组......
  • 遇到的问题------------时间格式转化时java.text.ParseException: Unparseable date:
    -时间格式转化时java.text.ParseException:Unparseabledate:""异常把String time=2013-09-22用 privatefinalstaticSimpleDateFormatsimpleDateFormat=newSimpleDateFormat("yyyy-MM-ddhh:mm:ss");simpleDateFormat.parse(time.trim()));转化时报错java.text.......
  • JSP----jQuery插件ContextMenu生成右键菜单
    讲述三个内容:一:简介二:使用示例三:在jsp中动态生成的代码记录一:简介ContextMenu 译自:http://www.trendskitchens.co.nz/jquery/contextmenu/ ContextMenu是一个轻量级jQuery插件,用于选择性地用自己创建的菜单代替浏览器的默认右键菜单。 特点 1.可以在一个页面中使用多个右......