WEB开发网
开发学院WEB开发ASP asp操作Excel类 阅读

asp操作Excel类

 2009-07-02 10:41:48 来源:WEB开发网   
核心提示:程序代码<%'***'使用说明'Dim a'Set a=new CreateExcel'a.SavePath="x" '保存路径'a.SheetName="工作簿名称" '多个工作表 a.SheetName=a

程序代码
<%
'***************************************************************************************
'使用说明
'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
     'http://www.devdao.com/
     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
%>

Tags:asp 操作 Excel

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接