以下相关功能为以前在 VB中写的一个通用的 Model ,以方便调用Excel功能,并进行输出和格式处理。
Public xlsApp As New excel.Application
Public xlsBook As New excel.Workbook
Public xlsSheet As New excel.Worksheet
'--------------------------------
' 画一Excel 选择范围的边框
'--------------------------------
Public Sub DrawBorder(ByRef Ra As excel.Range,BordersIndex As XlBordersIndex,Optional LineStyle As XlLineStyle = xlContinuous,Optional BorderWeight As XlBorderWeight = xlThin)
With Ra.Borders(BordersIndex)
.LineStyle = LineStyle
If LineStyle = xlNone Then Exit Sub
.Weight = BorderWeight
.ColorIndex = xlAutomatic
End With
End Sub
'--------------------------------
' 为一个范围的格子画线-网格或仅为外框线
'--------------------------------
Public Sub DrawGrid(ByRef Ra As excel.Range,Optional ByVal blnBox As Boolean = False,Optional BorderWeight As XlBorderWeight = xlThin)
' 先初始化
Ra.Borders(xlDiagonalDown).LineStyle = xlNone
Ra.Borders(xlDiagonalUp).LineStyle = xlNone
' 画外框线
DrawBorder Ra,xlEdgeTop,LineStyle,BorderWeight
DrawBorder Ra,xlEdgeBottom,xlEdgeLeft,xlEdgeRight,BorderWeight
' 画内部线
If Not blnBox Then
' 如为网格线,则需处理此处理,如仅为Box 外框则无需处理
DrawBorder Ra,xlInsideVertical,xlInsideHorizontal,BorderWeight
End If
End Sub
'--------------------------------
' 对格子的文字格式进行处理,使其中的文字可进行换行
'--------------------------------
Public Sub WrapText(ByRef Ra As excel.Range)
Ra.Select
With xlsApp.Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlBottom
.WrapText = True
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.MergeCells = False
End With
End Sub
'--------------------------------
' 对格子的文字格式进行处理,使其中的文字可进行换行
'--------------------------------
Public Sub FormatCells(ByRef Ra As excel.Range,Optional HAlign As excel.Constants = xlCenter,_
Optional VAlign As excel.Constants = xlCenter,Optional bWrapText As Boolean = False,_
Optional nOrient As Long = 0,Optional bMerge As Boolean = False)
Ra.Select
With xlsApp.Selection
.HorizontalAlignment = HAlign
.VerticalAlignment = VAlign
.WrapText = bWrapText
.Orientation = nOrient
.AddIndent = False
.ShrinkToFit = False
.MergeCells = bMerge
End With
End Sub
'--------------------------------
' 对一个格加入注释
'--------------------------------
Public Sub AddComment(ByRef objRange As excel.Range,ByVal sText As String,Optional ByVal bVisible As Boolean = False)
With objRange
.Select
.AddComment
.Comment.Visible = bVisible
.Comment.Text Text:="" & Chr(10) & sText & Chr(10) & ""
End With
End Sub
'--------------------------------
' 以一个格为基础,将其算式同样用于其它格
'--------------------------------
Public Sub AutoFill(ByRef objSouRange As excel.Range,ByRef objDesRagne As excel.Range,ByVal sFormulaR1C1 As String,ByVal nFillType As excel.XlAutoFillType)
With objSouRange
'ActiveCell.FormulaR1C1 = sFormulaR1C1
.Value = sFormulaR1C1
.Select
End With
xlsApp.Selection.AutoFill Destination:=objDesRagne,Type:=nFillType
End Sub
'--------------------------------
' 将Rst 中的资料直接输出至Excel文件中
'--------------------------------
Public Function RsToExcel(ByRef oRs As ADODB.Recordset,ByRef oXls As excel.Application,Optional ByVal lRow As Long = 1,Optional ByVal lCol As Long = 1,Optional ByVal bListCaption As Boolean = True) As Long
If oRs Is Nothing Then Exit Function
If oRs.State = adStateClosed Then Exit Function
If bListCaption Then
Dim i As Long
For i = lCol To oRs.Fields.Count + lCol - 1
oXls.Cells(lRow,i) = "'" & oRs(i - 1).Name
Next i
Else
lRow = lRow - 1
End If
If oRs.EOF Then
Exit Function
End If
On Error GoTo RsToExcel_Error
oXls.Range(getExcelCol(lCol,False) & lRow + 1).CopyFromRecordset oRs
Exit Function
RsToExcel_Error:
End Function
'---------------------------------
'取得对应栏的下标名称,用到此
' pBaSEOnChar - 是否基于字母的基础,不是则表示直接基于坐标数字值
'---------------------------------
Public Function getExcelCol(ByVal plCol As Long,Optional pBaSEOnChar As Boolean = True) As String
Dim nCol As Long
If pBaSEOnChar Then
nCol = plCol Mod 64
Else
nCol = plCol
End If
If nCol < 27 Then
getExcelCol = Chr(nCol + 64)
Else
'getExcelCol = Chr(nCol / 26 + 64) & Chr(nCol Mod 26 + 64)
getExcelCol = Chr((nCol - 1) / 26 + 64) & Chr(IIf(nCol Mod 26 = 0,26,nCol Mod 26) + 64)
End If
End Function
'--------------------------------
' 产生标准的报表表头
' add C/E Convertion function (Parameter : bUseChinese)
'--------------------------------
Public Sub ExportRptHeader(Sheet As excel.Worksheet,ByVal nRow As Long,ByVal sCol_Left As String,_
sCol_Right As String,ByVal sRptID As String,ByVal sUserID As String,_
ByVal sCompanyName As String,ByVal sSystemName As String,ByVal sReportName As String,_
Optional ByVal sCaptionFontSize As Integer = 14,Optional ByVal bUseChinese As Boolean = True)
On Error GoTo errRptHeader
' ABC,分别代表左边的指定开始列的前三列
' XYZ,分别代表右边的指定列的连续三列,指定列为Y
Dim sColA As String
Dim sColB As String
Dim sColC As String
Dim sColX As String
Dim sColY As String
Dim sColZ As String
sColA = sCol_Left
sColB = Chr(Asc(sColA) + 1)
sColC = Chr(Asc(sColA) + 2)
sColY = sCol_Right
sColX = Chr(Asc(sColY) - 1)
sColZ = Chr(Asc(sColY) + 1)
With Sheet
.Range(sColA & nRow).Value = IIf(bUseChinese,"报表ID :","Report ID :")
.Range(sColA & nRow + 1).Value = IIf(bUseChinese,"用户ID :","User ID :")
' value
.Range(sColB & nRow).Value = sRptID
.Range(sColB & nRow + 1).Value = sUserID
.Range(sColY & nRow).Value = IIf(bUseChinese,"日期 :","Date :")
.Range(sColY & nRow + 1).Value = IIf(bUseChinese,"时间 :","Time :")
' value
.Range(sColZ & nRow).Value = Format(Date,"dd Mmm yyyy")
.Range(sColZ & nRow).NumberFormat = "dd Mmm yyyy"
.Range(sColZ & nRow + 1).Value = Format(Time,"HH:MM")
' Factory Name / System / Report Name
.Range(sColC & nRow).Value = UCase(Trim(sCompanyName))
.Range(sColC & nRow + 1).Value = UCase(Trim(sSystemName))
.Range(sColC & nRow + 2).Value = UCase(Trim(sReportName))
'Merge Cells
.Range(sColC & nRow & ":" & sColX & nRow).MergeCells = True
.Range(sColC & nRow & ":" & sColX & nRow).HorizontalAlignment = xlCenter
.Range(sColC & nRow + 1 & ":" & sColX & nRow + 1).MergeCells = True
.Range(sColC & nRow + 1 & ":" & sColX & nRow + 1).HorizontalAlignment = xlCenter
.Range(sColC & nRow + 2 & ":" & sColX & nRow + 2).MergeCells = True
.Range(sColC & nRow + 2 & ":" & sColX & nRow + 2).HorizontalAlignment = xlCenter
'Font
.Range(sColC & nRow & ":" & sColX & nRow + 2).Font.Size = 14
.Range(sColC & nRow & ":" & sColX & nRow + 2).Font.Bold = True
End With
errRptHeader:
If Err.Number <> 0 Then
MsgBox Err.Description,vbOKOnly + vbExclamation,"Prompt ( ExportRptHeader ):"
End If
End Sub
'-----------------------------------------------------------------------------------------
' 取得一个临时文件名,包括完整的路径名及名件名
'-----------------------------------------------------------------------------------------
Public Function getTempFileFullName(Optional ByVal psExtName As String = "") As String
getTempFileFullName = ""
Dim fso,tempfile
Set fso = CreateObject("Scripting.FileSystemObject")
Dim tfolder,tname
Const TemporaryFolder = 2
Set tfolder = fso.GetSpecialFolder(TemporaryFolder)
tname = fso.GetTempName
getTempFileFullName = sfTrim(tfolder & "/" & tname) & psExtName Set fso = NothingEnd Function