近日项目需要,所以研究了下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
相关资源:数据结构—成绩单生成器