SolidWorks專門論壇 SolidWorks forum

 找回密碼
 註冊
查看: 24062|回復: 11

取出BOM表資料輸出至Excel(VB.NET)

[複製鏈接]
發表於 2018/5/24 16:41:36 | 顯示全部樓層 |閱讀模式
製作紙本BOM時通常是另存工程圖中的零件表再開啟Excel編輯成規定的格式
如果可以用程式取出BOM表資料透過自定義的方式輸出Excel就可以節省一點時間了
這個程式算是半成品,因為製作Excel的部分還要看使用者需要什麼格式



  1. Imports SolidWorks.Interop.sldworks
  2. Imports SolidWorks.Interop.swconst
  3. Imports Microsoft.Office.Interop

  4. Public Class Form1
  5.     '定義拖曳起始與結束的Item位置
  6.     Private InitialCount, FinalCount As Integer

  7.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

  8.         '建議Excel物件
  9.         Dim ExcelApp As New Excel.Application   'ExcelApp  是操作 Excel 的變數
  10.         Dim Workbook As Excel.Workbook         'Workbook  代表的是一個 Excel 本體
  11.         Dim Worksheet As Excel.Worksheet      'Worksheet 代表的是 Excel 工作表

  12.         ExcelApp.Visible = True
  13.         '建立活頁簿
  14.         Workbook = ExcelApp.Workbooks.Add()
  15.         '選定工作表
  16.         Worksheet = Workbook.Sheets(1)
  17.         '顯示工作表
  18.         ExcelApp.Visible = True


  19.         '建立資料字串陣列
  20.         Dim Data(ListView_BOM.Items.Count - 1, ListView_BOM.Columns.Count - 1) As String

  21.         For i = 0 To ListView_BOM.Items.Count - 1
  22.             For j = 0 To ListView_BOM.Columns.Count - 1
  23.                 Data(i, j) = ListView_BOM.Items(i).SubItems(j).Text
  24.             Next
  25.         Next

  26.         Worksheet.Range(Worksheet.Cells(1, 1), Worksheet.Cells(ListView_BOM.Items.Count, ListView_BOM.Columns.Count)).Value = Data


  27.     End Sub

  28.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  29.         Dim OpenFile As OpenFileDialog = New OpenFileDialog  '創建檔案瀏覽物件
  30.         OpenFile.CheckFileExists = True                      '開啟檔案不存在警告
  31.         OpenFile.Filter = "工程圖 (*.SLDDRW)|*.SLDDRW"       '設定檔案類型
  32.         OpenFile.Multiselect = False                         '禁止複選檔案
  33.         OpenFile.ShowDialog()                                '秀出檔案瀏覽視窗
  34.         Dim Path As String = OpenFile.FileName               '取得檔案路徑

  35.         '判定檔案類型
  36.         If Strings.Right(Path, 6) = "SLDDRW" Then
  37.             GetBOMTable(Path)
  38.         Else
  39.             MsgBox("檔案類型錯誤")
  40.         End If

  41.     End Sub

  42.     Sub GetBOMTable(ByVal Path As String)
  43.         Dim SwApp As New SldWorks

  44.         '取得回傳訊息
  45.         Dim longstatus, longwarnings As Integer

  46.         Dim swModel As ModelDoc2 = SwApp.OpenDoc6(Path, swDocumentTypes_e .swDocDRAWING, 0, "", longstatus, longwarnings)
  47.         Dim swDraw As DrawingDoc = swModel
  48.         Dim swFeat As Feature = swModel.FirstFeature
  49.         Dim swBomFeat As BomFeature

  50.         '開啟含有BOM表的工程圖
  51.         swModel = SwApp.ActiveDoc

  52.         '比對圖檔內是否有零件表
  53.         Do While Not swFeat Is Nothing

  54.             If "BomFeat" = swFeat.GetTypeName Then
  55.                 Debug.Print("******************************")

  56.                 '顯示零件表名稱
  57.                 Debug.Print("Feature Name : " & swFeat.Name)

  58.                 '取得零件表物件
  59.                 swBomFeat = swFeat.GetSpecificFeature2

  60.                 ProcessBomFeature(SwApp, swModel, swBomFeat)


  61.                 SwApp.CloseDoc(swModel.GetTitle)
  62.                 SwApp.ExitApp()
  63.                 SwApp = Nothing

  64.                 Exit Do
  65.             End If

  66.             '取得下一個特徵型態
  67.             swFeat = swFeat.GetNextFeature
  68.         Loop

  69.     End Sub

  70.     Sub ProcessBomFeature(ByVal swApp As SldWorks, ByVal swModel As ModelDoc2, ByVal swBomFeat As BomFeature)
  71.         Dim swFeat As Feature
  72.         Dim vTableArr As Object
  73.         Dim vTable As Object
  74.         Dim vConfigArray As Object
  75.         Dim vConfig As Object
  76.         Dim ConfigName As String
  77.         Dim swTable As TableAnnotation

  78.         '取得零件表物件
  79.         swFeat = swBomFeat.GetFeature
  80.         vTableArr = swBomFeat.GetTableAnnotations

  81.         For Each vTable In vTableArr
  82.             swTable = vTable
  83.             vConfigArray = swBomFeat.GetConfigurations(True, True)
  84.             For Each vConfig In vConfigArray

  85.                 '顯示組件組態
  86.                 ConfigName = vConfig
  87.                 Debug.Print("-------------------------------------------------------")
  88.                 Debug.Print(" Component for Configuration : " & ConfigName)

  89.                 '取得BOM表詳細資訊
  90.                 ProcessTableAnn(swApp, swModel, swTable, ConfigName)
  91.             Next vConfig
  92.         Next vTable

  93.     End Sub

  94.     Sub ProcessTableAnn(ByVal swApp As SldWorks, ByVal swModel As ModelDoc2, ByVal swTableAnn As TableAnnotation, ByVal ConfigName As String)

  95.         Dim BOM As TableAnnotation = swTableAnn

  96.         With ListView_BOM
  97.             .Columns.Clear()
  98.             .Items.Clear()
  99.         End With

  100.         For i = 1 To swTableAnn.RowCount - 1

  101.             Dim RowData(swTableAnn.ColumnCount - 1) As String


  102.             For j = 0 To swTableAnn.ColumnCount - 1

  103.                 If i = 1 Then

  104.                     With ListView_BOM
  105.                         .Columns.Add(BOM.DisplayedText(i, j))
  106.                         .Columns(j).Width = BOM.GetColumnWidth(j) * 6000
  107.                     End With

  108.                 Else
  109.                     RowData(j) = BOM.DisplayedText(i, j)
  110.                 End If
  111.             Next

  112.             Dim Item As New ListViewItem(RowData)
  113.             ListView_BOM.Items.Add(Item)
  114.         Next


  115.     End Sub

  116.     Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  117.         With ListView_BOM

  118.             .View = Windows.Forms.View.Details
  119.             .GridLines = True
  120.             .MultiSelect = False
  121.             .AllowDrop = True
  122.             .FullRowSelect = True
  123.         End With
  124.     End Sub

  125.     '處發條件:開始Item拖曳
  126.     Private Sub ListView_BOM_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView_BOM.ItemDrag
  127.         '讀取被拖曳Item
  128.         Dim SelectItem As ListViewItem = ListView_BOM.SelectedItems.Item(0)
  129.         sender.DoDragDrop(SelectItem, DragDropEffects.Move)
  130.     End Sub

  131.     '觸發條件:拖曳完成
  132.     Private Sub ListView_BOM_DragDrop(sender As Object, e As DragEventArgs) Handles ListView_BOM.DragDrop

  133.         With sender
  134.             '取得拖曳完成時的位置
  135.             FinalCount = .Items.IndexOf(.HitTest(.PointToClient(New Point(e.X, e.Y))).Item)

  136.             '判定拖曳的資料類型是否正確
  137.             If e.Data.GetDataPresent(GetType(ListViewItem)) Then
  138.                 '取得被拖曳的元素
  139.                 Dim InsertItem As ListViewItem = e.Data.GetData(GetType(ListViewItem))

  140.                 '必須先移除被拖曳的元素才能重新加入,不然會發生錯誤
  141.                 .items.Remove(InsertItem)

  142.                 '被拖曳Item插入位置
  143.                 If FinalCount = -1 Then
  144.                     '拖曳至空白區,插入至最下方
  145.                     .items.add(InsertItem)
  146.                 Else
  147.                     '拖曳至Item群組內,插入滑鼠放開的位置
  148.                     .items.insert(FinalCount, InsertItem)
  149.                 End If
  150.             End If

  151.         End With
  152.     End Sub

  153.     '觸發條件:拖曳中
  154.     Private Sub ListView_BOM_DragOver(sender As Object, e As DragEventArgs) Handles ListView_BOM.DragOver
  155.         '按著滑鼠左鍵且點選Item時才執行下列程式碼
  156.         If InitialCount <> -1 And MouseButtons = MouseButtons.Left Then
  157.             '定義拖曳鼠標型態,如果沒有使用這個事件與拖曳效果無法完成拖曳
  158.             e.Effect = DragDropEffects.Move
  159.         End If
  160.     End Sub

  161.     '觸發條件:在ListView內按下滑鼠
  162.     Private Sub ListView_BOM_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView_BOM.MouseDown
  163.         '取得滑鼠點擊時所在的Item位置
  164.         InitialCount = ListView_BOM.Items.IndexOf(ListView_BOM.HitTest(e.X, e.Y).Item)
  165.     End Sub

  166.     '觸發條件:拖曳時離開ListView
  167.     Private Sub ListView_BOM_DragLeave(sender As Object, e As EventArgs) Handles ListView_BOM.DragLeave
  168.         '刪除Item
  169.         With sender
  170.             '按著滑鼠左鍵且點選Item時才執行下列程式碼()
  171.             If InitialCount <> -1 And MouseButtons = MouseButtons.Left And .Items.Count - 1 >= InitialCount Then
  172.                 .items.removeat(InitialCount)
  173.             End If
  174.         End With
  175.     End Sub
  176. End Class
