将DataTable的数据导出至Excel有下列的方法:
方法一:该方法通过流的形式往Excel中写入数据,优点是速度快,缺点就是由于Excel里的智能识别功能,把数字首位的0去掉了,并且数字以科学记数法显式。

        private void OutToExcel(System.Data.DataTable dt)
        {
            #region   验证可操作性

            //定义表格内数据的行数和列数   
            int rowscount = dt.Rows.Count;
            int colscount =dt.Columns.Count;
            //行数必须大于0   
            if (rowscount <= 0)
            {
                MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            //列数必须大于0   
            if (colscount <= 0)
            {
                MessageBox.Show("没有数据可供保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            //行数不可以大于65536   
            if (rowscount > 65536)
            {
                MessageBox.Show("数据记录数太多(最多不能超过65536条),不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }

            //列数不可以大于255   
            if (colscount > 255)
            {
                MessageBox.Show("数据记录行数太多,不能保存 ", "提示 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            #endregion
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.Filter = "Execl files (*.xls)|*.xls";
            saveFileDialog.FilterIndex = 0;
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.CreatePrompt = true;
            saveFileDialog.Title = "保存为Excel文件";
            saveFileDialog.ShowDialog();

            if (saveFileDialog.FileName.IndexOf(":") < 0) return; //被点了"取消"

            Stream myStream;
            myStream = saveFileDialog.OpenFile();
            StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(-0));
            string columnTitle = "";
            try
            {
                //写入列标题
                for (int i = 0; i < colscount; i++)
                {
                    if (i > 0)
                    {
                        columnTitle += "\t";
                    }
                    columnTitle += dt.Columns[i].ColumnName;
                }
                sw.WriteLine(columnTitle);

                //写入列内容
                for (int j = 0; j < rowscount; j++)
                {
                    string columnValue = "";
                    for (int k = 0; k < colscount; k++)
                    {
                        if (k > 0)
                        {
                            columnValue += "\t";
                        }
                        if (dt.Rows[j][k]== null)
                            columnValue += "";
                        else
                        {
                            if (dt.Rows[j][k].GetType() == typeof(string) && dt.Rows[j][k].ToString().StartsWith("0"))
                            {
                                columnValue += "'" + dt.Rows[j][k].ToString();
                            }
                            else
                                columnValue += dt.Rows[j][k].ToString();
                        }
                    }
                    sw.WriteLine(columnValue);
                }
                sw.Close();
                myStream.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                sw.Close();
                myStream.Close();
                MessageBox.Show("数据导出成功,共导出"+dt.Rows.Count.ToString()+"条记录");
            }
        }
方法二:该方法能避免Excel对数据的自动处理,但是由于是往Excel的单元格逐一写入数据,数据量小的时候速度还可以,如果数据量太大,速度就很慢了。
        public static bool CreateExcelFileForDataTable(System.Data.DataTable dt)
        {
            SaveFileDialog saveFileDialog1 = new SaveFileDialog();
            saveFileDialog1.Filter = "Excel文件名称 (*.xls)|*.xls";
            saveFileDialog1.RestoreDirectory = true;
            if (saveFileDialog1.ShowDialog() == DialogResult.OK && saveFileDialog1.FileName != null)
            {
                //文件存在时先删除文件后再进行下一步操作
                int rowIndex = 1;      //开始写入数据的单元格行
                int colIndex = 0;      //开始写入数据的单元格列
                //int columnNum = size;
                System.Reflection.Missing miss = System.Reflection.Missing.Value;
                Excel.Application xlapp = new Excel.Application();
                Excel.ApplicationClass mExcel = new Excel.ApplicationClass();
                mExcel.Visible = false;
                Excel.Workbooks mBooks = (Excel.Workbooks)mExcel.Workbooks;
                Excel.Workbook mBook = (Excel.Workbook)(mBooks.Add(miss));
                Excel.Worksheet mSheet = (Excel.Worksheet)mBook.ActiveSheet;
                Excel.Range range = mSheet.get_Range((object)"A1", System.Reflection.Missing.Value);
                try
                {                // Headers.  
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        colIndex++;
                        mSheet.Cells[rowIndex, colIndex] = dt.Columns[i].ColumnName;
                    }
                    foreach (DataRow row in dt.Rows)    //同样方法处理数据
                    {
                        rowIndex++;
                        colIndex = 0;
                        foreach (DataColumn col in dt.Columns)
                        {
                            colIndex++;
                            if (row[col.ColumnName].GetType() == typeof(string))
                            {
                                mSheet.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString();
                            }
                            else
                            {
                                mSheet.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
                            }
                        }
                    }
                    //保存工作已写入数据的工作表,加亮处为解决整个问题的关键
                    mBook.SaveAs(saveFileDialog1.FileName, Excel.XlFileFormat.xlExcel7, miss, miss, miss, miss, Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss);
                    return true;
                }
                catch (Exception ee)
                {
                    throw new Exception(ee.Message);
                    return false;
                }
               finally //finally中的代码主要用来释放内存和中止进程()
                {
                    mBook.Close(false, miss, miss);
                    mBooks.Close();
                    mExcel.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mSheet);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mBook);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mBooks);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(mExcel);
                    GC.Collect();
                }
            }
            else
            {
                return false;
            }
        }

posted on 2009-08-27 12:16  软件小懒猫  阅读(1512)  评论(0编辑  收藏  举报