【问题标题】:Save data from datagridview to excel file将数据从datagridview保存到excel文件
【发布时间】:2021-09-22 10:31:07
【问题描述】:

我已经创建了将数据从 datagridview 保存到 excel 文件的函数。

保存功能:

 try
        {
            Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
            Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
            app.Visible = true;
            worksheet = workbook.Sheets["Sheet1"];
            worksheet = workbook.ActiveSheet;
            worksheet.Name = "Records";

            try
            {
                for (int i = 0; i < dataGridView2.Columns.Count; i++)
                {
                    worksheet.Cells[1, i + 1] = dataGridView2.Columns[i].HeaderText;
                }
                for (int i = 0; i < dataGridView2.Rows.Count; i++)
                {
                    for (int j = 0; j < dataGridView2.Columns.Count; j++)
                    {
                        if (dataGridView2.Rows[i].Cells[j].Value != null)
                        {
                            worksheet.Cells[i + 2, j + 1] = dataGridView2.Rows[i].Cells[j].Value.ToString();
                        }
                        else
                        {
                            worksheet.Cells[i + 2, j + 1] = "";
                        }
                    }
                }

                //Getting the location and file name of the excel to save from user. 
                SaveFileDialog saveDialog = new SaveFileDialog();
                saveDialog.Filter = "Excel files (*.xlsx)|*.xlsx|All files (*.*)|*.*";
                saveDialog.FilterIndex = 2;

                if (saveDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    workbook.SaveAs(saveDialog.FileName);
                    MessageBox.Show("Export Successful", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

            finally
            {
                app.Quit();
                workbook = null;
                worksheet = null;
            }
        }
        catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }

它在我的电脑上运行良好,版本:

我尝试在安装的第二台计算机上运行它:

我需要更改哪些代码才能同时使用这两个版本? 我正在寻找可以执行相同但适用于每个办公室安装的示例。 顺便说一句,当我尝试在第二台计算机上运行时出现此错误:

【问题讨论】:

    标签: c# .net excel datagridview export-to-excel


    【解决方案1】:

    这并不是您的代码抛出该错误的直接答案。但作为一种对我有用的替代方法,是否值得尝试?我使用了 Nuget 的“ClosedXML”包...可能还有其他选项,例如“yob 的回复”,我相信它们也可以正常工作。

    using ClosedXML.Excel;
    

    然后保存数据:

            SaveFileDialog saveFile1 = new SaveFileDialog();
            saveFile1.Filter = "Excel file|*.xlsx";
            saveFile1.Title = "save results as Excel spreadsheet";
            saveFile1.FileName = title + " -" + DateTime.Now.ToString("yyyyMMdd") + ".xlsx";
            if (saveFile1.ShowDialog() == DialogResult.OK)
            {
                var wb = new XLWorkbook();
                var ws = wb.Worksheets.Add(data, title);
                wb.SaveAs(saveFile1.FileName);
            }
    

    'data' 是一个数据表,因此您需要先将 datagridview 转换为数据表。正如我所说,这不是对您现有代码的答案,而是对我有用的可能替代方案:) 祝你好运。

    【讨论】:

    • 是的,它工作得很好,但现在我怎样才能从文件中再次将它加载到 datagridview 中?
    • 阅读aspsnippets.com/Articles/…。那里有一个使用 ClosedXML 从 excel 文件加载回程序的示例
    【解决方案2】:

    如果你不是一定要使用 MS Office 组件,那么我建议你改用 EPPlus 库。

    string saveasFileName = .....
    
    using (var package = new ExcelPackage())
    {
        using (var worksheet = package.Workbook.Worksheets.Add("Records"))
        {
            worksheet.Cells[1, 1].Value = "Records from dataGridView2:";
            worksheet.Cells[1, 1].Style.Font.Bold = true;
            //  column headers
            for (int i = 0; i < dataGridView2.Columns.Count; i++)
            {
                worksheet.Cells[2, i + 1].Value = dataGridView2.Columns[i].HeaderText;
            }
            // actual data
            for (int i = 0; i < dataGridView2.Rows.Count; i++)
            {
                for (int j = 0; j < dataGridView2.Columns.Count; j++)
                {
                    //  ... populate worksheet ...
                    worksheet.Cells[i + 3, j + 1].Value = dataGridView2.Rows[i].Cells[j].Value?.ToString()??"";
                }
            }
            // save
            package.SaveAs(saveasFileName);
        }
    }
    

    我在https://github.com/siccolo/EppPlus_CreateExcel/blob/master/Excel.cs有一个例子

    @Adamszsz - 如果你需要打开一个excel文件并加载到gridview,那么你可以使用oledb连接,例如: - 打开excel文件.xls

    ...
    var excelconnection = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + filePath + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\"";
    var table = "[Sheet1$]"
    //  using System.Data.OleDb
    var excel = new OleDbDataAdapter("SELECT * FROM " + table, excelconnection);
    var exceldata = new DataTable();
    excel.Fill(exceldata);
    ...
    

    而对于 excel 文件 .xlsx 使用 Net.SourceForge.Koogra.Excel2007。

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多