C# DataSet导入导出Execl Step by Step

近日项目需要,所以研究了下Execl的导入导出

该项目因为从一个Execl的数据进行计算产生另一个Execl,所以我并没有使用数据库。 --ps:貌似Execl也是一种数据库啦!囧~

一、从Execl导入DataSet

导入我选择了OLEDB连接方式

第一步 记着引用命名空间

System.Data.OleDb;

 

接下来从Execl 导入到DataSet

 

代码
 try
            {
                
//利用OleDbConnectionStringBuilder对象来构建连接字符串.
                OleDbConnectionStringBuilder connectionStringBuilder = new OleDbConnectionStringBuilder();
                connectionStringBuilder.DataSource 
= @"" + textBox1.Text;
                connectionStringBuilder.Provider 
= "Microsoft.Jet.OLEDB.4.0";
                connectionStringBuilder.Add(
"Extended Properties""Excel 8.0");

                
using (OleDbConnection cn = new OleDbConnection(connectionStringBuilder.ConnectionString))
                {
                    
                    cn.Open();
                    DataTable dt 
= cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); //(1)
                    cn.Close();

                    comboBox1.DataSource 
= dt;//comboBox1显示sheet名的下拉框
                    comboBox1.DisplayMember = "TABLE_NAME";//TABLE_NAME就是sheet名集合列

                    
//下面是导入指定的sheet到DataSet 这本来是另一个方法里的 偷懒一下放一起了
                    ds = new DataSet();
                    OleDbCommand omd 
= new OleDbCommand(string.Format("select * from [{0}]", comboBox1.Text), cn);
                    OleDbDataAdapter oda 
= new OleDbDataAdapter(omd);
                    oda.Fill(ds);
                    dataGridView1.DataSource 
= ds.Tables[0];
                }
            }
            
catch (Exception)
            {
                MessageBox.Show(
"连接Excel发生异常,请检查后台代码!");
            }

 

(1)在项目中为了让用户选择不同的Sheet表,所以就读取Execl中的Sheet名了

 

cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

 

这个方法可以返回Execl的很多信息,当然我只是要读sheet名,所以就只需要"TABLE_NAME"了 。

 

至此 从Execl导入DataSet就结束了。DataSet到数据库···就不用说了吧

二、从DataSet导出到Execl

首先必须安装 Office  - -!

这里我用了Execl.dll的方式导出,不过这种方式用很大的弊端...貌似要根据office版本来确定引用的类...ps:我也不太明白

第一步 引用命名空间

关于这个命名空间晚上的资料多大直接都写的是

using Excel;

 

 其实正确的应该是

 

using Excel = Microsoft.Office.Interop.Excel;//这种引用方式
using System.Reflection; //Missing类命名空间

 

 到命名空间之前请先添加引用,请看图(1)

图(1)

 额,到这个命名空间还真是费事,我当时也找了半天。

接下来就是导出的代码啦~^_^

结合了几个资料做了自己要的效果

代码
  #region   从DataSet到出到Excel

        
/**/
        
///  <summary>   
        
///  执行导出   
        
///  </summary>   
        
///  <param   name="ds">要导出的DataTable </param>   
        
///  <param   name="toFileName">要导出到的execl文件路径+文件名</param>ps:如果是c/s程序,那您直接丢一openFileDialog就方便多了
        
///   <param   name="strExcelFileName">导出到的execl的Sheet名</param>   
        private void doExport(DataTable dt, string toFileName, string strSheetName)
        {


            Excel.Application excel 
= new Excel.Application();  //Execl的操作类
            
//读取保存目标的对象
            Excel.Workbook bookDest = excel.Workbooks._Open(toFileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value
                , Missing.Value, Missing.Value, Missing.Value, Missing.Value
                , Missing.Value, Missing.Value, Missing.Value, Missing.Value);
//打开要导出到的Execl文件的工作薄。--ps:关于Missing类在这里的作用,我也不知道...囧

            Excel.Worksheet sheetDest 
= bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value) as Excel.Worksheet;//给工作薄添加一个Sheet   

            sheetDest.Name 
= strSheetName;//自己定义名字O(∩_∩)O哈哈~

            
int rowIndex = 1;
            
int colIndex = 0;

            excel.Application.Workbooks.Add(
true);//这句不写不知道会不会报错

            
foreach (DataColumn col in dt.Columns)
            {
                colIndex
++;
                sheetDest.Cells[
1, colIndex] = col.ColumnName;//Execl中的第一列,把DataTable的列名先导进去
            }

            
//导入数据行
            foreach (DataRow row in dt.Rows)
            {
                rowIndex
++;
                colIndex 
= 0;
                
foreach (DataColumn col in dt.Columns)
                {
                    colIndex
++;
                    sheetDest.Cells[rowIndex, colIndex] 
= row[col.ColumnName].ToString();
                }
            }

            bookDest.Saved 
= true;

           
            bookDest.Save();
            excel.Quit();
            excel 
= null;

            GC.Collect();
//垃圾回收   
        }
        
#endregion   

 


 

 当然您也可以不用指定导出文件,直接创建新的Execl文件,不过需要修改一下代码。

 

代码
代码
 
#region   从DataSet到出到Excel

        
/**/
        
///  <summary>   
        
///  执行导出   
        
///  </summary>   
        
///  <param   name="ds">要导出的DataTable </param>   
        
///   <param   name="strExcelFileName">导出到的execl的Sheet名</param>   
        private void doExport(DataTable dt, string strSheetName)
        {


            Excel.Application excel 
= new Excel.Application();  //Execl的操作类
            
//读取保存目标的对象
            Excel.Workbook bookDest = (Excel.WorkbookClass)excel.Workbooks.Add(Missing.Value);
            Excel.Worksheet sheetDest 
= bookDest.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value) as Excel.Worksheet;//给工作薄添加一个Sheet   

            sheetDest.Name 
= strSheetName;//自己定义名字O(∩_∩)O哈哈~

            
int rowIndex = 1;
            
int colIndex = 0;

            excel.Application.Workbooks.Add(
true);//这句不写不知道会不会报错

            
foreach (DataColumn col in dt.Columns)
            {
                colIndex
++;
                sheetDest.Cells[
1, colIndex] = col.ColumnName;//Execl中的第一列,把DataTable的列名先导进去
            }

            
//导入数据行
            foreach (DataRow row in dt.Rows)
            {
                rowIndex
++;
                colIndex 
= 0;
                
foreach (DataColumn col in dt.Columns)
                {
                    colIndex
++;
                    sheetDest.Cells[rowIndex, colIndex] 
= row[col.ColumnName].ToString();
                }
            }
            bookDest.Saved 
= true;
            bookDest.SaveCopyAs(
"要保存的文件路径+文件名.xls");//方式一
           
//方式二 bookDest.SaveAs("要保存的文件路径+文件名.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

            excel.Quit();
            excel 
= null;

            GC.Collect();
//垃圾回收   
        }
        
#endregion   

 

 第一写···还忘海涵··参考了很多导入导出的资料 - -b

 

posted @ 2010-01-13 15:51  D`Violet  阅读(2872)  评论(6编辑  收藏  举报