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