複製代碼




本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有賬號?註冊

x
發表於 2018/5/24 23:31:08 | 顯示全部樓層
這個我在公司有前輩製作一個類似的,也有將所有模組的BOM,整合成一張總表的EXCEL巨集,但他的作法比較麻煩,必須先自行調適表格格式,後來我就自己做另一個較方便的版本,過二天,我把內容整理整理,再分享出來!

點評

rock大不會是G&G的員工吧??  詳情 回復 發表於 2018/5/25 23:38
發表於 2018/5/25 23:38:58 | 顯示全部樓層
rock6098 發表於 2018/5/24 23:31
這個我在公司有前輩製作一個類似的,也有將所有模組的BOM,整合成一張總表的EXCEL巨集,但他的作法比較麻煩 ...

rock大不會是G&G的員工吧??以前我還在職的時候就是這樣做,因為該公司的習慣是每個組件單獨出BOM,但最終還是需要一張總BOM

加上當時剛開始接觸巨集,所以編寫了兩個Excel的檔案給研發用。功能就像您說的一樣
但是並不用自己調適表格,因為已經都設定好了

點評

丹大真厲害,這樣就被你發現了!你所指的應該就是"模組BOM範本"和"總表BOM範本"吧!但是SW轉出的EXCEL不是要先複製貼入"模組BOM範本",然後加框線,然後將檔名複製到A1後才能整合至總表嗎?這樣如果有10個模組,同樣  詳情 回復 發表於 2018/5/26 11:17
發表於 2018/5/26 11:17:19 | 顯示全部樓層
gt.adan 發表於 2018/5/25 23:38
rock大不會是G&G的員工吧??以前我還在職的時候就是這樣做,因為該公司的習慣是每個組件單獨出BOM,但最 ...

