熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

用VB.NET結合Excel設計統計生產報表

2013-11-13 09:39:58  來源: .NET編程 

  用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
From:http://tw.wingwit.com/Article/program/net/201311/11282.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.