asp操作Excel类

2013 年 9 月 17 日6030

IT专家网 > winsystem

asp操作Excel类

asp操作Excel类

以下是代码片段:
<%
'*******************************************************************
'使用说明
'Dim a
'Set a=new CreateExcel
'a.SavePath="x" '保存路径
'a.SheetName="工作簿名称" '多个工作表 a.SheetName=array("工作簿名称一","工作簿名称二")
'a.SheetTitle="表名称" '可以为空 多个工作表 a.SheetName=array("表名称一","表名称二")
'a.Data =d '二维数组 '多个工作表 array(b,c) b与c为二维数组
'Dim rs
'Set rs=server.CreateObject("Adodb.RecordSet")
'rs.open "Select id, classid, className from [class] ",conn, 1, 1
'a.AddDBData rs, "字段名一,字段名二", "工作簿名称", "表名称", true 'true自动获取表字段名
'a.AddData c, true , "工作簿名称", "表名称" 'c二维数组 true 第一行是否为标题行
'a.AddtData e, "Sheet1" '按模板生成 c=array(array("AA1", "内容"), array("AA2", "内容2"))
'a.Create()
'a.UsedTime 生成时间,毫秒数
'a.SavePath 保存路径
'Set a=nothing
'设置COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择MicrosoftExcel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限
'*******************************************************************
Class CreateExcel
Private CreateType_
Private savePath_
Private readPath_
Private AuthorStr Rem 设置作者
Private VersionStr Rem 设置版本
Private SystemStr Rem 设置系统名称
Private SheetName_ Rem 设置表名
Private SheetTitle_ Rem 设置标题
Private ExcelData Rem 设置表数据
Private ExcelApp Rem Excel.Application
Private ExcelBook
Private ExcelSheets
Private UsedTime_ Rem 使用的时间
Public TitleFirstLine Rem 首行是否标题
Private Sub Class_Initialize()
Server.ScriptTimeOut = 99999
UsedTime_ = Timer
SystemStr = "Lc00_CreateExcelServer"
AuthorStr = "Surnfu surnfu@126.com 31333716"
VersionStr = "1.0"
if not IsObjInstalled("Excel.Application") then
InErr("服务器未安装Excel.Application控件")
end if
set ExcelApp = createObject("Excel.Application")
ExcelApp.DisplayAlerts = false
ExcelApp.Application.Visible = false
CreateType_ = 1
readPath_ = null
End Sub
Private Sub Class_Terminate()
ExcelApp.Quit
If Isobject(ExcelSheets) Then Set ExcelSheets = Nothing
If Isobject(ExcelBook) Then Set ExcelBook = Nothing
If Isobject(ExcelApp) Then Set ExcelApp = Nothing
End Sub
Public Property Let ReadPath(ByVal Val)
If Instr(Val, ":\")<>0 Then
readPath_ = Trim(Val)
else
readPath_=Server.MapPath(Trim(Val))
end if
End Property
Public Property Let SavePath(ByVal Val)
If Instr(Val, ":\")<>0 Then
savePath_ = Trim(Val)
else
savePath_=Server.MapPath(Trim(Val))
end if
End Property


Public Property Let CreateType(ByVal Val)
if Val <> 1 and Val <> 2 then
CreateType_ = 1
else
CreateType_ = Val
end if
End Property

Public Property Let Data(ByVal Val)
if not isArray(Val) then
InErr("表数据设置有误")
end if
ExcelData = Val
End Property
Public Property Get SavePath()
SavePath = savePath_
End Property
Public Property Get UsedTime()
UsedTime = UsedTime_
End Property
Public Property Let SheetName(ByVal Val)
if not isArray(Val) then
if Val = "" then
InErr("表名设置有误")
end if
TitleFirstLine = true
else
ReDim TitleFirstLine(Ubound(Val))
Dim ik_
For ik_ = 0 to Ubound(Val)
TitleFirstLine(ik_) = true
Next
end if
SheetName_ = Val
End Property

Public Property Let SheetTitle(ByVal Val)
if not isArray(Val) then
if Val = "" then
InErr("表标题设置有误")
end if
end if
SheetTitle_ = Val
End Property

Rem 检查数据
Private Sub CheckData()
if savePath_ = "" then InErr("保存路径不能为空")
if not isArray(SheetName_) then
if SheetName_ = "" then InErr("表名不能为空")
end if

if CreateType_ = 2 then
if not isArray(ExcelData) then
InErr("数据载入错误,或者未载入")
end if
Exit Sub
end if

if isArray(SheetName_) then
if not isArray(SheetTitle_) then
if SheetTitle_ <> "" then InErr("表标题设置有误,与表名不对应")
end if
end if
if not IsArray(ExcelData) then
InErr("表数据载入有误")
end if
if isArray(SheetName_) then
if GetArrayDim(ExcelData) <> 1 then InErr("表数据载入有误,数据格式错误,维度应该为一")
else
if GetArrayDim(ExcelData) <> 2 then InErr("表数据载入有误,数据格式错误,维度应该为二")
end if
End Sub
Rem 生成Excel
Public Function Create()
Call CheckData()
if not isnull(readPath_) then
ExcelApp.WorkBooks.Open(readPath_)
else
ExcelApp.WorkBooks.add
end if

set ExcelBook = ExcelApp.ActiveWorkBook
set ExcelSheets = ExcelBook.Worksheets

if CreateType_ = 2 then
Dim ih_
For ih_ = 0 to Ubound(ExcelData)
Call SetSheets(ExcelData(ih_), ih_)
Next
ExcelBook.SaveAs savePath_
UsedTime_ = FormatNumber((Timer - UsedTime_)*1000, 3)
Exit Function
end if

if IsArray(SheetName_) then
Dim ik_
For ik_ = 0 to Ubound(ExcelData)
Call CreateSheets(ExcelData(ik_), ik_)
Next
else
Call CreateSheets(ExcelData, -1)
end if

ExcelBook.SaveAs savePath_
UsedTime_ = FormatNumber((Timer - UsedTime_)*1000, 3)
End Function
Private Sub CreateSheets(ByVal Data_, DataId_)
Dim Spreadsheet
Dim tempSheetTitle
Dim tempTitleFirstLine
if DataId_<>-1 then
if DataId_ > ExcelSheets.Count - 1 then
ExcelSheets.Add()
set Spreadsheet = ExcelBook.Sheets(1)
else
set Spreadsheet = ExcelBook.Sheets(DataId_ + 1)
end if
if isArray(SheetTitle_) then
tempSheetTitle = SheetTitle_(DataId_)
else
tempSheetTitle = ""
end if
tempTitleFirstLine = TitleFirstLine(DataId_)
Spreadsheet.Name = SheetName_(DataId_)
else
set Spreadsheet = ExcelBook.Sheets(1)
Spreadsheet.Name = SheetName_
tempSheetTitle = SheetTitle_
tempTitleFirstLine = TitleFirstLine
end if
Dim Line_ : Line_ = 1
Dim RowNum_ : RowNum_ = Ubound(Data_, 1) + 1
Dim LastCols_
if tempSheetTitle <> "" then
'Spreadsheet.Columns(1).ShrinkToFit=true '设定是否自动适应表格单元大小(单元格宽不变)
LastCols_ = getColName(Ubound(Data_, 2) + 1)
with Spreadsheet.Cells(1, 1)
.value = tempSheetTitle
'设置Excel表里的字体
.Font.Bold = True '单元格字体加粗
.Font.Italic = False '单元格字体倾斜
.Font.Size = 20 '设置单元格字号
.font.name="宋体" '设置单元格字体
'.font.ColorIndex=2 '设置单元格文字的颜色,颜色可以查询,2为白色
End with
with Spreadsheet.Range("A1:"& LastCols_ &"1")
.merge '合并单元格(单元区域)
'.Interior.ColorIndex = 1 '设计单元络背景色
.HorizontalAlignment = 3 '居中
End with
Line_ = 2
RowNum_ = RowNum_ + 1
end if
Dim iRow_, iCol_
Dim dRow_, dCol_
Dim tempLastRange : tempLastRange = getColName(Ubound(Data_, 2)+1) & (RowNum_)

Dim BeginRow : BeginRow = 1
if tempSheetTitle <> "" then BeginRow = BeginRow + 1
if tempTitleFirstLine = true then BeginRow = BeginRow + 1

if BeginRow=1 then
with Spreadsheet.Range("A1:"& tempLastRange)
.Borders.LineStyle = 1
.BorderAround -4119, -4138 '设置外框
.NumberFormatLocal = "@" '文本格式
.Font.Bold = False
.Font.Italic = False
.Font.Size = 10
.ShrinkToFit=true
end with
else
with Spreadsheet.Range("A1:"& tempLastRange)
.Borders.LineStyle = 1
.BorderAround -4119, -4138
.ShrinkToFit=true
end with

with Spreadsheet.Range("A"& BeginRow &":"& tempLastRange)
.NumberFormatLocal = "@"
.Font.Bold = False
.Font.Italic = False
.Font.Size = 10
end with
end if

if tempTitleFirstLine = true then
BeginRow = 1
if tempSheetTitle <> "" then BeginRow = BeginRow + 1

with Spreadsheet.Range("A"& BeginRow &":"& getColName(Ubound(Data_, 2)+1) & (BeginRow))
.NumberFormatLocal = "@"
.Font.Bold = True
.Font.Italic = False
.Font.Size = 12
.Interior.ColorIndex = 37
.HorizontalAlignment = 3 '居中
.font.ColorIndex=2
end with
end if

For iRow_ = Line_ To RowNum_
For iCol_ = 1 To (Ubound(Data_, 2) + 1)
dCol_ = iCol_ - 1
if tempSheetTitle <> "" then dRow_ = iRow_ - 2 else dRow_ = iRow_ - 1
If not IsNull(Data_(dRow_, dCol_)) then
with Spreadsheet.Cells(iRow_, iCol_)
.Value = Data_(dRow_, dCol_)
End with
End If
Next
Next
set Spreadsheet = Nothing
End Sub
Rem 测试组件是否已经安装
Private Function IsObjInstalled(strClassString)
On Error Resume Next
IsObjInstalled = False
Err = 0
Dim xTestObj
Set xTestObj = Server.CreateObject(strClassString)
If 0 = Err Then IsObjInstalled = True
Set xTestObj = Nothing
Err = 0
End Function
Rem 取得数组维数
Private Function GetArrayDim(ByVal arr)
GetArrayDim = Null
Dim i_, temp
If IsArray(arr) Then
For i_ = 1 To 60
On Error Resume Next
temp = UBound(arr, i_)
If Err.Number <> 0 Then
GetArrayDim = i_ - 1
Err.Clear
Exit Function
End If
Next
GetArrayDim = i_
End If
End Function
Private Function GetNumFormatLocal(DataType)
Select Case DataType
Case "Currency":
GetNumFormatLocal = "¥#,##0.00_);(¥#,##0.00)"
Case "Time":
GetNumFormatLocal = "[$-F800]dddd, mmmm dd, yyyy"
Case "Char":
GetNumFormatLocal = "@"
Case "Common":
GetNumFormatLocal = "G/通用格式"
Case "Number":
GetNumFormatLocal = "#,##0.00_"
Case else :
GetNumFormatLocal = "@"
End Select
End Function
Public Sub AddDBData(ByVal RsFlied, ByVal FliedTitle, ByVal tempSheetName_, ByVal tempSheetTitle_, DBTitle)
if RsFlied.Eof then Exit Sub
Dim colNum_ : colNum_ = RsFlied.fields.count
Dim Rownum_ : Rownum_ = RsFlied.RecordCount
Dim ArrFliedTitle

if DBTitle = true then
FliedTitle = ""
Dim ig_
For ig_=0 to colNum_ - 1
FliedTitle = FliedTitle & RsFlied.fields.item(ig_).name
if ig_ <> colNum_ - 1 then FliedTitle = FliedTitle &","
Next
end if

if FliedTitle<>"" then
Rownum_ = Rownum_ + 1
ArrFliedTitle = Split(FliedTitle, ",")
if Ubound(ArrFliedTitle) <> colNum_ - 1 then
InErr("获取数据库表有误,列数不符")
end if
end if
Dim tempData : ReDim tempData(Rownum_ - 1, colNum_ - 1)

Dim ix_, iy_
Dim iz
if FliedTitle<>"" then iz = Rownum_ - 2 else iz = Rownum_ - 1

For ix_ = 0 To iz
For iy_ = 0 To colNum_ - 1
if FliedTitle<>"" then
if ix_=0 then
tempData(ix_, iy_) = ArrFliedTitle(iy_)
tempData(ix_ + 1, iy_) = RsFlied(iy_)
else
tempData(ix_ + 1, iy_) = RsFlied(iy_)
end if
else
tempData(ix_, iy_) = RsFlied(iy_)
end if
Next
RsFlied.MoveNext
Next

Dim tempFirstLine
if FliedTitle<>"" then tempFirstLine = true else tempFirstLine = false
Call AddData(tempData, tempFirstLine, tempSheetName_, tempSheetTitle_)
End Sub
Public Sub AddData(ByVal tempDate_, ByVal tempFirstLine_, ByVal tempSheetName_, ByVal tempSheetTitle_)
if not isArray(ExcelData) then
ExcelData = tempDate_
TitleFirstLine = tempFirstLine_
SheetName_ = tempSheetName_
SheetTitle_ = tempSheetTitle_
else
if GetArrayDim(ExcelData) = 1 then
Dim tempArrLen : tempArrLen = Ubound(ExcelData)+1
ReDim Preserve ExcelData(tempArrLen)
ExcelData(tempArrLen) = tempDate_
ReDim Preserve TitleFirstLine(tempArrLen)
TitleFirstLine(tempArrLen) = tempFirstLine_
ReDim Preserve SheetName_(tempArrLen)
SheetName_(tempArrLen) = tempSheetName_
ReDim Preserve SheetTitle_(tempArrLen)
SheetTitle_(tempArrLen) = tempSheetTitle_
else
Dim tempOldData : tempOldData = ExcelData
ExcelData = Array(tempOldData, tempDate_)
TitleFirstLine = Array(TitleFirstLine, tempFirstLine_)
SheetName_ = Array(SheetName_, tempSheetName_)
SheetTitle_ = Array(SheetTitle_, tempSheetTitle_)
end if
end if
End Sub
Rem 模板增加数据方法
Public Sub AddtData(ByVal tempDate_, ByVal tempSheetName_)
CreateType_ = 2
if not isArray(ExcelData) then
ExcelData = Array(tempDate_)
SheetName_ = Array(tempSheetName_)
else
Dim tempArrLen : tempArrLen = Ubound(ExcelData)+1
ReDim Preserve ExcelData(tempArrLen)
ExcelData(tempArrLen) = tempDate_
ReDim Preserve SheetName_(tempArrLen)
SheetName_(tempArrLen) = tempSheetName_
End if
End Sub
Private Sub SetSheets(ByVal Data_, DataId_)
Dim Spreadsheet
set Spreadsheet = ExcelBook.Sheets(SheetName_(DataId_))
Spreadsheet.Activate
Dim ix_
For ix_ =0 To Ubound(Data_)
if not isArray(Data_(ix_)) then InErr("表数据载入有误,数据格式错误")
if Ubound(Data_(ix_)) <> 1 then InErr("表数据载入有误,数据格式错误")
Spreadsheet.Range(Data_(ix_)(0)).value = Data_(ix_)(1)
Next
set Spreadsheet = Nothing
End Sub
Public Function GetTime(msec_)
Dim ReTime_ : ReTime_=""
if msec_ < 1000 then
ReTime_ = msec_ &"MS"
else
Dim second_
second_ = (msec_ \ 1000)
if (msec_ mod 1000)<>0 then
msec_ = (msec_ mod 1000) &"毫秒"
else
msec_ = ""
end if
Dim n_, aryTime(2), aryTimeunit(2)
aryTimeunit(0) = "秒"
aryTimeunit(1) = "分"
aryTimeunit(2) = "小时"
n_ = 0
Dim tempSecond_ : tempSecond_ = second_
While(tempSecond_ / 60 >= 1)
tempSecond_ = Fix(tempSecond_ / 60 * 100) / 100
n_ = n_ + 1
WEnd
Dim m_
For m_ = n_ To 0 Step -1
aryTime(m_) = second_ \ (60 ^ m_)
second_ = second_ mod (60 ^ m_)
ReTime_ = ReTime_ & aryTime(m_) & aryTimeunit(m_)
Next
if msec_<>"" then ReTime_ = ReTime_ & msec_
end if
GetTime = ReTime_
end Function
Rem 取得列名
Private Function getColName(ByVal ColNum)
Dim Arrlitter : Arrlitter=split("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", " ")
Dim ReValue_
if ColNum <= Ubound(Arrlitter) + 1 then
ReValue_ = Arrlitter(ColNum - 1)
else
ReValue_ = Arrlitter(((ColNum-1) \ 26)) & Arrlitter(((ColNum-1) mod 26))
end if
getColName = ReValue_
End Function
Rem 设置错误
Private Sub InErr(ErrInfo)
Err.Raise vbObjectError + 1, SystemStr &"(Version "& VersionStr &")", ErrInfo
End Sub
End Class
Dim b(4,6)
Dim c(50,20)
Dim i, j
For i=0 to 4
For j=0 to 6
b(i,j) =i&"-"&j
Next
Next
For i=0 to 50
For j=0 to 20
c(i,j) = i&"-"&j &"我的"
Next
Next
Dim e(20)
For i=0 to 20
e(i)= array("A"&(i+1), i+1)
Next
'使用示例 需要xx.xls模板支持
'Set a=new CreateExcel
'a.ReadPath = "xx.xls"
'a.SavePath="xx-1.xls"
'a.AddtData e, "Sheet1"
'a.Create()
'response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"<br>")
'Set a=nothing
'使用示例一
Set a=new CreateExcel
a.SavePath="x.xls"
a.AddData b, true , "测试c", "测试c"
a.TitleFirstLine = false '首行是否为标题行
a.Create()
response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"<br>")
Set a=nothing
'使用示例二
Set a=new CreateExcel
a.SavePath="y.xls"
a.SheetName="工作簿名称" '多个工作表 a.SheetName=array("工作簿名称一","工作簿名称二")
a.SheetTitle="表名称" '可以为空 多个工作表 a.SheetName=array("表名称一","表名称二")
a.Data =b '二维数组 '多个工作表 array(b,c) b与c为二维数组
a.Create()
response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"<br>")
Set a=nothing
'使用示例三 生成两个表
Set a=new CreateExcel
a.SavePath="z.xls"
a.SheetName=array("工作簿名称一","工作簿名称二")
a.SheetTitle=array("表名称一","表名称二")
a.Data =array(b, c) 'b与c为二维数组
a.TitleFirstLine = array(false, true) '首行是否为标题行
a.Create()
response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"<br>")
Set a=nothing
'使用示例四 需要数据库支持
'Dim rs
'Set rs=server.CreateObject("Adodb.RecordSet")
'rs.open "Select id, classid, className from [class] ",conn, 1, 1
'Set a=new CreateExcel
'a.SavePath="a"
'a.AddDBData rs, "序号,类别序号,类别名称", "工作簿名称", "类别表", false
'a.Create()
'response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"<br>")
'Set a=nothing
'rs.close
'Set rs=nothing
%>  <%

  '*******************************************************************

  '使用说明

  'Dim a

  'Set a=new CreateExcel

  'a.SavePath="x" '保存路径

  'a.SheetName="工作簿名称" '多个工作表 a.SheetName=array("工作簿名称一","工作簿名称二")

  'a.SheetTitle="表名称" '可以为空 多个工作表 a.SheetName=array("表名称一","表名称二")

  'a.Data =d '二维数组 '多个工作表 array(b,c) b与c为二维数组

  'Dim rs

  'Set rs=server.CreateObject("Adodb.RecordSet")

  'rs.open "Select id, classid, className from [class] ",conn, 1, 1

  'a.AddDBData rs, "字段名一,字段名二", "工作簿名称", "表名称", true 'true自动获取表字段名

  'a.AddData c, true , "工作簿名称", "表名称" 'c二维数组 true 第一行是否为标题行

  'a.AddtData e, "Sheet1" '按模板生成 c=array(array("AA1", "内容"), array("AA2", "内容2"))

  'a.Create()

  'a.UsedTime 生成时间,毫秒数

  'a.SavePath 保存路径

  'Set a=nothing

  '设置COM组件的操作权限。在命令行键入“DCOMCNFG”,则进入COM组件配置界面,选择MicrosoftExcel后点击属性按钮,将三个单选项一律选择自定义,编辑中将Everyone加入所有权限

  '*******************************************************************

  Class CreateExcel

  Private CreateType_

  Private savePath_

  Private readPath_

  Private AuthorStr Rem 设置作者

  Private VersionStr Rem 设置版本

  Private SystemStr Rem 设置系统名称

  Private SheetName_ Rem 设置表名

  Private SheetTitle_ Rem 设置标题

  Private ExcelData Rem 设置表数据

  Private ExcelApp Rem Excel.Application

  Private ExcelBook

  Private ExcelSheets

  Private UsedTime_ Rem 使用的时间

  Public TitleFirstLine Rem 首行是否标题

  Private Sub Class_Initialize()

  Server.ScriptTimeOut = 99999

  UsedTime_ = Timer

  SystemStr = "Lc00_CreateExcelServer"

  AuthorStr = "Surnfu surnfu@126.com 31333716"

  VersionStr = "1.0"

  if not IsObjInstalled("Excel.Application") then

  InErr("服务器未安装Excel.Application控件")

  end if

  set ExcelApp = createObject("Excel.Application")

  ExcelApp.DisplayAlerts = false

  ExcelApp.Application.Visible = false

  CreateType_ = 1

  readPath_ = null

  End Sub

  Private Sub Class_Terminate()

  ExcelApp.Quit

  If Isobject(ExcelSheets) Then Set ExcelSheets = Nothing

  If Isobject(ExcelBook) Then Set ExcelBook = Nothing

  If Isobject(ExcelApp) Then Set ExcelApp = Nothing

  End Sub

  Public Property Let ReadPath(ByVal Val)

  If Instr(Val, ":\")<>0 Then

  readPath_ = Trim(Val)

  else

  readPath_=Server.MapPath(Trim(Val))

  end if

  End Property

  Public Property Let SavePath(ByVal Val)

  If Instr(Val, ":\")<>0 Then

  savePath_ = Trim(Val)

  else

  savePath_=Server.MapPath(Trim(Val))

  end if

  End Property

  Public Property Let CreateType(ByVal Val)

  if Val <> 1 and Val <> 2 then

  CreateType_ = 1

  else

  CreateType_ = Val

  end if

  End Property

  Public Property Let Data(ByVal Val)

  if not isArray(Val) then

  InErr("表数据设置有误")

  end if

  ExcelData = Val

  End Property

  Public Property Get SavePath()

  SavePath = savePath_

  End Property

  Public Property Get UsedTime()

  UsedTime = UsedTime_

  End Property

  Public Property Let SheetName(ByVal Val)

  if not isArray(Val) then

  if Val = "" then

  InErr("表名设置有误")

  end if

  TitleFirstLine = true

  else

  ReDim TitleFirstLine(Ubound(Val))

  Dim ik_

  For ik_ = 0 to Ubound(Val)

  TitleFirstLine(ik_) = true

  Next

  end if

  SheetName_ = Val

  End Property

  Public Property Let SheetTitle(ByVal Val)

  if not isArray(Val) then

  if Val = "" then

  InErr("表标题设置有误")

  end if

  end if

  SheetTitle_ = Val

  End Property

  Rem 检查数据

  Private Sub CheckData()

  if savePath_ = "" then InErr("保存路径不能为空")

  if not isArray(SheetName_) then

  if SheetName_ = "" then InErr("表名不能为空")

  end if

  if CreateType_ = 2 then

  if not isArray(ExcelData) then

  InErr("数据载入错误,或者未载入")

  end if

  Exit Sub

  end if

  if isArray(SheetName_) then

  if not isArray(SheetTitle_) then

  if SheetTitle_ <> "" then InErr("表标题设置有误,与表名不对应")

  end if

  end if

  if not IsArray(ExcelData) then

  InErr("表数据载入有误")

  end if

  if isArray(SheetName_) then

  if GetArrayDim(ExcelData) <> 1 then InErr("表数据载入有误,数据格式错误,维度应该为一")

  else

  if GetArrayDim(ExcelData) <> 2 then InErr("表数据载入有误,数据格式错误,维度应该为二")

  end if

  End Sub

  Rem 生成Excel

  Public Function Create()

  Call CheckData()

  if not isnull(readPath_) then

  ExcelApp.WorkBooks.Open(readPath_)

  else

  ExcelApp.WorkBooks.add

  end if

  set ExcelBook = ExcelApp.ActiveWorkBook

  set ExcelSheets = ExcelBook.Worksheets

  if CreateType_ = 2 then

  Dim ih_

  For ih_ = 0 to Ubound(ExcelData)

  Call SetSheets(ExcelData(ih_), ih_)

  Next

  ExcelBook.SaveAs savePath_

  UsedTime_ = FormatNumber((Timer - UsedTime_)*1000, 3)

  Exit Function

  end if

  if IsArray(SheetName_) then

  Dim ik_

  For ik_ = 0 to Ubound(ExcelData)

  Call CreateSheets(ExcelData(ik_), ik_)

  Next

  else

  Call CreateSheets(ExcelData, -1)

  end if

  ExcelBook.SaveAs savePath_

  UsedTime_ = FormatNumber((Timer - UsedTime_)*1000, 3)

  End Function

  Private Sub CreateSheets(ByVal Data_, DataId_)

  Dim Spreadsheet

  Dim tempSheetTitle

  Dim tempTitleFirstLine

  if DataId_<>-1 then

  if DataId_ > ExcelSheets.Count - 1 then

  ExcelSheets.Add()

  set Spreadsheet = ExcelBook.Sheets(1)

  else

  set Spreadsheet = ExcelBook.Sheets(DataId_ + 1)

  end if

  if isArray(SheetTitle_) then

  tempSheetTitle = SheetTitle_(DataId_)

  else

  tempSheetTitle = ""

  end if

  tempTitleFirstLine = TitleFirstLine(DataId_)

  Spreadsheet.Name = SheetName_(DataId_)

  else

  set Spreadsheet = ExcelBook.Sheets(1)

  Spreadsheet.Name = SheetName_

  tempSheetTitle = SheetTitle_

  tempTitleFirstLine = TitleFirstLine

  end if

  Dim Line_ : Line_ = 1

  Dim RowNum_ : RowNum_ = Ubound(Data_, 1) + 1

  Dim LastCols_

  if tempSheetTitle <> "" then

  'Spreadsheet.Columns(1).ShrinkToFit=true '设定是否自动适应表格单元大小(单元格宽不变)

  LastCols_ = getColName(Ubound(Data_, 2) + 1)

  with Spreadsheet.Cells(1, 1)

  .value = tempSheetTitle

  '设置Excel表里的字体

  .Font.Bold = True '单元格字体加粗

  .Font.Italic = False '单元格字体倾斜

  .Font.Size = 20 '设置单元格字号

  .font.name="宋体" '设置单元格字体

  '.font.ColorIndex=2 '设置单元格文字的颜色,颜色可以查询,2为白色

  End with

  with Spreadsheet.Range("A1:"& LastCols_ &"1")

  .merge '合并单元格(单元区域)

  '.Interior.ColorIndex = 1 '设计单元络背景色

  .HorizontalAlignment = 3 '居中

  End with

  Line_ = 2

  RowNum_ = RowNum_ + 1

  end if

  Dim iRow_, iCol_

  Dim dRow_, dCol_

  Dim tempLastRange : tempLastRange = getColName(Ubound(Data_, 2)+1) & (RowNum_)

  Dim BeginRow : BeginRow = 1

  if tempSheetTitle <> "" then BeginRow = BeginRow + 1

  if tempTitleFirstLine = true then BeginRow = BeginRow + 1

  if BeginRow=1 then

  with Spreadsheet.Range("A1:"& tempLastRange)

  .Borders.LineStyle = 1

  .BorderAround -4119, -4138 '设置外框

  .NumberFormatLocal = "@" '文本格式

  .Font.Bold = False

  .Font.Italic = False

  .Font.Size = 10

  .ShrinkToFit=true

  end with

  else

  with Spreadsheet.Range("A1:"& tempLastRange)

  .Borders.LineStyle = 1

  .BorderAround -4119, -4138

  .ShrinkToFit=true

  end with

  with Spreadsheet.Range("A"& BeginRow &":"& tempLastRange)

  .NumberFormatLocal = "@"

  .Font.Bold = False

  .Font.Italic = False

  .Font.Size = 10

  end with

  end if

  if tempTitleFirstLine = true then

  BeginRow = 1

  if tempSheetTitle <> "" then BeginRow = BeginRow + 1

  with Spreadsheet.Range("A"& BeginRow &":"& getColName(Ubound(Data_, 2)+1) & (BeginRow))

  .NumberFormatLocal = "@"

  .Font.Bold = True

  .Font.Italic = False

  .Font.Size = 12

  .Interior.ColorIndex = 37

  .HorizontalAlignment = 3 '居中

  .font.ColorIndex=2

  end with

  end if

  For iRow_ = Line_ To RowNum_

  For iCol_ = 1 To (Ubound(Data_, 2) + 1)

  dCol_ = iCol_ - 1

  if tempSheetTitle <> "" then dRow_ = iRow_ - 2 else dRow_ = iRow_ - 1

  If not IsNull(Data_(dRow_, dCol_)) then

  with Spreadsheet.Cells(iRow_, iCol_)

  .Value = Data_(dRow_, dCol_)

  End with

  End If

  Next

  Next

  set Spreadsheet = Nothing

  End Sub

  Rem 测试组件是否已经安装

  Private Function IsObjInstalled(strClassString)

  On Error Resume Next

  IsObjInstalled = False

  Err = 0

  Dim xTestObj

  Set xTestObj = Server.CreateObject(strClassString)

  If 0 = Err Then IsObjInstalled = True

  Set xTestObj = Nothing

  Err = 0

  End Function

  Rem 取得数组维数

  Private Function GetArrayDim(ByVal arr)

  GetArrayDim = Null

  Dim i_, temp

  If IsArray(arr) Then

  For i_ = 1 To 60

  On Error Resume Next

  temp = UBound(arr, i_)

  If Err.Number <> 0 Then

  GetArrayDim = i_ - 1

  Err.Clear

  Exit Function

  End If

  Next

  GetArrayDim = i_

  End If

  End Function

  Private Function GetNumFormatLocal(DataType)

  Select Case DataType

  Case "Currency":

  GetNumFormatLocal = "¥#,##0.00_);(¥#,##0.00)"

  Case "Time":

  GetNumFormatLocal = "[$-F800]dddd, mmmm dd, yyyy"

  Case "Char":

  GetNumFormatLocal = "@"

  Case "Common":

  GetNumFormatLocal = "G/通用格式"

  Case "Number":

  GetNumFormatLocal = "#,##0.00_"

  Case else :

  GetNumFormatLocal = "@"

  End Select

  End Function

  Public Sub AddDBData(ByVal RsFlied, ByVal FliedTitle, ByVal tempSheetName_, ByVal tempSheetTitle_, DBTitle)

  if RsFlied.Eof then Exit Sub

  Dim colNum_ : colNum_ = RsFlied.fields.count

  Dim Rownum_ : Rownum_ = RsFlied.RecordCount

  Dim ArrFliedTitle

  if DBTitle = true then

  FliedTitle = ""

  Dim ig_

  For ig_=0 to colNum_ - 1

  FliedTitle = FliedTitle & RsFlied.fields.item(ig_).name

  if ig_ <> colNum_ - 1 then FliedTitle = FliedTitle &","

  Next

  end if

  if FliedTitle<>"" then

  Rownum_ = Rownum_ + 1

  ArrFliedTitle = Split(FliedTitle, ",")

  if Ubound(ArrFliedTitle) <> colNum_ - 1 then

  InErr("获取数据库表有误,列数不符")

  end if

  end if

  Dim tempData : ReDim tempData(Rownum_ - 1, colNum_ - 1)

  Dim ix_, iy_

  Dim iz

  if FliedTitle<>"" then iz = Rownum_ - 2 else iz = Rownum_ - 1

  For ix_ = 0 To iz

  For iy_ = 0 To colNum_ - 1

  if FliedTitle<>"" then

  if ix_=0 then

  tempData(ix_, iy_) = ArrFliedTitle(iy_)

  tempData(ix_ + 1, iy_) = RsFlied(iy_)

  else

  tempData(ix_ + 1, iy_) = RsFlied(iy_)

  end if

  else

  tempData(ix_, iy_) = RsFlied(iy_)

  end if

  Next

  RsFlied.MoveNext

  Next

  Dim tempFirstLine

  if FliedTitle<>"" then tempFirstLine = true else tempFirstLine = false

  Call AddData(tempData, tempFirstLine, tempSheetName_, tempSheetTitle_)

  End Sub

  Public Sub AddData(ByVal tempDate_, ByVal tempFirstLine_, ByVal tempSheetName_, ByVal tempSheetTitle_)

  if not isArray(ExcelData) then

  ExcelData = tempDate_

  TitleFirstLine = tempFirstLine_

  SheetName_ = tempSheetName_

  SheetTitle_ = tempSheetTitle_

  else

  if GetArrayDim(ExcelData) = 1 then

  Dim tempArrLen : tempArrLen = Ubound(ExcelData)+1

  ReDim Preserve ExcelData(tempArrLen)

  ExcelData(tempArrLen) = tempDate_

  ReDim Preserve TitleFirstLine(tempArrLen)

  TitleFirstLine(tempArrLen) = tempFirstLine_

  ReDim Preserve SheetName_(tempArrLen)

  SheetName_(tempArrLen) = tempSheetName_

  ReDim Preserve SheetTitle_(tempArrLen)

  SheetTitle_(tempArrLen) = tempSheetTitle_

  else

  Dim tempOldData : tempOldData = ExcelData

  ExcelData = Array(tempOldData, tempDate_)

  TitleFirstLine = Array(TitleFirstLine, tempFirstLine_)

  SheetName_ = Array(SheetName_, tempSheetName_)

  SheetTitle_ = Array(SheetTitle_, tempSheetTitle_)

  end if

  end if

  End Sub

  Rem 模板增加数据方法

  Public Sub AddtData(ByVal tempDate_, ByVal tempSheetName_)

  CreateType_ = 2

  if not isArray(ExcelData) then

  ExcelData = Array(tempDate_)

  SheetName_ = Array(tempSheetName_)

  else

  Dim tempArrLen : tempArrLen = Ubound(ExcelData)+1

  ReDim Preserve ExcelData(tempArrLen)

  ExcelData(tempArrLen) = tempDate_

  ReDim Preserve SheetName_(tempArrLen)

  SheetName_(tempArrLen) = tempSheetName_

  End if

  End Sub

  Private Sub SetSheets(ByVal Data_, DataId_)

  Dim Spreadsheet

  set Spreadsheet = ExcelBook.Sheets(SheetName_(DataId_))

  Spreadsheet.Activate

  Dim ix_

  For ix_ =0 To Ubound(Data_)

  if not isArray(Data_(ix_)) then InErr("表数据载入有误,数据格式错误")

  if Ubound(Data_(ix_)) <> 1 then InErr("表数据载入有误,数据格式错误")

  Spreadsheet.Range(Data_(ix_)(0)).value = Data_(ix_)(1)

  Next

  set Spreadsheet = Nothing

  End Sub

  Public Function GetTime(msec_)

  Dim ReTime_ : ReTime_=""

  if msec_ < 1000 then

  ReTime_ = msec_ &"MS"

  else

  Dim second_

  second_ = (msec_ \ 1000)

  if (msec_ mod 1000)<>0 then

  msec_ = (msec_ mod 1000) &"毫秒"

  else

  msec_ = ""

  end if

  Dim n_, aryTime(2), aryTimeunit(2)

  aryTimeunit(0) = "秒"

  aryTimeunit(1) = "分"

  aryTimeunit(2) = "小时"

  n_ = 0

  Dim tempSecond_ : tempSecond_ = second_

  While(tempSecond_ / 60 >= 1)

  tempSecond_ = Fix(tempSecond_ / 60 * 100) / 100

  n_ = n_ + 1

  WEnd

  Dim m_

  For m_ = n_ To 0 Step -1

  aryTime(m_) = second_ \ (60 ^ m_)

  second_ = second_ mod (60 ^ m_)

  ReTime_ = ReTime_ & aryTime(m_) & aryTimeunit(m_)

  Next

  if msec_<>"" then ReTime_ = ReTime_ & msec_

  end if

  GetTime = ReTime_

  end Function

  Rem 取得列名

  Private Function getColName(ByVal ColNum)

  Dim Arrlitter : Arrlitter=split("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z", " ")

  Dim ReValue_

  if ColNum <= Ubound(Arrlitter) + 1 then

  ReValue_ = Arrlitter(ColNum - 1)

  else

  ReValue_ = Arrlitter(((ColNum-1) \ 26)) & Arrlitter(((ColNum-1) mod 26))

  end if

  getColName = ReValue_

  End Function

  Rem 设置错误

  Private Sub InErr(ErrInfo)

  Err.Raise vbObjectError + 1, SystemStr &"(Version "& VersionStr &")", ErrInfo

  End Sub

  End Class

  Dim b(4,6)

  Dim c(50,20)

  Dim i, j

  For i=0 to 4

  For j=0 to 6

  b(i,j) =i&"-"&j

  Next

  Next

  For i=0 to 50

  For j=0 to 20

  c(i,j) = i&"-"&j &"我的"

  Next

  Next

  Dim e(20)

  For i=0 to 20

  e(i)= array("A"&(i+1), i+1)

  Next

  '使用示例 需要xx.xls模板支持

  'Set a=new CreateExcel

  'a.ReadPath = "xx.xls"

  'a.SavePath="xx-1.xls"

  'a.AddtData e, "Sheet1"

  'a.Create()

  'response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"
")

  'Set a=nothing

  '使用示例一

  Set a=new CreateExcel

  a.SavePath="x.xls"

  a.AddData b, true , "测试c", "测试c"

  a.TitleFirstLine = false '首行是否为标题行

  a.Create()

  response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"
")

  Set a=nothing

  '使用示例二

  Set a=new CreateExcel

  a.SavePath="y.xls"

  a.SheetName="工作簿名称" '多个工作表 a.SheetName=array("工作簿名称一","工作簿名称二")

  a.SheetTitle="表名称" '可以为空 多个工作表 a.SheetName=array("表名称一","表名称二")

  a.Data =b '二维数组 '多个工作表 array(b,c) b与c为二维数组

  a.Create()

  response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"
")

  Set a=nothing

  '使用示例三 生成两个表

  Set a=new CreateExcel

  a.SavePath="z.xls"

  a.SheetName=array("工作簿名称一","工作簿名称二")

  a.SheetTitle=array("表名称一","表名称二")

  a.Data =array(b, c) 'b与c为二维数组

  a.TitleFirstLine = array(false, true) '首行是否为标题行

  a.Create()

  response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"
")

  Set a=nothing

  '使用示例四 需要数据库支持

  'Dim rs

  'Set rs=server.CreateObject("Adodb.RecordSet")

  'rs.open "Select id, classid, className from [class] ",conn, 1, 1

  'Set a=new CreateExcel

  'a.SavePath="a"

  'a.AddDBData rs, "序号,类别序号,类别名称", "工作簿名称", "类别表", false

  'a.Create()

  'response.Write("生成"& a.SavePath &" 使用了 "& a.GetTime(a.UsedTime) &"
")

  'Set a=nothing

  'rs.close

  'Set rs=nothing

  %>

相关文章

关键词:asp,Excel类,Office,微软技术

责任编辑:valen

专题推荐

原创文章

微博互动

白皮书

All Rights Reserved, Copyright 2004-2013, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i

0 0