丹大真厲害,這樣就被你發現了!你所指的應該就是"模組BOM範本"和"總表BOM範本"吧!但是SW轉出的EXCEL不是要先複製貼入"模組BOM範本",然後加框線,然後將檔名複製到A1後才能整合至總表嗎?這樣如果有10個模組,同樣的事情就要做10次了,至少我去的時候,大家是這樣做的.....,因為範本都是被保護,我只好循著前輩的思維,重新做過,並簡化成一鍵完成,但還是遇到一些問題,例如明明2016版執行都OK,可是2010或2007都會出現問題,不過也都一一克服了!有你們這些前輩真好,不然,我現在出圖,可能還呆呆的一個個編輯,進到G&G,也讓我進步很多,視野也開闊許多!!

點評

原來如此~被保護的範本我已經取消保護並重新傳給你的主管囉~  發表於 2018/5/27 20:06
發表於 2018/5/29 15:38:23 | 顯示全部樓層
這兩天在搞BOM,正好需要這些訊息  先謝謝了 再來研究研究

點評

DisplayedText Property (ITableAnnotation) 主要是用這個指令取的資料,其他程式碼都只是前置或輔助而已  詳情 回復 發表於 2018/5/30 08:07
 樓主| 發表於 2018/5/30 08:07:51 | 顯示全部樓層
ruter1224 發表於 2018/5/29 15:38
這兩天在搞BOM,正好需要這些訊息  先謝謝了 再來研究研究

DisplayedText Property (ITableAnnotation)
主要是用這個指令撈資料,其他程式碼都只是前置或輔助而已

點評

我比較好奇的事,你都怎麼去TRY這些API的  詳情 回復 發表於 2018/5/30 08:10
發表於 2018/5/30 08:10:07 | 顯示全部樓層
jbkndron 發表於 2018/5/30 08:07
DisplayedText Property (ITableAnnotation)
主要是用這個指令取的資料,其他程式碼都只是前置或輔助而已 ...

我比較好奇的事,你都怎麼去TRY這些API的

點評

把API Help的範例複製下來執行 如果可以出現預期的結果就 就用逐步執行看所有變數的資料變化,觀察API的工作原理 或是把幾行可能是重點的程式碼去掉,看看有沒有影響 這是比較能夠深入熟悉指令的方法,但是很花時間  詳情 回復 發表於 2018/5/30 08:18
 樓主| 發表於 2018/5/30 08:18:11 | 顯示全部樓層
ruter1224 發表於 2018/5/30 08:10
我比較好奇的事,你都怎麼去TRY這些API的

把API Help的範例複製下來執行,如果可以出現預期的結果
就用逐步執行看所有變數的資料變化,觀察API的工作原理
或是把幾行可能是重點的程式碼去掉,看看有沒有影響
這是比較能夠深入熟悉指令的方法,但是很花時間

而且前提是""你要先知道你要達成的目標需要用哪個指令""
發表於 2020/12/16 21:19:25 | 顯示全部樓層
我都是用Solidworks自带的材料明细表,在明细表内添加些公式。基本满足使用
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

論壇統計|手機版上論壇|論壇來自幾何科技 論壇架構版次 20240312

GMT+8, 2024/4/25 13:13 , Processed in 0.280932 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回復 返回頂部 返回列表