数据库数据用Excel导出的3种方法
将数据库数据用Excel导出主要有3种方法:用Excel.Application接口、用OleDB、用HTML的Tabel标签
方法1——Excel.Application接口:
首先,需要要Excel.dll这个文件,确保自身机器上装有MS Office,在Office安装目录(../Microsoft Office/OFFICE11/,具体目录取决于自己的安装)中找到Excel.exe,然后放在(../Microsoft Visual Studio 8/SDK/v2.0/Bin)目录中,在CMD中输入“CD C:/Program Files/Microsoft Visual Studio 8/SDK/v2.0/Bin(具体目录取决于自己的安装)”,然后输入“TlbImp EXCEL.EXE Excel.dll”。然后在Bin这个文件夹中就能找到Excel.dll这个文件。用到时候在项目中引用就可以。
要使用命名空间
using Excel;
具体代码:
/// <summary> /// 将SQLServer中的数据导出到Excel(使用Excel类,在没装Office时无效) /// </summary> /// <param name="ExelDt">要导出的数据集</param> /// <param name="fileName">输出到的文件目录</param> public static void SQLServerToExcel(DataSet ExelDt, string fileName) { int colIndex = 1, rowIndex = 1; Excel.Application excel; Workbook wBook; Worksheet wSheet; try { excel = new Excel.Application(); wBook = excel.Application.Workbooks.Add(true); wSheet = wBook.Worksheets[1] as Worksheet; //excel.Visible = true; } catch { Win32.MsgBox(0, "您可能没有安装Office,请安装再使用该功能", "", 0); return; } try { foreach (DataColumn col in ExelDt.Tables[0].Columns) { wSheet.Cells[1, colIndex] = col.ColumnName; colIndex++; } foreach (DataRow row in ExelDt.Tables[0].Rows) { rowIndex++; colIndex = 0; foreach (DataColumn col in ExelDt.Tables[0].Columns) { colIndex++; if (colIndex == 1) { wSheet.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString(); } else { wSheet.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString(); } } } //设置禁止弹出保存和覆盖的询问提示框 excel.DisplayAlerts = false; excel.AlertBeforeOverwriting = false; //保存 wSheet.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,Missing.Value, Missing.Value, Missing.Value, Missing.Value); wBook.Save(); } catch (System.Exception) { Win32.MsgBox(0, "输出Excel有错误,请确认没有关闭Excel", "", 0); return; } finally { excel.Quit(); } }
其中要注意的是:
wSheet.SaveAs(fileName, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value,Missing.Value, Missing.Value, Missing.Value, Missing.Value);
wBook.Save();
这样就不会在保存的时候还会弹出保存对话框。
还要记得关闭Excel,不然就一直占有着
finally { excel.Quit(); }
方法2——用OleDB:
个人觉得用OleDB最好,因为不需要安装Office也可以导出Excel,而且速度也比较快。
具体代码:
/// <summary> /// 将SQLServer中的数据导出到Excel(使用OleDB) /// </summary> /// <param name="ExelDt">要导出的数据集</param> /// <param name="filePath">输出到的文件目录</param> /// <returns>信息</returns> public static string SQLServerToExcel(System.Data.DataTable ExelDt, string filePath) { if (ExelDt == null) { return "数据不能为空"; } //数据集的行总数、列总数 int rows = ExelDt.Rows.Count; int cols = ExelDt.Columns.Count; if (rows == 0) { return "没有数据"; } StringBuilder sb = new StringBuilder(); string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filePath + ";Extended Properties=Excel 8.0"; OleDbCommand cmd = new OleDbCommand(); OleDbConnection myConn = new OleDbConnection(strCon); try { //创建文件 myConn.Open(); //创建表 cmd.Connection = myConn; sb.Append("create table "); sb.Append(ExelDt.TableName + "("); for (int i = 0; i < cols; i++) { if (i < cols - 1) { sb.Append(string.Format("{0} varchar,", ExelDt.Columns[i].ColumnName)); } else { sb.Append(string.Format("{0} varchar)", ExelDt.Columns[i].ColumnName)); } } cmd.CommandText = sb.ToString(); cmd.ExecuteNonQuery(); } catch (Exception ex) { return "建立Exel文件失败:" + ex.ToString(); } //--------------------------------------------------------------------------------- //插入数据 sb.Remove(0, sb.Length); sb.Append("INSERT INTO "); sb.Append(ExelDt.TableName + " ( "); for (int i = 0; i < cols; i++) { if (i < cols - 1) sb.Append(ExelDt.Columns[i].ColumnName + ","); else sb.Append(ExelDt.Columns[i].ColumnName + ") values ("); } for (int i = 0; i < cols; i++) { if (i < cols - 1) sb.Append("@" + ExelDt.Columns[i].ColumnName + ","); else sb.Append("@" + ExelDt.Columns[i].ColumnName + ")"); } cmd.CommandText = sb.ToString(); OleDbParameterCollection param = cmd.Parameters; for (int i = 0; i < cols; i++) { param.Add(new OleDbParameter("@" + ExelDt.Columns[i].ColumnName, OleDbType.VarChar)); } //遍历DataTable将数据插入新建的Excel文件中 foreach (DataRow row in ExelDt.Rows) { for (int i = 0; i < param.Count; i++) { param[i].Value = row[i]; } cmd.ExecuteNonQuery(); } cmd.Connection.Close(); return "数据已成功导入Excel"; }
其中注意:
string strCon = " Provider = Microsoft.Jet.OLEDB.4.0 ; Data Source = " + filePath + ";Extended Properties=Excel 8.0";
其中“Excel 8.0”是表示使用MS Office 2003,其他版本的没有用过,不确定是否只需修改版本号就可以。
方法3——用HTML的Tabel标签:
这个具体我没试过实现,这里给个思路,将要导出的数据用<tabel>、<tr>、<td>这几个标签输出成HTML文件,然后把扩展名改为.xls就可以。