`
myangle89
  • 浏览: 97461 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

excel报表开发点滴

阅读更多
这几天公司有个报表开发需求,UI要求也相当高,讨论决定使用excel模版来做报表需求。

报表开发主要使用宏,后端是JAVA调用POI进行隐藏sheet的数据填充,最后执行宏绘制报表。

宏如下:
Sub auto_Open()
    Sheets("i18n").Select
    v = Range("B2").Value
    If v = 0 Then
        TravellerReprot
        Sheets("i18n").Select
        Range("B2").Value = 1
        
        Sheets("Traveller Anlysis Report").Select
        ActiveWorkbook.Save
    End If
    Sheets("Traveller Anlysis Report").Select
End Sub

Rem 差旅人报表数据
Sub TravellerReprot()

    '------------------------常量定义------------------------
    '预留行数
    Const limitNum = 23
    
    '数据开始行数
    Const startNum = 7
    
    'en_US
    Const en_US_TitleMain = "Business Travel Account"
    
    Const en_US_TitleMain2 = "Traveler Analysis Report For 2012-01-01 To 2012-03-01"
    
    Const en_US_AccountName = "Account Name:"
    
    Const en_US_AccountNumber = "Account Number:"
    
    Const en_US_GenerationDate = "Generation Date:"
    
    Const en_US_Traveler = "Traveler"
    
    Const en_US_Class = "Class"
    
    Const en_US_Routing = "Routing"
    
    Const en_US_DeptDate = "Dept Date"
    
    Const en_US_TicketNumber = "Ticket Number"
    
    Const en_US_ValueRMB = "Value RMB"
    
    Const en_US_BottomName = "This is a management information report and is not to be used for accounting purposes"
    
    Const en_US_Page = "Page Number 1 Of 1"
    
    Const en_US_TotalReport = "Report Totals"
    
    'zh_CN
    Const zh_CN_TitleMain = "商务旅行账户"
    
    Const zh_CN_TitleMain2 = "员工差旅分析(2012-01-01 到 20120-03-01)"
    
    Const zh_CN_AccountName = "企业名称:"
    
    Const zh_CN_AccountNumber = "企业编号:"
    
    Const zh_CN_GenerationDate = "报表生成日期:"
    
    Const zh_CN_Traveler = "差旅人"
    
    Const zh_CN_Class = "舱位"
    
    Const zh_CN_Routing = "航程"
    
    Const zh_CN_DeptDate = "起飞/交易日期"
    
    Const zh_CN_TicketNumber = "票号"
    
    Const zh_CN_ValueRMB = "交易金额"
    
    Const zh_CN_BottomName = "这是一个管理信息报告且不被用于会计目的"
    
    Const zh_CN_Page = "第1页 共1页"
    
    Const zh_CN_TotalReport = "报表总计"
    
    '------------------------逻辑处理------------------------
    Application.ScreenUpdating = False
    
    '1.i18n初始化
    Sheets("i18n").Select
    lang = Range("B1").Value
    Debug.Print "语言选择为" & lang
    
    Debug.Print "初始化国际化信息"
    Sheets("Traveller Anlysis Report").Select
    
    If lang = "en_US" Then
        Range("C1").Value = en_US_TitleMain
        Range("B2").Value = en_US_TitleMain2
        Range("A4").Value = en_US_AccountName
        Range("C4").Value = en_US_AccountNumber
        Range("E4").Value = en_US_GenerationDate
        Range("A6").Value = en_US_Traveler
        Range("B6").Value = en_US_Class
        Range("C6").Value = en_US_Routing
        Range("D6").Value = en_US_DeptDate
        Range("E6").Value = en_US_TicketNumber
        Range("F6").Value = en_US_ValueRMB
        Range("B32").Value = en_US_BottomName
        Range("C33").Value = en_US_Page
    Else
        Range("C1").Value = zh_CN_TitleMain
        Range("B2").Value = zh_CN_TitleMain2
        Range("A4").Value = zh_CN_AccountName
        Range("C4").Value = zh_CN_AccountNumber
        Range("E4").Value = zh_CN_GenerationDate
        Range("A6").Value = zh_CN_Traveler
        Range("B6").Value = zh_CN_Class
        Range("C6").Value = zh_CN_Routing
        Range("D6").Value = zh_CN_DeptDate
        Range("E6").Value = zh_CN_TicketNumber
        Range("F6").Value = zh_CN_ValueRMB
        Range("B32").Value = zh_CN_BottomName
        Range("C33").Value = zh_CN_Page
    End If
    
    '2.是否增行判断:有效数据行数与预留行数对比
    Sheets("data").Select
    activeNum = Range("A65536").End(xlUp).Row
    Debug.Print "有效数据行数为" & activeNum
    
    totalTraveller = Range("A" & activeNum).Value
    Debug.Print "差旅人总数为" & totalTraveller
    
    If activeNum > limitNum Then
         Debug.Print "有效数据行数大于预留行数,进行增行操作"
        insertNum = activeNum - limitNum
        
        For num = 1 To insertNum Step 1
            Sheets("Traveller Anlysis Report").Select
            Rows("8:8").Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Next num
        
    End If
    
    '3.数据填充
    Debug.Print "增行判断完毕,进行数据填充"
    
    '当前正在执行的行数
    curNum = startNum
    
    '当前正在执行的差旅人
    Dim curTravelerID As Integer
    
    '标记需要数据条的单元格
    Dim needColor() As String
    Dim colorNum As Integer
    
    '循环填充
    curTravelerID = 1
    colorNum = 1
    ReDim needColor(colorNum To totalTraveller)
    For temp = 1 To activeNum Step 1
        Sheets("data").Select
        travelerID = Range("A" & temp).Value
        
        '3.1差旅人是否和上一次的为同一差旅人
        If curTravelerID = travelerID Then
            isSameTraveler = True
        Else
            isSameTraveler = False
        End If
        curTravelerID = travelerID
        
    
        '3.2判断是否需要添加数据条标记
        If isSameTraveler = False Then
            needColor(colorNum) = "F" & (curNum - 1)
            colorNum = colorNum + 1
        End If
        
        '3.3复制差旅人数据
        Sheets("Traveller Anlysis Report").Select
        
        Range("A" & curNum).FormulaR1C1 = "=data!R[-6]C[1]"
        If Range("A" & curNum) = 0 Then
            Range("A" & curNum).Value = ""
        End If
        
        Range("B" & curNum).FormulaR1C1 = "=data!R[-6]C[1]"
        If Range("B" & curNum) = 0 Then
            Range("B" & curNum).Value = ""
        End If
        
        Range("C" & curNum).FormulaR1C1 = "=data!R[-6]C[1]"
        If Range("C" & curNum) = 0 Then
            Range("C" & curNum).Value = ""
        End If
        
        Range("D" & curNum).FormulaR1C1 = "=data!R[-6]C[1]"
        If Range("D" & curNum) = 0 Then
            Range("D" & curNum).Value = ""
        End If
        
        Range("E" & curNum).FormulaR1C1 = "=data!R[-6]C[1]"
        If Range("E" & curNum) = 0 Then
            Range("E" & curNum).Value = ""
        End If
        
        Range("F" & curNum).FormulaR1C1 = "=data!R[-6]C[1]"
        
        '3.4当前行+1,进入下次循环
        curNum = curNum + 1
    Next temp
    
    '3.5有效数据行的最后一行的最后一列加入needColor
    needColor(colorNum) = "F" & (curNum - 1)
    
    '4.设置样式表
    '需要设置的单元格
    Dim colorBarCells As String
    '单元格的总和
    Dim colorBarCellsSum As Long
    For i = 1 To UBound(needColor)
        colorBarCells = colorBarCells + needColor(i) + ","
        colorBarCellsSum = colorBarCellsSum + Range(needColor(i)).Value
    Next i
    
    colorBarCells = Mid(colorBarCells, 1, Len(colorBarCells) - 1)
    Debug.Print "待添加渐变单元格:" & colorBarCells
    Debug.Print "待添加渐变单元格的总和:" & colorBarCellsSum
    
    Sheets("Traveller Anlysis Report").Select
    Range(colorBarCells).Select
    Selection.FormatConditions.AddDatabar
    Selection.FormatConditions(Selection.FormatConditions.Count).ShowValue = True
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    'With Selection.FormatConditions(1)
    '    .MinPoint.Modify newtype:=xlConditionValueLowestValue
   '     .MaxPoint.Modify newtype:=xlConditionValueHighestValue
   ' End With
    With Selection.FormatConditions(1).BarColor
        .Color = 8700771
        .TintAndShade = 0
    End With
    
    '5.设置统计栏
    Sheets("Traveller Anlysis Report").Select
    
    Range("A" & curNum).Select
    If lang = "en_US" Then
        Range("A" & curNum) = en_US_TotalReport
    Else
        Range("A" & curNum) = zh_CN_TotalReport
    End If
    Selection.Font.Bold = True
    
    Range("F" & curNum).Select
    Range("F" & curNum) = colorBarCellsSum
    Selection.Font.Bold = True
    
    Range("A" & curNum & ":" & "F" & curNum).Select
    Selection.Borders(xlDiagonalDown).LineStyle = xlNone
    Selection.Borders(xlDiagonalUp).LineStyle = xlNone
    Selection.Borders(xlEdgeLeft).LineStyle = xlNone
    With Selection.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .ColorIndex = 0
        .TintAndShade = 0
        .Weight = xlThin
    End With
    Selection.Borders(xlEdgeBottom).LineStyle = xlNone
    Selection.Borders(xlEdgeRight).LineStyle = xlNone
    Selection.Borders(xlInsideVertical).LineStyle = xlNone
    Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
    
    Range("A65000").Select
    Application.ScreenUpdating = True
     
End Sub


特别注意的是注释那段,当关闭excel后会报告excel格式错误问题,但手动操作的没问题,非常怪异,特此标记一下。

VBA代码可以进一步进行优化,不过在那里面写真的是没eclipse方便...
另外经常写到循环或者判断的时候,打进去的代码居然是JAVA代码,悲催啊...
丫的,突然想起来这货不是JAVA啊~~~
  • 大小: 182.1 KB
分享到:
评论

相关推荐

    自动点滴管理系统

    在.NET 3.5框架下,开发者可以利用C#编程语言,结合ASP.NET技术来开发Web应用程序,这在本系统中起到了关键作用。ASP.NET提供了丰富的服务器控件和事件模型,使得构建动态网页变得更加容易。它还支持多种数据绑定...

    Eclipse SWT开发点滴

    ### Eclipse SWT开发点滴 #### 一、第三方包的引用 在使用Eclipse进行SWT开发时,经常会遇到需要引入第三方库的情况。以下是引入第三方库的具体步骤: 1. **工程项目增加Libraries** - 右键点击项目 -> `Build ...

    Business Objects 以及reporting service报表点滴

    学习 Business Objects ,以及 reporting service 的笔记。

    EXCEL+ACCESS工作管理系统 最终版更新七 功能增强完成-全文检索算法并附PPT(BI报表+数据库+全文检索)

    在本资源中,"EXCEL+ACCESS工作管理系统 最终版更新七 功能增强完成-全文检索算法并附PPT(BI报表+数据库+全文检索)" 提供了一个整合了Excel和Access的应用,用于高效的工作任务管理和文档检索。该系统经过第七版的...

    自动点滴管理系统.NET

    在.NET 3.5框架下,开发自动点滴管理系统时,开发人员可以充分利用该框架提供的类库和工具,如ASP.NET、LINQ以及AOP(面向切面编程)等,以提高开发效率和代码质量。.NET 3.5框架引入了对C# 3.0和VB.NET 9.0的支持,...

    AS400开发经验点滴

    ### AS400开发经验点滴 #### 一、AS/400系统介绍与环境配置 AS/400系统是一种高性能的企业级服务器系统,它主要用于处理大量的事务性数据和复杂的业务逻辑。AS/400系统具有稳定、可靠、高效等特点,在金融、制造、...

    基于.NET前沿技术WCF技术开发HIS自动点滴管理系统实战项目.txt

    基于.NET前沿技术WCF技术开发HIS自动点滴管理系统实战项目,一共38讲。

    基于Wcf技术的自动点滴管理系统

    【基于Wcf技术的自动点滴管理系统】是一种利用先进的软件技术设计的医疗管理工具,主要用于提升医疗机构的点滴护理效率。此系统的核心是运用Windows Communication Foundation(Wcf),这是一种由微软提供的.NET框架...

    DotNET_CS(WinForm)开发技巧点滴

    【 DotNET_CS(WinForm) 开发技巧点滴】 在.NET框架下的C/S(客户端/服务器)应用程序开发中,WinForm是一种常见的用户界面技术。这里我们探讨一些开发中的实用技巧,这些技巧可以帮助提升开发效率和软件质量。 1. ...

    自动点滴控制器

    自动点滴控制器的开发遵循一套严格的计划进度,包括资料查阅、方案设计、硬件制作与调试、软件编程、系统整合测试等环节。每个阶段都需要细致规划,确保最终产品的性能与稳定性。例如,在硬件部分设计阶段,需考虑...

    点滴\液体点滴速度监控装置设计报告

    在系统开发完成后,需进行一系列的测试,包括功能测试、性能测试和稳定性测试,以验证系统是否满足设计要求,能否在实际医疗环境中稳定可靠地工作。 总结,本设计报告详细阐述了点滴液体点滴速度监控装置的设计理念...

    液体点滴速度监控装置

    液体点滴速度监控装置 液体点滴速度监控装置是对液体点滴速度的检测和控制及储液瓶中液面高度的检测报警的系统。本系统通过光电传感器检测液面高度和液体点滴速度,使用步进电机控制液体点滴速度,并实现了多机通信...

    自动点滴管理系统(.NET 3.5框架的WCF技术实现).zip

    《自动点滴管理系统——基于.NET 3.5框架的WCF技术实现详解》 自动点滴管理系统是信息技术在医疗领域的典型应用,它借助先进的软件技术,实现了点滴注射过程的自动化监控和管理,大大提升了医疗服务的安全性和效率...

    zhuji.rar_drip_液体点滴_点滴_点滴速度检测

    标题中的“zhuji.rar_drip_液体点滴_点滴_点滴速度检测”表明这是一个与医疗设备相关的...通过分析和理解这个汇编代码,我们可以深入理解点滴速度检测装置的工作原理,这对于医疗设备开发、维护或改进具有重要价值。

    智能液体点滴速度监测

    标题中的“智能液体点滴速度监测”是指一种利用现代科技手段对输液过程中的点滴速度进行实时、精确监控的技术。这项技术通常结合传感器、微处理器和显示设备,旨在提高医疗护理的安全性和效率,防止因点滴速度不当...

    单片机开发0082、液体点滴速度监控装置资料.zip

    本资料包"单片机开发0082、液体点滴速度监控装置资料.zip"提供了关于如何使用单片机技术来设计这样一个系统的详细信息。以下是对这个主题的深入探讨: 1. **单片机基础**: - 单片机是一种集成度极高的微型计算机...

Global site tag (gtag.js) - Google Analytics