我现在做的是一个winform程序,现在想把DataGridView中的数据导出到Excel中,用的是Interop包,程序如下,在导出的时候(未完全导出之前),单击excel界面,程序会停止,而且报错,报错信息:Exception from HRESULT: 0x800AC472;谢了先!下面是程序:
        public bool ExportDataGridview(DataGridView datagridview, bool isShowExcel)
        {
            if (datagridview.Rows.Count == 0)
                return false;            Excel.Application excel = new Excel.Application();
            excel.Application.Workbooks.Add(true);
            excel.Visible = isShowExcel;            for (int i = 0; i < datagridview.ColumnCount; i++)
            {
                excel.Cells[1, i + 1] = datagridview.Columns[i].HeaderText;
            }            for (int i = 0; i < datagridview.RowCount - 1; i++)
            {
                for (int j = 0; j < datagridview.ColumnCount; j++)
                {
                    excel.Cells[i + 2, j + 1] = datagridview[j, i].Value.ToString();
                }
            }
            return true;
        }

解决方案 »

  1.   

    你的excel数据量很大?如果是千条以内的话,也就是几秒钟的时间哦。
      

  2.   

    这样导出效率太低了,应该一次过将数据装入excel
      

  3.   

    本文假设大家已经熟悉C#对Excel的调用,如果不熟悉,请参考MSDN中的《使用Excel对象模型实现Excel自动化》一、DataTable To Excel先定义一下:private Excel.Application excelApp= new Excel.ApplicationClass();//Application与ApplicationClass的区别我没有明白。              private Excel.Workbook excelBook = excelApp.Workbooks.Add(Type.Missing);private Excel.Worksheet excelSheet = (Excel.Worksheet)excelBook.ActiveSheet;   excelApp.Visible = true;1、让我们看看在网上流传最多的解决方案:    public void DataTableToExcel(DataTable dt)
        {       
            for (int i = 0; i <dt.Rows.Count; i++)
            {
                for (int j=0;j<dt.Columns.Count;j++)
        {
                     excelSheet.Cells[i+1,j+1] = dt.Rows[i][j].ToString();
                }
             }
        }
    不可否认这段程序会不出错误的运行,但是效率就比较低了,会随着数据行和列的增加而增加,主要的时间都耗在了Excel单元格的读取上。让我们改进一下,利用DataRow.ItemArray:public void DataTableToExcel(DataTable dt){       int colCount = dt.Columns.Count;for (int i = 0; i <dt.Rows.Count; i++){    excelSheet.get_Range(excelSheet.Cells[i+1,1], excelSheet.Cells[i+1, colCount]).Value2 = dt.Rows[i].ItemArray;     }
    }这就有了很大进步,效率与数据列的多少已经无关了,对于这个改进我在网上还没有看到,为此我还曾沾沾自喜,但是这个方法的效率依然不高,尤其是灵活性不够。以上效率的损失主要是每导出一条记录都要与Excel交互一次,如果我们把数据准备好一次性写入Excel是否效率更快?看如下程序:public void DataTableToExcel(DataTable dt){           int rowCount = dt.Rows.Count;int colCount = dt.Columns.Count;object[,] dataArray = new object[rowCount,colCount];for (int i = 0; i <rowCount; i++){for (int j=0;j<colCount;j++){            dataArray[i, j] = dt.Rows[i][j];         }}excelSheet.get_Range("A1", excelSheet.Cells[rowCount, colCount]).Value2 = dataArray;}
      

  4.   

    对头,放到数组里,一次写入,但对样式处理不好处理了,比方说,我在第N列,是数字,但我要做文本处理,如果不做特殊处理,EXCEL会认为是数字,这样显示的与我们想要的就不同了。
      

  5.   

    那怎么把excel文件导入C#中呢?求救啊,有程序更好