vb.net结合excel统计生产报表
—企业信息化探讨之二
屠恩海
开发工具:microsoft visual studio .net 2003
操作系统:windows xp
用excel做企业生产报表的理由
excel表格生成和公式设置十分强大便利,是一个强有力的信息分析与处理工具。特别是excel的公式、函数、vba语言,功能极其强大。我试用过其他电子表格软件,在功能上和excel根本没有可比性。我为excel的功能所折服,特别搜集整理了电子书——《excel应用宝典》,放到网上供大家下载学习。欲助己,先助人,这也是我一贯的学习哲学。
visual studio .net也同样是microsoft的产品,visual studio .net调用excel做企业报表十分方便。
证明当时我选visual studio .net作为首选开发工具是正确的。
软件构思
软件构思是这样的:
先在excel里定制好名为《统计表》的样表(模版),,在样表中设置好各种格式,填写好固定项。
在窗体上放很三个控件,两个datetimepicker控件,用来选择开始统计时间和结束统计时间。一个button以启动程序。
软件欲实现的功能是:点击button1,自动查找符合日期符合日期范围的生产计划工作表,然后利用sortedlist统计各个办事处的计划数量和未完成数量,及各个产品型号的计划数量和未完成数量。再把sortedlist的数据读出写到《统计表》中。
这里要注意的是,各个生产报表格式必须规范统一,因为程序是按照固定单元格位置读取数据的。
sortedlist类
除了具备vb.net调用excel的基础知识外,本例主要用到sortedlist类。
sortedlist类表示键/值对的集合,这些键和值按键排序并可按照键和索引访问。
sortedlist 是 hashtable 和 array 的混合。当使用 item 索引器属性按照元素的键访问元素时,其行为类似于 hashtable。当使用 getbyindex 或 setbyindex 按照元素的索引访问元素时,其行为类似于 array。
sortedlist 在内部维护两个数组以将数组存储到列表中;即,一个数组用于键,另一个数组用于相关联的值。每个元素都是一个可作为 dictionaryentry 对象进行访问的键/值对。键不能为空引用(visual basic 中为 nothing),但值可以。
sortedlist 的容量是列表可拥有的元素数。随着向 sortedlist 中添加元素,容量通过重新分配按需自动增加。可通过调用 trimtosize 或通过显式设置 capacity 属性减少容量。
sortedlist 的元素将按照特定的 icomparer 实现(在创建 sortedlist 时指定)或按照键本身提供的 icomparable 实现并依据键来进行排序。不论在哪种情况下,sortedlist 都不允许重复键。
索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入 sortedlist,同时索引会相应地进行调整。若移除了元素,索引也会相应地进行调整。因此,当在 sortedlist 中添加或移除元素时,特定键/值对的索引可能会更改。
由于要进行排序,所以在 sortedlist 上操作比在 hashtable 上操作要慢。但是,sortedlist 允许通过相关联键或通过索引对值进行访问,可提供更大的灵活性。
此集合中的索引从零开始。
[visual basic, c#] c# 语言中的 foreach 语句(在 visual basic 中为 for each)需要集合中每个元素的类型。由于 sortedlist 的每个元素都是一个键/值对,因此元素类型既不是键的类型,也不是值的类型。而是 dictionaryentry 类型。例如:
dim myde as dictionaryentry
for each myde in mysortedlist
...
next myde
vb.net结合excel统计生产报表
以下是实现代码,供参考。为方便初学者,部份地方加以注释。
| private sub form1_load(byval sender as object, byval e as system.eventargs) handles mybase.load datetimepicker1.maxdate = date.now datetimepicker1.mindate = #1/1/2004# datetimepicker2.maxdate = date.now datetimepicker2.mindate = #1/1/2004# end sub |
| private sub 灶具分析统计()
call killexcel() dim excelapp as new excel.application dim 型号计划数统计 as new sortedlist try
for 行号 = 4 to 临时行号 &生产计划标准格式行号从4开始,到工作表中最后一行 if (cdate(datetimepicker1.value.toshortdatestring) <= cdate(生产计划表.cells(行号, 列号).value)) and (cdate(datetimepicker2.value.toshortdatestring) >= cdate(生产计划表.cells(行号, 列号).value)) then &如果日期在规定范围内 &灶具各城市分布情况 if 城市 <> "" then if 办事处完成数统计.contains("沈阳") then
end if
end if end if next dim 城市数 as integer = 办事处计划数统计.count 行号 = 4 &依计划数大小排序
dim 型号数 as integer = 型号计划数统计.count & dim wsf as excel.worksheetfunction = excelapp.worksheetfunction
办事处计划数统计 = nothing |