public static void GridviewtoExcel(DataGridView dg, string title)//将Datatable中的数据导出到Excel中
        {
            if (dg.Rows.Count == 0)
            {
                MessageBox.Show("无数据", Frmmain.tips, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }
            string saveFileName = "";
            SaveFileDialog saveDialog = new SaveFileDialog();
            saveDialog.DefaultExt = "xls";
            saveDialog.Filter = "Excel文件|*.xls";
            saveDialog.FileName = title;
            saveDialog.ShowDialog();
            saveFileName = saveDialog.FileName;
            if (saveFileName.IndexOf(":") < 0) return; //被点了取消
            Excel.Application xlApp = new Excel.Application();
            try
            {
                object missing = System.Reflection.Missing.Value;
                if (xlApp == null)
                {
                    MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel", Frmmain.tips, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }
                Excel.Workbooks workbooks = xlApp.Workbooks;
                Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
                Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1];//取得sheet1
                Excel.Range range;
                for (int i = 0; i < dg.Columns.Count; i++)
                {
                    if (dg.Columns[i].Visible == false) continue;
                    worksheet.Cells[1, i + 1] = dg.Columns[i].HeaderText;
                    range = (Excel.Range)worksheet.Cells[1, i + 1];
                    range.Font.Bold = true;
                }
                Excel.Range myrange = worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[dg.Rows.Count + 1, 1]);//设置单牌号所在的单元格格式为文本格式
                myrange.NumberFormatLocal = "@ ";
                for (int r = 0; r < dg.Rows.Count; r++)
                {
                    for (int i = 0; i < dg.Columns.Count; i++)
                    {
                        if (dg.Columns[i].Visible == false || dg.Columns[i].CellType.Name == "DataGridViewCheckBoxCell")
                        {
                            continue;
                        }
                        worksheet.Cells[r + 2, i + 1] = dg.Rows[r].Cells[i].Value.ToString();
                    }
                    System.Windows.Forms.Application.DoEvents();
                }
                worksheet.SaveAs(saveFileName, missing, missing, missing, missing, missing, missing, missing, missing, missing);
                workbook.Close(missing, missing, missing);
                worksheet = null;
                workbook = null;
                xlApp.Quit();
                xlApp = null;
                missing = null;            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                GC.Collect();
            }
        }
用以上的方法可以把Datagridview中的数据导出到Excel中,但是导出以后内存中还会驻留Excel.exe的进程。帮忙看下到底是哪儿出问题了,又或者有什么好的导出方法。

解决方案 »

  1.   

    试试看            if (xlApp != null)
                {
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
                    xlApp = null;
                }
      

  2.   


    using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate))
                {
                    using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.Unicode))
                    {
                        StringBuilder rowWriter = new StringBuilder();                    rowWriter.Append("姓名\t性别\t年龄\n");
                        foreach (DataSetView.UserRow row in dt.Rows)
                        {
                            rowWriter.Append(row.UserName).Append("\t");
                            rowWriter.Append(row.UserSex.ToString()).Append("\t");
                            rowWriter.Append(row.UserAge.ToString()).Append("\n");
                                               }                    streamWriter.Write(rowWriter.ToString());
                    }
                }
    这样不需要安装office excel也可以导出来.