1.首先聲明,這些方法也都是本人搜集的資料,然后為已所用,程序中不足之處,還請高手指點(diǎn). 這些方法都沒有關(guān)閉Excel進(jìn)程。 2.網(wǎng)上有好多關(guān)于用SQL語句導(dǎo)入導(dǎo)出的例子,這里不再重復(fù)寫了。
方法1:調(diào)用com組件,導(dǎo)出access數(shù)據(jù)到Excel,就是直接調(diào)用access的導(dǎo)出功能,此方法速度超級快 using Access; Access.ApplicationClass oAccess = new Access.ApplicationClass(); oAccess.Visible = false; try { //ACCESS9: oAccess.OpenCurrentDatabase("d:\\wcf.mdb",false,""); //導(dǎo)出到excel oAccess.DoCmd.TransferSpreadsheet(Access.AcDataTransferType.acExport,Acce ss.AcSpreadSheetType.acSpreadsheetTypeExcel9,"工作表名","d:\\wcf.xls",true,null,null); //導(dǎo)入txt //oAccess.DoCmd.TransferText(Access.AcTextTransferType.acExportDelim,"","Enterprise","d:\\wcf.txt",true,"",0); oAccess.CloseCurrentDatabase(); oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone ); System.Runtime.InteropServices.Marshal.ReleaseComObject (oAccess); oAccess = null; MessageBox.Show("導(dǎo)入成功"); } catch(Exception ex) { MessageBox.Show(ex.ToString()); } finally { GC.Collect(); }
方法2:此方法速度也是超級快,只不過導(dǎo)出的格式非標(biāo)準(zhǔn)的Excel格式,默認(rèn)工作表名與文件名相同 string FileName="d:\\abc.xls"; System.Data.DataTable dt=new System.Data.DataTable(); FileStream objFileStream; StreamWriter objStreamWriter; string strLine=""; objFileStream = new FileStream(FileName,FileMode.OpenOrCreate,FileAccess.Write); objStreamWriter = new StreamWriter(objFileStream,System.Text.Encoding.Unicode); for(int i=0;i<dt.Columns.Count ;i ) { strLine=strLine dt.Columns[i].ColumnName.ToString() Convert.ToChar(9); } objStreamWriter.WriteLine(strLine); strLine=""; for(int i=0;i<dt.Rows.Count;i ) { strLine=strLine (i 1) Convert.ToChar(9); for(int j=1;j<dt.Columns.Count;j ) { strLine=strLine dt.Rows[i][j].ToString() Convert.ToChar(9); } objStreamWriter.WriteLine(strLine); strLine=""; } objStreamWriter.Close(); objFileStream.Close ();
方法3:用Ado.net 此方法速度較以上兩個顯得慢了一些,數(shù)據(jù)量越大越明顯 int Id=0; string Name="測試"; string FileName="d:\\abc.xls"; System.Data.DataTable dt=new System.Data.DataTable(); long totalCount=dt.Rows.Count ; long rowRead=0; float percent=0; OleDbParameter[] parm=new OleDbParameter[dt.Columns.Count]; string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" FileName ";Extended Properties=Excel 8.0;"; OleDbConnection objConn = new OleDbConnection(connString); OleDbCommand objCmd = new OleDbCommand(); objCmd.Connection = objConn; objConn.Open(); //建立表結(jié)構(gòu) objCmd.CommandText = @"CREATE TABLE Sheet1(序號 Integer,名稱 varchar)"; objCmd.ExecuteNonQuery(); //建立插入動作的Command objCmd.CommandText = "INSERT INTO Sheet1(" Id "," Name ")"; parm[0]=new OleDbParameter("@Id", OleDbType.Integer); objCmd.Parameters.Add (parm[0]); parm[1]=new OleDbParameter("@Company", OleDbType.VarChar); objCmd.Parameters.Add(parm[1]); //遍歷DataTable將數(shù)據(jù)插入新建的Excel文件中 for(int i=0;i<dt.Rows.Count;i ) { parm[0].Value=i 1; for(int j=1;j<parm.Length;j ) { parm[j].Value =dt.Rows[i][j]; } objCmd.ExecuteNonQuery(); rowRead ; percent=((float)(100*rowRead))/totalCount; //this.FM.CaptionText.Text = "正在導(dǎo)出數(shù)據(jù),已導(dǎo)出[" percent.ToString("0.00") "%]..."; if(i==dt.Rows.Count-1) //this.FM.CaptionText.Text = "請稍后......"; System.Windows.Forms .Application.DoEvents(); } objConn.Close(); //this.FM.CaptionText.Text = "";
方法4:此方法調(diào)用com組件,速度都慢于以上3個方法 using Excel; System.Data.DataTable dt=new System.Data.DataTable(); string FileName="d:\\abc.xls"; long totalCount=dt.Rows.Count; long rowRead=0; float percent=0; Excel.Application xlApp=null; xlApp=new Excel.Application(); 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<dt.Columns.Count;i ) { worksheet.Cells[1,i 1]=dt.Columns[i].ColumnName; range=(Excel.Range)worksheet.Cells[1,i 1]; } for(int r=0;r<dt.Rows.Count;r ) { worksheet.Cells[r 2,1]=r 1; for(int i=0;i<dt.Columns.Count;i ) { //worksheet.Cells[r 2,i 1]=dt.Rows[r][i]; if(i 1!=dt.Columns.Count) worksheet.Cells[r 2,i 2]= dt.Rows[r][i 1]; } rowRead ; percent=((float)(100*rowRead))/totalCount; //this.FM.CaptionText.Text = "正在導(dǎo)出數(shù)據(jù),已導(dǎo)出[" percent.ToString("0.00") "%]..."; System.Windows.Forms .Application.DoEvents(); } range=worksheet.get_Range(worksheet.Cells[2,1],worksheet.Cells[dt.Rows.Count 2,dt.Columns.Count]); workbook.Saved =true; workbook.SaveCopyAs(FileName); //this.FM.CaptionText.Text = "";
方法5:利用剪貼板 ,有人說此方法很快,但是我用時,這種方法最慢,請高手指點(diǎn). System.Data.DataTable dt=new System.Data.DataTable(); string filePath=@"d:\abc.xls"; object oMissing = System.Reflection.Missing.Value; Excel.ApplicationClass xlApp = new Excel.ApplicationClass(); try { xlApp.Visible = false; xlApp.DisplayAlerts = false; Excel.Workbooks oBooks = xlApp.Workbooks; Excel._Workbook xlWorkbook = null; xlWorkbook = oBooks.Open(filePath,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing, oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing,oMissing); Excel.Worksheet xlWorksheet; // 添加入一個新的Sheet頁。 xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.Add(oMissing,oMissing,1,oMissing); // 以TableName作為新加的Sheet頁名。 xlWorksheet.Name ="企業(yè)名錄"; // 取出這個DataTable中的所有值,暫存于stringBuffer中。 string stringBuffer = ""; for( int j=0; j<dt.Rows.Count; j ) { for( int k=0; k<dt.Columns.Count; k ) { stringBuffer = dt.Rows[j][k].ToString(); if( k < dt.Columns.Count - 1 ) stringBuffer = "\t"; } stringBuffer = " "; } // 利用系統(tǒng)剪切板 System.Windows.Forms.Clipboard.SetDataObject(""); // 將stringBuffer放入剪切板。 System.Windows.Forms.Clipboard.SetDataObject(stringBuffer); // 選中這個sheet頁中的第一個單元格 ((Excel.Range)xlWorksheet.Cells[1,1]).Select(); // 粘貼! xlWorksheet.Paste(oMissing,oMissing); // 清空系統(tǒng)剪切板。 System.Windows.Forms.Clipboard.SetDataObject(""); // 保存并關(guān)閉這個工作簿。 xlWorkbook.Close( Excel.XlSaveAction.xlSaveChanges , oMissing, oMissing ); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook); xlWorkbook = null;
|