【问题标题】:How to get data from SQL server to a DataGridView then to Excel如何从 SQL 服务器获取数据到 DataGridView 然后到 Excel
【发布时间】:2016-09-06 18:05:41
【问题描述】:

我有一个从数据库中获取数据然后将其放入网格的函数。我使用以下代码:

ds = new DataSet();
SQL = "SELECT * " +
    "FROM table ";
using (SqlConnection conn = new SqlConnection(Connect))
{
    conn.Open();
    adapter = new SqlDataAdapter(SQL, conn);
    adapter.Fill(ds, "data");
}

dgvInvoiceData.DataSource = ds.Tables[0];

效果很好。有时用户可能希望将网格复制到 Excel。这对于小型结果集来说足够好。一旦它们超过 50 行,它就会迅速接近无法使用。我尝试将范围设置为数组,但每次都失败。

int cols = 0;
int rows;

_Application XL = new Microsoft.Office.Interop.Excel.Application();
_Workbook workbook = XL.Workbooks.Add(Type.Missing);
_Worksheet worksheet = null;
Range xlr;

XL.Visible = false;
worksheet = workbook.ActiveSheet;
worksheet.Name = sheetName;

xlr = worksheet.Range["A0:B02"];
xlr = worksheet.get_Range("A0:" + (char)(64 + cols) + rows.ToString());
xlr = worksheet.get_Range("A0:" + (char)(64 + cols) + rows.ToString(), Type.Missing);
worksheet.get_Range("A0:" + (char)(64 + cols) + rows.ToString(), Type.Missing).Value2 = dt;

有很多尝试尝试获取一个范围,然后为其设置一个数组或类似的东西。

我得到了一些无用的错误

AspireExcel.dll 中出现“System.Runtime.InteropServices.COMException”类型的未处理异常

如果有更好的方法将数据获取到网格中,我可以将数据源直接传递到 Excel 或其他东西,我会很好。

我不知道这是否相关,但查看this 我发现 Excel 变量的定义略有不同。当我尝试它时

using Microsoft.Office.Interop;
using Microsoft.Office.Interop.Excel;

Excel.Application XL = new Excel.Application();

我明白了

找不到类型或命名空间名称“Excel”(您是否缺少 using 指令或程序集引用?) Excel C:\Code\Excel\Excel\Transfer.cs 190 Active

我的参考文献可能有误吗?我有 Microsoft.Office.Core 和 Microsoft.Office.Interop.Excel

【问题讨论】:

  • 看看EPPlus,它是一个非常简单的库,可以在不使用Interop的情况下创建Excel文件

标签: .net excel c#-4.0


【解决方案1】:

有很多方法可以完成您的要求。您似乎对通过互操作库使用 Excel 自动化有些熟悉,因此这里有一种使用它来完成任务的简单方法。

此方法一次从DataTable 写入一行。这不会像将整个表复制到二维数组并将其分配给相同大小的Excel.Range 那样快,但在许多情况下它已经足够快了。它直接使用预定义的 DataRow.ItemArray 作为源分配给Excel.Range。该方法的唯一输入是DataTableExcel.Range,它们在Excel.WorkSheet 中定义了起始单元格地址。

using Excel = Microsoft.Office.Interop.Excel;

private void ExportDT(DataTable dt, Microsoft.Office.Interop.Excel.Range topLeftCell)
{
    Excel.Range exportRange = topLeftCell.Cells.get_Item(1, 1) as Excel.Range;
    exportRange = exportRange.get_Resize(1, dt.Columns.Count);
    // create and export header
    List<string> header = new List<string>();
    foreach (DataColumn c in dt.Columns)
    {
        header.Add(c.ColumnName);
    }
    exportRange.Value2 = header.ToArray();

    //export each row
    foreach (DataRow dr in dt.Rows)
    {
        exportRange = exportRange.get_Offset(1, 0);
        exportRange.Value2 = dr.ItemArray;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2021-11-13
    • 2013-05-07
    • 2012-08-01
    • 2019-12-13
    相关资源
    最近更新 更多