vb.net

位置:IT落伍者 >> vb.net >> 浏览文章

用VB.NET结合Excel设计统计生产报表


发布日期:2022年11月14日
 
用VB.NET结合Excel设计统计生产报表

用EXCEL做企业生产报表的理由

Excel表格生成和公式设置十分强大便利是一个强有力的信息分析与处理工具特别是EXCEL的公式函数VBA语言功能极其强大我试用过其他电子表格软件在功能上和EXCEL根本没有可比性

Visual Studio NET也同样是MicroSoft的产品Visual Studio NET调用EXCEL做企业报表十分方便证明当时我选Visual Studio NET作为首选开发工具是正确的

软件构思

先在EXCEL里定制好名为《统计表》的样表(模版)在样表中设置好各种格式填写好固定项

在窗体上放很三个控件两个DateTimePicker控件用来选择开始统计时间和结束统计时间一个Button以启动程序

软件欲实现的功能是点击Button自动查找符合日期符合日期范围的生产计划工作表然后利用SortedList统计各个办事处的计划数量和未完成数量及各个产品型号的计划数量和未完成数量再把SortedList的数据读出写到《统计表》中

这里要注意的是各个生产报表格式必须规范统一因为程序是按照固定单元格位置读取数据的

SortedList类

除了具备VBNET调用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 都不允许重复键

VBNET结合EXCEL统计生产报表

以下是实现代码供参考为方便初学者部份地方加以注释

Private Sub Form_Load(ByVal sender As Object ByVal e As SystemEventArgs) Handles MyBaseLoad

DateTimePickerMaxDate = DateNow

DateTimePickerMinDate = #//#

DateTimePickerMaxDate = DateNow

DateTimePickerMinDate = #//#

End Sub

Private Sub 灶具分析统计()

Call killEXCEL()

Dim excelApp As New ExcelApplication

Dim 佳尼灶具生产计划 As ExcelWorkbook

Dim 行号 As Integer =

Dim 列号 As Integer =

Dim 办事处计划数统计 As New SortedList

Dim 办事处完成数统计 As New SortedList

Dim 型号计划数统计 As New SortedList

Dim 型号完成数统计 As New SortedList

Dim 统计表 As ExcelWorksheet

Try

佳尼灶具生产计划 = excelAppWorkbooksOpen(E:\my documents\生产计划\佳尼灶具生产计划xls)

统计表 = CType(佳尼灶具生产计划Worksheets(统计表) ExcelWorksheet)

统计表Cells( )value = DateTimePickerValueToShortDateString 统计开始日期

统计表Cells( )value = DateTimePickerValueToShortDateString 统计结束日期

统计表Range(c:z)Value = 先清空统计表中原来有关数据

统计表Range(c:z)Value =

Dim 生产计划表 As ExcelWorksheet

For Each 生产计划表 In 佳尼灶具生产计划Worksheets 遍历生产计划表

If StringsLeft(生产计划表Name ) = Or StringsLeft(生产计划表Name ) = Then 如果是开头的表名因生产计划表名是开头

MsgBox(生产计划表Name)

行号 = 生产计划表中生产数据从第四行开始

列号 = 列是计划下发日期从计划下发日期判断是否是所要数据

Dim 临时行号 As Integer = 求得工作表中最后一行所在的行号从第四行开始往下计算

While 生产计划表Cells(临时行号 列号)value <> Nothing

MsgBox(生产计划表Cells(行号 列号)value 行号)

临时行号 +=

End While

临时行号 = 得到生产计划表中最后数据行所在的行号

MsgBox(临时行号)

For 行号 = To 临时行号 生产计划标准格式行号从开始到工作表中最后一行

If (CDate(DateTimePickerValueToShortDateString) <= CDate(生产计划表.Cells(行号, 列号).value)) And (CDate(DateTimePicker2.Value.ToShortDateString) >= CDate(生产计划表Cells(行号 列号)value)) Then 如果日期在规定范围内

