【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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- HTML Table 輸出ExcelHTMLExcel
- 利用VNPY回測引擎分析實盤交易,並用excel和pdf輸出分析結果Excel
- Excel 匯入的開發經驗Excel
- 輸入一段字串,去除字串中重複的字元,並輸出字串字元
- VNPY 批量優化引數,並輸出到excel優化Excel
- ASP.NET 匯出gridview中的資料到Excel表中,並對指定單元格換行操作ASP.NETViewExcel
- C#呼叫Windows CMD命令並,返回輸出結果或錯誤資訊C#Windows
- 用Pandas讀寫Excel檔案-輸出單sheet和多sheetExcel
- 定義一個函式,輸入一個連結串列的頭節點,反轉該連結串列並輸出反轉後連結串列的頭節點函式
- matlab輸出資料為excel檔案MatlabExcel
- 實用的管理經驗
- Sobol 序列並行化的實踐經驗並行
- 慢動作輸出 Linux 命令結果並用彩色顯示Linux
- 用putchar輸出
- PHP GD庫解析一張簡單圖片並輸出PHP
- Excel匯出 並完成後自動開啟Excel
- UICollectionView: 糊一張裝飾檢視 Decoration View 的一點經驗UIView
- DcatAdmin 配合 `maatwebsite/excel` 擴充套件 在後臺增加 excel 匯出的功能,並可匯出圖片WebExcel套件
- mssql sqlserver 使用指令碼輸出excel檔案的方法分享SQLServer指令碼Excel
- cadical呼叫與改寫為多輸出2
- 創業一年失敗總結:我用100萬買來的6點經驗創業
- 關於輸出的小語法點
- 判斷單連結串列中是否存在環,並輸出環入口節點。
- 程式設計師筆記(知識)管理的一點經驗程式設計師筆記
- 輸入一個3,輸出March,輸入一個數字月份,然後對應輸出相應的英文表示,用指標陣列完成指標陣列
- 一、輸入一個數(這裡用函式實現) 1.輸出它是幾位數 2.逆序輸出 3.正序輸出函式
- VNPY 批量策略回測和統計結果的excel輸出Excel
- Docker初體驗,建立並匯出第一個本地映象Docker
- 如何把十進位制的數輸入用二進位制全加器,並以十進位制輸出
- 實驗1_C語言輸入輸出和簡單程式應用程式設計實驗報告C語言程式設計
- ollama搭建本地ai大模型並應用呼叫AI大模型
- 呼叫函式:如把ssha的值在SSHA的框中輸出函式
- Netflix採用GraphQL的經驗分享
- GitHub CSP應用的經驗分享Github
- 請寫出在ASP.NET中常用的幾種頁面間傳值的方法,並說出它們的特點。ASP.NET
- Java取當前時間的一分鐘後,並格式化輸出Java
- 釋出並部署NCF站點的那些事
- 【Django】有關多使用者管理的一點小經驗分享Django
- [測試經驗] 依賴方介面呼叫測試