请问各位大虾,我在winform里想把DataGridView表格里数据用流的形式导出到EXCEL,但导出时老出现“在可以调用DLE之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STATHreadAttribute标记。只有将调试器附加到该进程才会引发此异常。”
我已经按它说的,在mian函数前加了[STATHreadAttribute]了,错误照常,调用代码如下:
        private void ExportToExcel(CDataGridView dgvAgeWeekSex)
        {            SaveFileDialog saveFileDialog = new SaveFileDialog();            saveFileDialog.Filter = "Execl files (*.xls)|*.xls";            saveFileDialog.FilterIndex = 0;            saveFileDialog.RestoreDirectory = true;            saveFileDialog.CreatePrompt = true;            saveFileDialog.Title = "Export Excel File To";            saveFileDialog.ShowDialog();            Stream myStream;            myStream = saveFileDialog.OpenFile();            //StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));            StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));            string str = "";            try
            {                //写标题                for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++)
                {                    if (i > 0)
                    {                        str += "\t";                    }                    str += dgvAgeWeekSex.Columns[i].HeaderText;                }                sw.WriteLine(str);                //写内容                for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++)
                {                    string tempStr = "";                    for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++)
                    {                        if (k > 0)
                        {                            tempStr += "\t";                        }                        tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString();                    }                    sw.WriteLine(tempStr);                }                sw.Close();                myStream.Close();            }            catch (Exception e)
            {                MessageBox.Show(e.ToString());            }            finally
            {                sw.Close();                myStream.Close();            }    
        }
不知哪些大哥有遇过这样相同的问题的?帮忙解决一下

解决方案 »

  1.   

    而且通过调试,我还发现一运行到saveFileDialog.ShowDialog()这句就出现那个错误了。
      

  2.   

    saveFileDialog.Filter = "Execl files (*.xls)|*.xls"; 
    你把这句话屏蔽掉
    再试一下呢?
      

  3.   

     myStream = saveFileDialog.OpenFile(); 
    改为 myStream = new FileStream(saveFileDialog.FileName, FileMode.OpenOrCreate, FileAccess.Write);
      

  4.   

    saveFileDialog.ShowDialog(); 这个有返回值的,最好判断下。估计是这个地方没有判断引起的,改成下面的:……
    DialogResult result = saveFileDialog.ShowDialog();if(result.ToString() == "OK" )
    {
         Stream myStream;             myStream = saveFileDialog.OpenFile();             //StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding("gb2312"));             StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));             string str = "";             try 
                {                 //写标题                 for (int i = 0; i < dgvAgeWeekSex.ColumnCount; i++) 
                    {                     if (i > 0) 
                        {                         str += "\t";                     }                     str += dgvAgeWeekSex.Columns[i].HeaderText;                 } 
                    sw.WriteLine(str); 
                    //写内容                 for (int j = 0; j < dgvAgeWeekSex.Rows.Count; j++) 
                    {                     string tempStr = "";                     for (int k = 0; k < dgvAgeWeekSex.Columns.Count; k++) 
                        {                         if (k > 0) 
                            {                             tempStr += "\t";                         }                         tempStr += dgvAgeWeekSex.Rows[j].Cells[k].Value.ToString();                     } 
                        sw.WriteLine(tempStr);                 }                 sw.Close();                 myStream.Close();             }             catch (Exception e) 
                {                 MessageBox.Show(e.ToString());             }             finally 
                {                 sw.Close();                 myStream.Close();             }    
            }
    }