【问题标题】:Create an Excel file with the Excel interop class from SQL Database使用 SQL 数据库中的 Excel 互操作类创建 Excel 文件
【发布时间】:2018-01-15 10:41:58
【问题描述】:

我想使用 SQL 数据库中的 Excel 互操作类创建一个 Excel 文件。使用 SQL 查询,我之前已将数据集传输到 dataGridview。查询的结果就是数据。但是,我无法将这些数据从 SQL 数据库打印到带有数据集的 Excel 单元格。

private void linkLabel10_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
    using (var fbd = new FolderBrowserDialog())
    {
        DialogResult result = fbd.ShowDialog();

        if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
        {
            string fileTest = fbd.SelectedPath.ToString() + "\\"+ comboBox1.Text.Substring(0, comboBox1.Text.IndexOf("*") - 1) +"-"+ comboBox2.Text.Substring(0, comboBox2.Text.IndexOf("(") - 1) +"-"+ comboBox2.Text.Substring(comboBox2.Text.IndexOf("(") + 1, 10) + ".xlsx";
            MessageBox.Show(fileTest);
            if (File.Exists(fileTest))
            {
                File.Delete(fileTest);
            }

            SqlDataAdapter da = new SqlDataAdapter("select PersonelKodu= ztSinifEgitimiDurum.KisiID, İsim= dbo.cdCurrAcc.FullName, Katılım = CASE WHEN Katilim = 1 THEN 'Katıldı' ELSE 'Katılmadı' END, ztSinifEgitimiDurum.ID FROM dbo.ztSinifEgitimiDurum INNER JOIN dbo.cdCurrAcc ON cdCurrAcc.CurrAccCode = ztSinifEgitimiDurum.KisiID AND cdCurrAcc.CurrAccTypeCode = ztSinifEgitimiDurum.KisiTipiID WHERE AtamaID =" + AtamaIDBul(), baglan);
            DataSet ds = new DataSet();

            Excel.Application Excel;
            Excel.Worksheet excelWorkSheet;
            Excel.Workbook excelWorkBook;

            Excel = new Excel.Application();
            excelWorkBook = Excel.Workbooks.Add();
            excelWorkSheet = (Excel.Worksheet)excelWorkBook.Worksheets.get_Item(1);
            excelWorkSheet.Cells[1, 1] = "some value";
            excelWorkSheet.Name = "Ali";

            foreach (DataTable table in ds.Tables)
                {
                    for (int i = 1; i < table.Columns.Count + 1; i++)
                    {
                        excelWorkSheet.Cells[1, i] = table.Columns[i - 1].ColumnName;
                    MessageBox.Show(table.Columns[i - 1].ColumnName.ToString());
                    }

                    for (int j = 0; j < table.Rows.Count; j++)
                    {
                        for (int k = 0; k < table.Columns.Count; k++)
                        {
                            excelWorkSheet.Cells[j + 2, k + 1] = table.Rows[j].ItemArray[k].ToString();
                        }
                    }
                }

            //                   excelWorkSheet.Cells[1, 1] = "some value";

            excelWorkBook.SaveAs(fileTest);
            excelWorkBook.Close();
            Excel.Quit();

        }
    }
}

【问题讨论】:

  • 有很多关于将数据集转换为 Excel 的示例。为什么要重新发明轮子?
  • 你遇到了什么问题?你调试了吗?调试时数据集是否填充了数据。还是不能保存到目标文件夹?

标签: c# sql-server excel


【解决方案1】:

你忘了填写你的数据集,添加这一行 da.Fill(ds);DataSet ds = new DataSet(); 之后

【讨论】:

    【解决方案2】:

    您可以尝试使用此代码用表格中的值填充工作表:

      ws.Activate();
      foreach (DataTable dt in ds.Tables)
      {
                // Add column headers from the datatable 
                for (int Idx = 0; Idx < dt.Columns.Count; Idx++)
                {
                    ws.Range["A1"].Offset[0, Idx].Value = dt.Columns[Idx].ColumnName;
                }
    
                // add data rows 
                for (int Idx = 0; Idx < dt.Rows.Count; Idx++)
                {  // hey I did not invent this line of code, I found it somewhere on CodeProject. 
                    // It works to add the whole row at once 
                    ws.Range["A2"].Offset[Idx].Resize[1, dt.Columns.Count].Value = dt.Rows[Idx].ItemArray;
                }
      ...
    

    但如果您的数据集中有多个表,您将不得不为各个表添加更多工作表。

    它基于on this article

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-04
      相关资源
      最近更新 更多