这几天公司有个报表开发需求,UI要求也相当高,讨论决定使用excel模版来做报表需求。
报表开发主要使用宏,后端是JAVA调用POI进行隐藏sheet的数据填充,最后执行宏绘制报表。
宏如下:
特别注意的是注释那段,当关闭excel后会报告excel格式错误问题,但手动操作的没问题,非常怪异,特此标记一下。
VBA代码可以进一步进行优化,不过在那里面写真的是没eclipse方便...
另外经常写到循环或者判断的时候,打进去的代码居然是JAVA代码,悲催啊...
丫的,突然想起来这货不是JAVA啊~~~
报表开发主要使用宏,后端是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啊~~~
发表评论
-
ActiveMQ集群应用
2013-03-30 21:29 7245ActiveMQ集群 ActiveMQ具有 ... -
清除SVN控制
2013-03-06 13:59 958新建一个名为clearSvn.bat, copy以下内容: ... -
memcached做Session同步时失败的问题
2013-02-21 14:00 5331本地搭建了一个nginx+两台tomcat+memcache ... -
让自己的电脑变成虚拟服务器
2013-02-20 11:32 2000自己开发了博客系统?小webapp? 不想买域名买空间怎么 ... -
Tibco时间同步处理机制
2013-02-20 11:28 921记住最主要一句话:Tibco Queue EMS会每次建立 ... -
nginx配置
2013-02-20 11:22 1389#user nobody; worker_proc ... -
Nginx动静分离经典案例配置
2013-02-20 11:20 48061随着Nginx高性能Web服务器大量被使用,目前Nginx最 ... -
诡异的tomcat发布应用问题
2013-02-19 13:44 1108tomcat发布有好几种方式,耳熟能详。其中,这些方式对于m ... -
JVM内存模型与性能调优
2013-02-18 14:16 1313Java是一门面向对象的 ... -
Web容器线程池机制小议
2013-02-16 11:17 5513基础 从刚开始学习java ... -
JDBC DB TableName
2012-12-10 17:27 1243获取表结构. package com.pear.db; ... -
intellij idea 使用总结,java
2012-12-10 15:14 1828intellij idea 使用总结 Int ... -
并发测试程序
2012-12-10 14:40 1153package com.thread.test; i ... -
IntelliJ Idea 常用快捷键列表
2012-11-12 15:07 1217Alt+回车 导入包,自动修 ... -
sigar简单使用
2012-07-17 13:58 5689import java.io.File; import ... -
jackson如何做国际化
2012-07-16 17:44 1616JSON目前在JAVA中用的已经比较多了,像Json-lib、 ...
相关推荐
在.NET 3.5框架下,开发者可以利用C#编程语言,结合ASP.NET技术来开发Web应用程序,这在本系统中起到了关键作用。ASP.NET提供了丰富的服务器控件和事件模型,使得构建动态网页变得更加容易。它还支持多种数据绑定...
### Eclipse SWT开发点滴 #### 一、第三方包的引用 在使用Eclipse进行SWT开发时,经常会遇到需要引入第三方库的情况。以下是引入第三方库的具体步骤: 1. **工程项目增加Libraries** - 右键点击项目 -> `Build ...
学习 Business Objects ,以及 reporting service 的笔记。
在本资源中,"EXCEL+ACCESS工作管理系统 最终版更新七 功能增强完成-全文检索算法并附PPT(BI报表+数据库+全文检索)" 提供了一个整合了Excel和Access的应用,用于高效的工作任务管理和文档检索。该系统经过第七版的...
在.NET 3.5框架下,开发自动点滴管理系统时,开发人员可以充分利用该框架提供的类库和工具,如ASP.NET、LINQ以及AOP(面向切面编程)等,以提高开发效率和代码质量。.NET 3.5框架引入了对C# 3.0和VB.NET 9.0的支持,...
### AS400开发经验点滴 #### 一、AS/400系统介绍与环境配置 AS/400系统是一种高性能的企业级服务器系统,它主要用于处理大量的事务性数据和复杂的业务逻辑。AS/400系统具有稳定、可靠、高效等特点,在金融、制造、...
基于.NET前沿技术WCF技术开发HIS自动点滴管理系统实战项目,一共38讲。
【基于Wcf技术的自动点滴管理系统】是一种利用先进的软件技术设计的医疗管理工具,主要用于提升医疗机构的点滴护理效率。此系统的核心是运用Windows Communication Foundation(Wcf),这是一种由微软提供的.NET框架...
【 DotNET_CS(WinForm) 开发技巧点滴】 在.NET框架下的C/S(客户端/服务器)应用程序开发中,WinForm是一种常见的用户界面技术。这里我们探讨一些开发中的实用技巧,这些技巧可以帮助提升开发效率和软件质量。 1. ...
自动点滴控制器的开发遵循一套严格的计划进度,包括资料查阅、方案设计、硬件制作与调试、软件编程、系统整合测试等环节。每个阶段都需要细致规划,确保最终产品的性能与稳定性。例如,在硬件部分设计阶段,需考虑...
在系统开发完成后,需进行一系列的测试,包括功能测试、性能测试和稳定性测试,以验证系统是否满足设计要求,能否在实际医疗环境中稳定可靠地工作。 总结,本设计报告详细阐述了点滴液体点滴速度监控装置的设计理念...
液体点滴速度监控装置 液体点滴速度监控装置是对液体点滴速度的检测和控制及储液瓶中液面高度的检测报警的系统。本系统通过光电传感器检测液面高度和液体点滴速度,使用步进电机控制液体点滴速度,并实现了多机通信...
《自动点滴管理系统——基于.NET 3.5框架的WCF技术实现详解》 自动点滴管理系统是信息技术在医疗领域的典型应用,它借助先进的软件技术,实现了点滴注射过程的自动化监控和管理,大大提升了医疗服务的安全性和效率...
标题中的“zhuji.rar_drip_液体点滴_点滴_点滴速度检测”表明这是一个与医疗设备相关的...通过分析和理解这个汇编代码,我们可以深入理解点滴速度检测装置的工作原理,这对于医疗设备开发、维护或改进具有重要价值。
标题中的“智能液体点滴速度监测”是指一种利用现代科技手段对输液过程中的点滴速度进行实时、精确监控的技术。这项技术通常结合传感器、微处理器和显示设备,旨在提高医疗护理的安全性和效率,防止因点滴速度不当...
本资料包"单片机开发0082、液体点滴速度监控装置资料.zip"提供了关于如何使用单片机技术来设计这样一个系统的详细信息。以下是对这个主题的深入探讨: 1. **单片机基础**: - 单片机是一种集成度极高的微型计算机...