分享

利用OleDb方式对DataSet 和 Excel 数据快速导入导出

 gdtoby 2011-09-04

利用OleDb方式对DataSet 和 Excel 数据快速导入导出

一:DataSet 导入到Excel

 

       /// <summary>
        
/// 导出数据到Excel
        
/// </summary>
        
/// <param name="Path">需要导入的Excel地址</param>
        
/// <param name="oldds">需要导入的数据</param>
        
/// <param name="TableName">表名</param>
        public static void DSToExcel2003(string Path, DataSet oldds, string TableName)
        {
            
//Excel2003的连接字符串
            string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source =" + Path + ";Extended Properties=Excel 8.0";
            
//执行导入
            ExcuteSQL(oldds, TableName, strCon);


        }

        
/// <summary>
        
/// 导出数据到Excel
        
/// </summary>
        
/// <param name="Path">需要导入的Excel地址</param>
        
/// <param name="oldds">需要导入的数据</param>
        
/// <param name="TableName">表名</param>
        public static void DSToExcel2007(string Path, DataSet oldds, string TableName)
        {
            
//Excel2007的连接字符串  
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
            
//执行导入
            ExcuteSQL(oldds, TableName, strConn);


        }
        
/// <summary>
        
/// 执行
        
/// </summary>
        
/// <param name="oldds">需要导入的数据</param>
        
/// <param name="TableName">表名</param>
        
/// <param name="strCon">连接字符串</param>
        private static void ExcuteSQL(DataSet oldds, string TableName, string strCon)
        {
            
//连接
            OleDbConnection myConn = new OleDbConnection(strCon);

            
string strCom = "select * from [" + TableName + "$]";

            
try
            {
                myConn.Open();
                OleDbDataAdapter myCommand 
= new OleDbDataAdapter(strCom, myConn);

                System.Data.OleDb.OleDbCommandBuilder builder 
= new OleDbCommandBuilder(myCommand);

                
//QuotePrefix和QuoteSuffix主要是对builder生成InsertComment命令时使用。   
                
//获取insert语句中保留字符(起始位置)  
                builder.QuotePrefix = "[";
                
                
//获取insert语句中保留字符(结束位置)   
                builder.QuoteSuffix = "]";
                
                DataSet newds 
= new DataSet();
                
//获得表结构
                DataTable ndt = oldds.Tables[0].Clone();
                
//清空数据
                
//ndt.Rows.Clear();

                ndt.TableName 
= TableName;
                newds.Tables.Add(ndt);

                
//myCommand.Fill(newds, TableName);

                
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[0].NewRow();
                    
for (int j = 0; j < oldds.Tables[0].Columns.Count; j++)
                    {
                        nrow[j] 
= oldds.Tables[0].Rows[i][j];
                    }
                    newds.Tables[
0].Rows.Add(nrow);
                }
                
//插入数据
                myCommand.Update(newds, TableName);
            }
            
finally
            {
                myConn.Close();
            }
        }

 

 


 

使用实例

 

        /// <summary>
        
/// 导出数据
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btnExport_Click(object sender, EventArgs e)
        {

            
//string connString = "server=localhost;uid=sa;pwd=123456;database=MYDB";
            string excelModlePath = @"G:\Study\ExcelOper\Model\学籍表.xls";

            
//文件保存对话框
            System.Windows.Forms.SaveFileDialog fd = new SaveFileDialog();

            fd.DefaultExt 
= ".xls";
   

            
//string savefilepath = @"G:\Study\ExcelOper\SaveFolder\study.xls";

            
if (fd.ShowDialog() == DialogResult.OK)
            {
                
using (ExcelHelper excel = new ExcelHelper())
                {
                    excel.Open(excelModlePath);
                    
//保存数据到用户指定的文件夹
                    excel.SaveFile(fd.FileName);
                }

                
string connString = "server=localhost;uid=sa;pwd=123456;database=MYDB";


                DataSet ds 
= SqlHelper.ExecuteDataSet(connString, CommandType.Text, "select * from study");

                ds.Tables[
0].TableName = "study";

                ExcelHelper.DSToExcel2003(fd.FileName, ds, 
"study");
            }
        }

 

二 Excel导出到DataSet

 

       /// <summary>
        
/// 查询Excle2007的数据
        
/// </summary>
        
/// <param name="Path"></param>
        
/// <returns></returns>
        public static DataSet Excel2007ToDS(string Path, string SheetName)
        {
            
//Excel2007链接字符串
            string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + Path + ";" + "Extended Properties=\"Excel 12.0 Xml;HDR=YES;\"";
            
return ExcuteQuery(strConn, SheetName);
        }

        
/// <summary>
        
/// 查询Excle2003的数据
        
/// </summary>
        
/// <param name="Path"></param>
        
/// <returns></returns>
        public static DataSet Excel2003ToDS(string Path, string SheetName)
        {
            
//Excel2003链接字符串
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Path + ";" + "Extended Properties=Excel 8.0;";

            
return ExcuteQuery(strConn, SheetName);
        }

        
/// <summary>
        
/// 执行查询
        
/// </summary>
        
/// <param name="strConn"></param>
        
/// <returns></returns>
        private static DataSet ExcuteQuery(string strConn, string SheetName)
        {
            
//默认sheet名
            if (string.IsNullOrEmpty(SheetName))
            {
                SheetName 
= "Sheet1";
            }

            
//链接
            OleDbConnection conn = new OleDbConnection(strConn);
            DataSet ds 
= null;
            
try
            {
                conn.Open();
                
string strExcel = "";
                OleDbDataAdapter myCommand 
= null;
                
                strExcel 
= "select * from [" + SheetName + "$]";
                myCommand 
= new OleDbDataAdapter(strExcel, strConn);
                ds 
= new DataSet();
                
//查询数据
                myCommand.Fill(ds, SheetName);
            }
            
finally
            {
                conn.Close();
            }
            
//

            
return ds;
        }

 

使用实例

        private void btnImport_Click(object sender, EventArgs e)
        {
            
//openFileDialog1.ShowDialog();

            
//if (openFileDialog1.RestoreDirectory)
            
//{

            
//}


            
string connString = "server=localhost;uid=sa;pwd=123456;database=MYDB";
            System.Windows.Forms.OpenFileDialog fd 
= new OpenFileDialog();
            
if (fd.ShowDialog() == DialogResult.OK)
            {
                TransferData(fd.FileName, 
"study", connString);

                DataSet ds 
= SqlHelper.ExecuteDataSet(connString, CommandType.Text, "select * from study");

                dataGridView1.DataSource 
= ds.Tables[0];
            }

        }

 

 注意事项:

       一:DataSet导入到Excel时 导入的Excel的文件的Sheet名要和要导入的DataTable名一致,

Sheet的数据列名也要和DataTable列名一致放在Sheet的第一排

如下图:

二:Excel导出数据到DataSet的SheetName 需要和实际的Sheet名一致

 

总结:和直接使用office内核访问Excel数据的方式相比相信这种方式的读写速度上会占有很大优势

并且不用担心非托管资源的释放

幽夜底衣角,那一片清风。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多