【Myrat】用asp.net呼叫excel並輸出的一點經驗
前一段時間用asp.net呼叫excel做報表,有一些小心得。
1.建立:我先自己建立了一份模版,然後用excel讀取模版,再把資料寫進去。這樣做的好處,就是可以把資料層和表現層分開,以後需要改變顏色,字型等等的時候,只要format這個模版就行了。
讀取模版檔案(templateName為檔名):
Dim objSheet As Excel.Worksheet
Try
objExcel = New Excel.Application()
'If encounter same name file,then overwrite
objExcel.Application.DisplayAlerts = False
objExcel.Visible = False
objExcel.SheetsInNewWorkbook = 1
objExcel.Workbooks.Add(Server.MapPath(templateName))
End Try
objSheet = objExcel.Workbooks(1).Worksheets(1)
2.資料:然後就往裡面寫資料啦。如果是單個的資料當然好寫,像這樣:
objSheet.Cells(3, 5) = startDate.ToString("dd-MMM-yy")
但如果是一個dataset呢?試驗多次後發現,最方便快捷的方法是把dataset轉成array在寫進去,因為可以直接將一個range賦值為一個array。而且這種方法效率也應該是最高的:
Dim dataArray As Object(,) = DataSetToArray(dsTrainerPerformance, _
"SNO,FullName,Organization,Department,Feedback")
objSheet.Range("A8").Resize(dataCount, 13).Value = dataArray
這裡的DataSetToArray是自己寫的一個function,把dataset轉換成一個2d array。
3.格式:上面不是說了在模版裡面format嘛,為什麼又要再講?別忘了,再模版裡面東西是死的,第幾行就是第幾行,可是你寫了一堆資料進去後,行數就全變了阿。這時候有兩種辦法:1,寫code來format。我是對每種格式都定義了一下,比如表頭是一種格式,資料欄是一種格式,統計欄是一種格式。然後定義每種格式,比如邊框,有邊框/無邊框,對齊,下劃線,字型,摺疊,number format等等。
這個function是用來format一個制定的range的。
Private Sub FormatRange()Sub FormatRange(ByRef range As Excel.Range, _
ByVal formatIndex As Integer = 0)
With range
Select Case formatIndex
Case 1
'lines: top and bottom, left align
With .Borders(Excel.XlBordersIndex.xlEdgeTop)
.Color = 0
.Weight = 2
.LineStyle = Excel.XlLineStyle.xlContinuous
End With
With .Borders(Excel.XlBordersIndex.xlEdgeBottom)
.Color = 0
.Weight = 2
.LineStyle = Excel.XlLineStyle.xlContinuous
End With
If .Rows.Count > 1 Then
With .Borders(Excel.XlBordersIndex.xlInsideHorizontal)
.Color = 0
.Weight = 2
.LineStyle = Excel.XlLineStyle.xlContinuous
End With
End If
Case 2
'bold, underline, center
.Font.Bold = True
.Font.Underline = True
.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
Case 3
'bold, left align, nowrap
.WrapText = False
.Font.Bold = True
.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft
Case 4
'bold, underline, left align
.Font.Bold = True
.Font.Underline = True
.HorizontalAlignment = Excel.XlHAlign.xlHAlignLeft
Case 5
'bold, center
.Font.Bold = True
.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter
Case 6
'normal
Case 7
'bold, right, wrap text
.WrapText = True
.Font.Bold = True
.HorizontalAlignment = Excel.XlHAlign.xlHAlignRight
End Select
End With
End Sub
使用的時候:
FormatRange(oSheet.Range(range), formatIndex)
這裡才列了7種格式,當時我越寫越多,每種不同的格式都要定義一下,很快寫了30多種格式,實在不想寫了,才想了下面這種方法。
其實也很簡單,把每種格式都做在template裡面,比如為表頭定義一行,資料欄定義一行,然後copy表頭那一行,再在裡面寫字;copy資料欄那一行paste,需要多少行就paste多少行,然後再寫資料。
copy預先在template裡面定義好的資料欄
For i = 0 To datacount - 1
objSheet.Range("A8:D8").Copy(objSheet.Range("A" & StartRow + 1 + i & ":D" & StartRow + 1 + i))
Next
objSheet.Range("A8:D8")就是事先format好的。以後改變format的時候就容易拉~~
4.清除垃圾:Excel這個程式,如果不殺死的話,就不會自動退出,所以一定要手動殺死:
If Not objExcel Is Nothing Then
objExcel.Workbooks.Close()
objExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel)
End If
If Not objSheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objSheet)
End If
objSheet = Nothing
objExcel = Nothing
GC.Collect()
5.輸出:我實在找不到辦法把這個workbook變成stream輸出,只好用笨辦法,寫到檔案裡再讀出來:誰有更好的辦法請告訴我
Dim strFileName As String = GetFileName() '自己寫的得到一個文隨機的檔名
objExcel.Workbooks(1).SaveCopyAs(strFileName) '需要一個可以寫的folder
Response.Clear()
Response.Charset = ""
Response.ContentType = "Application/vnd.ms-excel"
Response.AppendHeader("content-disposition", "attachment; filename=" & Type & "Report" & ".xls")
Dim exl As Byte() = ReadFile(strFileName) '自己寫的binary讀取檔案的函式
Response.OutputStream.Write(exl, 0, exl.Length)
Response.OutputStream.Flush()
Response.End()
這個檔案當然是要刪除的,我在page_unload裡面刪除他:
Private Sub Page_Unload()Sub Page_Unload(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Unload
Dim strFileName As String = Session("strfilename")
If Not strFileName = Nothing AndAlso strFileName.Length > 0 Then
Try
System.IO.File.Delete(strFileName)
Catch ex As Exception
End Try
End If
End Sub
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-343226/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- asp.net 呼叫 excel 元件ASP.NETExcel元件
- 使用PACKAGE的一點經驗Package
- Asp.net 匯出ExcelASP.NETExcel
- 編譯核心的一點點經驗(轉)編譯
- 作培訓的一點經驗
- 利用VNPY回測引擎分析實盤交易,並用excel和pdf輸出分析結果Excel
- 輸出EXCEL檔案的通用函式,很實用 (轉)Excel函式
- asp.net Excel匯出方法ASP.NETExcel
- Excel 匯入的開發經驗Excel
- 在ASP.NET中將資料直接輸出成Excel內容 (轉)ASP.NETExcel
- 關於Presentation Error的一點經驗Error
- 英文投稿的一點經驗【轉載】
- 我的一點學習經驗 (轉)
- asp.net framework4.0 使用NOPI(一)匯出excelASP.NETFrameworkExcel
- 【Python】讀取excel並輸出到txtPythonExcel
- 用GridView匯入匯出Excel,並列印GridViewViewExcel
- asp.net輸出快取的使用ASP.NET快取
- Linux配置mlterm的一點經驗(轉)Linux
- 輸入一段字串,去除字串中重複的字元,並輸出字串字元
- Oracle Form中呼叫併發請求生成報表並輸出為PDF的方法OracleORM
- C#呼叫Windows CMD命令並,返回輸出結果或錯誤資訊C#Windows
- VNPY 批量優化引數,並輸出到excel優化Excel
- 【ASP.NET開發】ADO.NET呼叫帶輸出引數的儲存過程ASP.NET儲存過程
- ASP.NET Excel匯入和匯出ASP.NETExcel
- 從MySQL遷移到VoltDB的一點經驗MySql
- 初學J2ME的一點經驗
- root檔案系統的一點經驗(轉)
- Windows安裝tensorflow的一點人生的經驗Windows
- 【iCore4 雙核心板_FPGA】例程一:GPIO輸出實驗——點亮LEDFPGA
- TRW2k一點點小小的經驗。 (290字)
- Linux下輸出excel檔案LinuxExcel
- XML 報表自動輸出ExcelXMLExcel
- 用Pandas讀寫Excel檔案-輸出單sheet和多sheetExcel
- ASP.NET EXCEL資料的匯出和匯入ASP.NETExcel
- asp.net 利用NPOI匯出Excel通用類ASP.NETExcel
- 在 Android 中實現 Redux 的一點經驗AndroidRedux
- 關於windows installer的一點小經驗(轉)Windows
- 【iCore1S 雙核心板_FPGA】例程一:GPIO輸出實驗——點亮LEDFPGA