C# DataSet导入导出Execl Step by Step

it2024-12-14  14

近日项目需要,所以研究了下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

 

转载于:https://www.cnblogs.com/dk3214/archive/2010/01/13/1646635.html

相关资源:数据结构—成绩单生成器
最新回复(0)