灶具各城市分布情况

Dim 城市 As String = 生产计划表Cells(行号 )value 列是城市名称

Dim 计划数 As Decimal = CType(生产计划表Cells(行号 )value Decimal) 列是计划数

Dim 完成数 As Decimal = CType(生产计划表Cells(行号 )value Decimal) 列是实际完成数

Dim 未完成数 As Decimal = 用Decimal是因为后面要加小数

If 完成数 < 计划数 Then '如果没有完成

未完成数 = 计划数 - 完成数

End If

If 城市 <> "" Then

If InStr(城市, "沈阳") <> 0 Or InStr(城市, "鞍山") <> 0 Or InStr(城市, "哈尔滨") <> 0 Or InStr(城市, "葫芦岛") <> 0 Then

If 办事处计划数统计.Contains("沈阳") Then

办事处计划数统计.Item("沈阳") += 计划数

Else

办事处计划数统计.Add("沈阳", 计划数)

End If

If 办事处完成数统计.Contains("沈阳") Then

办事处完成数统计.Item("沈阳") += 未完成数

Else

办事处完成数统计.Add("沈阳", 未完成数)

End If

Else

If 办事处计划数统计.Contains(城市) Then

办事处计划数统计.Item(城市) += 计划数

Else

办事处计划数统计.Add(城市, 计划数)

End If

If 办事处完成数统计.Contains(城市) Then

办事处完成数统计.Item(城市) += 未完成数

Else

办事处完成数统计.Add(城市, 未完成数)

End If

End If

Else

MsgBox(生产计划表.Name & "没有城市名称", MsgBoxStyle.Critical, "生产计划中要有城市名称")

excelApp.Visible = True

生产计划表.Activate()

生产计划表.Select()

End If

'以下计算灶具型号分布情况

Dim 型号 As String = Strings.Left(生产计划表.Cells(行号, 2).value, 3) '灶具型号在第3列

If 型号计划数统计.Contains(型号) Then

型号计划数统计.Item(型号) += 计划数

Else

型号计划数统计.Add(型号, 计划数)

End If

If 型号完成数统计.Contains(型号) Then

型号完成数统计.Item(型号) += 未完成数

Else

型号完成数统计.Add(型号, 未完成数)

End If

End If

Next

End If

Next

Dim 城市数 As Integer = 办事处计划数统计.Count

Dim 城市数clone As Integer = 办事处计划数统计.Count

行号 = 4

'依计划数大小排序

Dim 办事处计划数统计副本 As New SortedList

Dim asa As Decimal = 0.001 '加上此数是为了防止键值的重复,在工作表中可选不显示小数

Dim 办事处计划数Enum As IDictionaryEnumerator = 办事处计划数统计.GetEnumerator

While 办事处计划数Enum.MoveNext

办事处计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key)

asa += 0.001

End While

'这里利用SortedList自动排序的功能

Dim i As Integer = 1

For 列号 = 3 To 3 + 城市数 - 1 '从第三列开始填写数据,这是预先定义的格式

统计表.Cells(行号, 列号).value = 办事处计划数统计副本.GetByIndex(城市数clone - i) '城市

统计表.Cells(行号 + 1, 列号).value = 办事处计划数统计副本.GetKey(城市数clone - i) '计划数

统计表.Cells(行号 + 2, 列号).value = 办事处完成数统计.Item(办事处计划数统计副本.GetByIndex(城市数clone - i)) '计划数

i += 1

Next

'以型号计划数多少排序

Dim 型号计划数统计副本 As New SortedList

办事处计划数Enum = 型号计划数统计.GetEnumerator

While 办事处计划数Enum.MoveNext

型号计划数统计副本.Add(办事处计划数Enum.Value + asa, 办事处计划数Enum.Key)

asa += 0.001

' MsgBox(办事处计划数Enum.Valu

上一篇:同Java一样简单!VB.NET多线程开发实例

下一篇:ildasm破解和用ilasm来重新编译VB.NET程序