午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

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

 羊玉wngbx 2019-02-06

內(nèi)容:1.dataset轉(zhuǎn)excel函數(shù)代碼

          2.excel轉(zhuǎn)dataset函數(shù)代碼

         3.運用實例:

        3.1寫入excel

        3.2讀取excel

 

 

 

dataset格式寫入excel函數(shù)如下:

    public void DSToExcel(string Path, DataSet oldds)
        {
            //先得到匯總Excel的DataSet 主要目的是獲得Excel在DataSet中的結(jié)構(gòu)
   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文件的第一行是列名而不是數(shù)據(jù),"HDR=No;"正好與前面的相反。//      "IMEX=1 "如果列中的數(shù)據(jù)類型不一致,使用"IMEX=1"可必免數(shù)據(jù)類型沖突。 


            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語句中保留字符(結(jié)束位置)
            DataSet newds = new DataSet();
            myCommand.Fill(newds, "Table1");
            for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
            {
                //在這里不能使用ImportRow方法將一行導(dǎo)入到news中,
                //因為ImportRow將保留原來DataRow的所有設(shè)置(DataRowState狀態(tài)不變)。
                //在使用ImportRow后newds內(nèi)有值,但不能更新到Excel中因為所有導(dǎo)入行的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函數(shù)如下:

 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轉(zhuǎn)excel函數(shù):

      public void DSToExcel(string Path, DataSet oldds)
        {
            //先得到匯總Excel的DataSet 主要目的是獲得Excel在DataSet中的結(jié)構(gòu)
   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文件的第一行是列名而不是數(shù)據(jù),"HDR=No;"正好與前面的相反。//      "IMEX=1 "如果列中的數(shù)據(jù)類型不一致,使用"IMEX=1"可必免數(shù)據(jù)類型沖突。 


            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語句中保留字符(結(jié)束位置)
            DataSet newds = new DataSet();
            myCommand.Fill(newds, "Table1");
            for (int i = 0; i < oldds.Tables[0].Rows.Count; i++)
            {
                //在這里不能使用ImportRow方法將一行導(dǎo)入到news中,
                //因為ImportRow將保留原來DataRow的所有設(shè)置(DataRowState狀態(tài)不變)。
                //在使用ImportRow后newds內(nèi)有值,但不能更新到Excel中因為所有導(dǎo)入行的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數(shù)據(jù)庫中提取一些數(shù)據(jù)到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("寫入結(jié)束");
        }

       

          

        }


 

 可能遇到的問題:

1.不能連接數(shù)據(jù)庫

解決方法:

(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)路徑時檢查文件夾是否有寫入權(quán)限

 

2.操作必須使用一個可更新的查詢

注意連接的參數(shù),這里 我用IMEX=0時才能寫入成功

  A: HDR ( HeaDer Row )設(shè)置
    若指定值為Yes,代表 Excel 檔中的工作表第一行是欄位名稱

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

    B:IMEX ( IMport EXport mode )設(shè)置

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

      我這里特別要說明的就是 IMEX 參數(shù)了,因為不同的模式代表著不同的讀寫行為:

      當(dāng) IMEX=0 時為“匯出模式”,這個模式開啟的 Excel 檔案只能用來做“寫入”用途。

      當(dāng) IMEX=1 時為“匯入模式”,這個模式開啟的 Excel 檔案只能用來做“讀取”用途。

      當(dāng) IMEX=2 時為“連結(jié)模式”,這個模式開啟的 Excel 檔案可同時支援“讀取”與“寫入”用途。

 

 

 

3.無法找到列

 

 觀察到 我們這里的newds.Tables["Table1"]表是通過 select * from [Sheet1$]產(chǎn)生的,則它的表結(jié)構(gòu)跟excel的表結(jié)構(gòu)一樣

 

如果你的dataset有4列,而excel是空表(默認(rèn)為一列),則會報這個錯誤

 

所有我們要先打開excel,定好有多少列

 

 

最終結(jié)果:

 

好 寫入完成 下面是讀取

 

定義讀取函數(shù):

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

        }


 

 

 

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多