数据库数据用Excel导出的3种方法

来源:互联网 发布:美国网络直播发展史 编辑:程序博客网 时间:2024/04/30 15:04

将数据库数据用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就可以。