导出到Excel保持文件打开,而不导出第一个数据网格

时间:2014-02-17 09:31:47

标签: c# excel datagridview

我正在尝试将2个datagridviews导出到excel,但它缺少两组数据网格视图的最后一行数据,我检查了代码,我无法看到我做错了什么?它还在导出然后锁定文件而不是正常退出时创建临时文件,只有重启才允许您删除文件?任何帮助将是伟大的代码如下。例如,如果我保存为test.xlsx,我会得到2个文件〜$ test.xlsx和test.xlsx,两个文件都被锁定。

  private void exprtbtn_Click(object sender, EventArgs e)
    {

        Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
        try
        {

            // creating new Excelsheet in workbook
            Microsoft.Office.Interop.Excel._Worksheet worksheet1 = null;
            Microsoft.Office.Interop.Excel._Worksheet worksheet2 = null;

            // get the reference of first sheet. By default its name is Sheet1.
            // store its reference to worksheet
            worksheet1 = workbook.Sheets["Sheet1"];
            worksheet1 = workbook.ActiveSheet;

            // changing the name of active sheet
            worksheet1.Name = "Switch Totals";


            // storing header part in Excel
            for (int i = 1; i < switchtotalgrd.Columns.Count + 1; i++)
            {
                worksheet1.Cells[1, i] = switchtotalgrd.Columns[i - 1].HeaderText;
            }

            // storing Each row and column value to excel sheet
            for (int i = 0; i < switchtotalgrd.Rows.Count - 1; i++)
            {
                for (int j = 0; j < switchtotalgrd.Columns.Count; j++)
                {
                    worksheet1.Cells[i + 2, j + 1] = switchtotalgrd.Rows[i].Cells[j].Value.ToString();
                }
            }
            // Adding second worksheet
            int count = workbook.Worksheets.Count;
            Excel.Worksheet addedSheet = workbook.Worksheets.Add(Type.Missing,
            workbook.Worksheets[count], Type.Missing, Type.Missing);


            // get the reference of first sheet. By default its name is Sheet1.
            // store its reference to worksheet
            worksheet2 = workbook.Sheets["Sheet2"];
            worksheet2 = workbook.ActiveSheet;

            // changing the name of active sheet
            worksheet2.Name = "Itemised Extn";


            // storing header part in Excel
            for (int i = 1; i < fullresult.Columns.Count + 1; i++)
            {
                worksheet2.Cells[1, i] = fullresult.Columns[i - 1].HeaderText;
            }

            // storing Each row and column value to excel sheet

            for (int i = 0; i < fullresult.Rows.Count - 1; i++)
            {
                for (int j = 0; j < fullresult.Columns.Count; j++)
                {
                    if (fullresult.Rows[i].Cells[j].Value == null)
                    {
                        fullresult.Rows[i].Cells[j].Value = "NA";
                    }
                    worksheet2.Cells[i + 2, j + 1] = fullresult.Rows[i].Cells[j].Value.ToString();
                }
            }

            // save the application
            string fileName = String.Empty;
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "Excel files |*.xls|All files (*.*)|*.*";
            saveFileDialog1.FilterIndex = 2;
            saveFileDialog1.RestoreDirectory = true;

            if (saveFileDialog1.ShowDialog() == DialogResult.OK)
            {
                fileName = saveFileDialog1.FileName;
                workbook.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            }
            else
                return;
        }
            //Catch all errors.
        catch (System.Exception)
        { 
        }
        finally
        {
            workbook = null;
            app = null;
        }
    }

1 个答案:

答案 0 :(得分:0)

您可能想要再次仔细检查外部for循环,例如for (int i = 0; i < fullresult.Rows.Count - 1; i++),或许不应该使用少于或等于?

由于您使用的是Excel com interop,因此在完成资源Marshal.ReleaseComObject之后,您需要调用此方法才能释放资源。

一个好的做法是使用 try {...} catch {...} finally {...} ,并在finally块中释放com对象。