在前一篇文章中,,介紹了DataSet導(dǎo)出到Excel時(shí)客戶端生成文件的幾種思路,接著往下說,,服務(wù)器端生成文件,,用戶直接下載,應(yīng)該格式是可以保證的,!
于是直接調(diào)用Excel的API生成,。代碼如下:
DataSetToLocalExcel
public static void DataSetToLocalExcel(DataSet dataSet, string outputPath, bool deleteOldFile) { if (deleteOldFile) { if (System.IO.File.Exists(outputPath)) { System.IO.File.Delete(outputPath); } } // Create the Excel Application object ApplicationClass excelApp = new ApplicationClass(); // Create a new Excel Workbook Workbook excelWorkbook = excelApp.Workbooks.Add(Type.Missing); int sheetIndex = 0; // Copy each DataTable foreach (System.Data.DataTable dt in dataSet.Tables) { // Copy the DataTable to an object array object[,] rawData = new object[dt.Rows.Count + 1, dt.Columns.Count]; // Copy the column names to the first row of the object array for (int col = 0; col < dt.Columns.Count; col++) { rawData[0, col] = dt.Columns[col].ColumnName; } // Copy the values to the object array for (int col = 0; col < dt.Columns.Count; col++) { for (int row = 0; row < dt.Rows.Count; row++) { rawData[row + 1, col] = dt.Rows[row].ItemArray[col]; } } // Calculate the final column letter string finalColLetter = string.Empty; string colCharset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int colCharsetLen = colCharset.Length; if (dt.Columns.Count > colCharsetLen) { finalColLetter = colCharset.Substring( (dt.Columns.Count - 1) / colCharsetLen - 1, 1); } finalColLetter += colCharset.Substring( (dt.Columns.Count - 1) % colCharsetLen, 1); // Create a new Sheet Worksheet excelSheet = (Worksheet)excelWorkbook.Sheets.Add( excelWorkbook.Sheets.get_Item(++sheetIndex), Type.Missing, 1, XlSheetType.xlWorksheet); excelSheet.Name = dt.TableName; // Fast data export to Excel
string excelRange = string.Format("A1:{0}{1}", finalColLetter, dt.Rows.Count + 1); excelSheet.get_Range(excelRange, Type.Missing).Value2 = rawData; // Mark the first row as BOLD ((Range)excelSheet.Rows[1, Type.Missing]).Font.Bold = true; } //excelApp.Application.AlertBeforeOverwriting = false; excelApp.Application.DisplayAlerts = false; // Save and Close the Workbook excelWorkbook.SaveAs(outputPath, XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); excelWorkbook.Close(true, Type.Missing, Type.Missing); excelWorkbook = null; // Release the Application object excelApp.Quit(); excelApp = null; // Collect the unreferenced objects GC.Collect(); GC.WaitForPendingFinalizers(); } 說明下,其中的 xlSAPp.Application.DisplayAlerts = false; 的作用是不顯示確認(rèn)對(duì)話框
也可以逐Cell讀取,,那樣可能會(huì)慢,。本方法速度還過得去。
生成Winform代碼測(cè)試沒錯(cuò),,部署時(shí),,以為只要引用兩個(gè)dll就可以了
Microsoft.Office.Interop.Excel.dll
Office.dll
那成想,問題接著來了,,當(dāng)在WebForm下調(diào)用時(shí),, 提示“檢索 COM 類工廠中 CLSID 為 {00024500-0000-0000-C000-000000000046} 的組件時(shí)失敗,原因是出現(xiàn)以下錯(cuò)誤: 8000401a ”
暈,! Google下,,解決方案是在服務(wù)器上安裝Office,并配置DCOM權(quán)限。步驟如下:
配置 DCOM 中 EXCEL 應(yīng)用程序:
要在交互式用戶帳戶下設(shè)置 Office 自動(dòng)化服務(wù)器,,請(qǐng)按照下列步驟操作:
1. 以管理員身份登錄到計(jì)算機(jī),,并使用完整安裝來安裝(或重新安裝)Office。為了實(shí)現(xiàn)系統(tǒng)的可靠性,,建議您將 Office CD-ROM 中的內(nèi)容復(fù)制到本地驅(qū)動(dòng)器并從此位置安裝 Office,。
2. 啟動(dòng)要自動(dòng)運(yùn)行的 Office 應(yīng)用程序。這會(huì)強(qiáng)制該應(yīng)用程序進(jìn)行自我注冊(cè),。
3. 運(yùn)行該應(yīng)用程序后,,請(qǐng)按 Alt+F11 以加載 Microsoft Visual Basic for Applications (VBA) 編輯器。這會(huì)強(qiáng)制 VBA 進(jìn)行初始化,。
4. 關(guān)閉應(yīng)用程序,,包括 VBA。
5. 單擊開始,,單擊運(yùn)行,,然后鍵入 DCOMCNFG。選擇要自動(dòng)運(yùn)行的應(yīng)用程序,。應(yīng)用程序名稱如下所示:
Microsoft Access 97 - Microsoft Access 數(shù)據(jù)庫(kù) Microsoft Access 2000/2002 - Microsoft Access 應(yīng)用程序 Microsoft Excel 97/2000/2002 - Microsoft Excel 應(yīng)用程序 Microsoft Word 97 - Microsoft Word Basic Microsoft Word 2000/2002 - Microsoft Word 文檔
單擊屬性打開此應(yīng)用程序的屬性對(duì)話框,。
6. 單擊安全選項(xiàng)卡,。驗(yàn)證使用默認(rèn)的訪問權(quán)限和使用默認(rèn)的啟動(dòng)權(quán)限已選中。
7. 單擊標(biāo)識(shí)選項(xiàng)卡,,然后選擇交互式用戶,。
8. 單擊確定,關(guān)閉屬性對(duì)話框并返回主應(yīng)用程序列表對(duì)話框,。
9. 在 DCOM 配置對(duì)話框中,,單擊默認(rèn)安全性選項(xiàng)卡。
10. 單擊訪問權(quán)限的編輯默認(rèn)值,。驗(yàn)證訪問權(quán)限中是否列出下列用
戶,,如果沒有列出,則添加這些用戶: SYSTEM INTERACTIVE Everyone Administrators IUSR_ <machinename> * IWAM_ <machinename> *
* 這些帳戶僅在計(jì)算機(jī)上安裝了 Internet Information Server (IIS) 的情況下才存在,。
11. 確保允許每個(gè)用戶訪問,,然后單擊確定。
12. 單擊啟動(dòng)權(quán)限的編輯默認(rèn)值,。驗(yàn)證啟動(dòng)權(quán)限中是否列出下列用戶,,如果沒有列出,則添加這些用戶:
SYSTEM
INTERACTIVE
Everyone
Administrators
IUSR_ <machinename> *
IWAM_ <machinename> *
* 這些帳戶僅在計(jì)算機(jī)上安裝有 IIS 的情況下才存在,。
13. 確保允許每個(gè)用戶訪問,,然后單擊確定。
14. 單擊確定關(guān)閉 DCOMCNFG,。
如果你之前起用了身份模擬 (在 Web.config 中配置了 <identity impersonate= "true "/> ) ,需要?jiǎng)h除之!
15.更新安裝Office,,把.net可編程組件安裝到本機(jī)(Excel組件)
如果還是不行.干脃把交互式用戶 換成"啟動(dòng)用戶"
折騰了一番,總算可以用了,!·只是服務(wù)器上裝Office總感覺不爽,,于是再嘗試下別的方法:
Reading and Writing Excel using OLEDB
文章出處:飛諾網(wǎng)(www.):http://www./course/7_databases/sql/msxl/20100702/310017.html
|