SolidWorks机械工程师网——最大的SolidWorks学习平台

标题: 取出BOM表资料输出至Excel(VB.NET) [打印本页]

作者: bargin    时间: 2018-5-24 16:41
标题: 取出BOM表资料输出至Excel(VB.NET)
制作纸本BOM时通常是另存工程图中的零件表再开启Excel编辑成规定的格式
如果可以用程式取出BOM表资料透过自定义的方式输出Excel就可以节省一点时间了
这个程式算是半成品,因为制作Excel的部分还要看使用者需要什么格式
BOM表输出.zip
BOM表输出.txt



Imports SolidWorks.Interop.sldworks
Imports SolidWorks.Interop.swconst
Imports Microsoft.Office.Interop

Public Class Form1
  '定义拖曳起始与结束的Item位置
  Private InitialCount, FinalCount As Integer

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

  '建议Excel物件
  Dim ExcelApp As New Excel.Application 'ExcelApp是操作 Excel 的变数
  Dim Workbook As Excel.Workbook   'Workbook代表的是一个 Excel 本体
  Dim Worksheet As Excel.Worksheet  'Worksheet 代表的是 Excel 工作表

  ExcelApp.Visible = True
  '建立活页簿
  Workbook = ExcelApp.Workbooks.Add()
  '选定工作表
  Worksheet = Workbook.Sheets(1)
  '显示工作表
  ExcelApp.Visible = True


  '建立资料字串阵列
  Dim Data(ListView_BOM.Items.Count - 1, ListView_BOM.Columns.Count - 1) As String

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

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


  End Sub

  Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
  Dim OpenFile As OpenFileDialog = New OpenFileDialog'创建档案浏览物件
  OpenFile.CheckFileExists = True        '开启档案不存在警告
  OpenFile.Filter = "工程图 (*.SLDDRW)|*.SLDDRW"   '设定档案类型
  OpenFile.Multiselect = False         '禁止复选档案
  OpenFile.ShowDialog()          '秀出档案浏览视窗
  Dim Path As String = OpenFile.FileName     '取得档案路径

  '判定档案类型
  If Strings.Right(Path, 6) = "SLDDRW" Then
    GetBOMTable(Path)
  Else
    MsgBox("档案类型错误")
  End If

  End Sub

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

  '取得回传讯息
  Dim longstatus, longwarnings As Integer

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

  '开启含有BOM表的工程图
  swModel = SwApp.ActiveDoc

  '比对图档内是否有零件表
  Do While Not swFeat Is Nothing

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

      '显示零件表名称
      Debug.Print("Feature Name : " & swFeat.Name)

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

      ProcessBomFeature(SwApp, swModel, swBomFeat)


      SwApp.CloseDoc(swModel.GetTitle)
      SwApp.ExitApp()
      SwApp = Nothing

      Exit Do
    End If

    '取得下一个特徵型态
    swFeat = swFeat.GetNextFeature
  Loop

  End Sub

  Sub ProcessBomFeature(ByVal swApp As SldWorks, ByVal swModel As ModelDoc2, ByVal swBomFeat As BomFeature)
  Dim swFeat As Feature
  Dim vTableArr As Object
  Dim vTable As Object
  Dim vConfigArray As Object
  Dim vConfig As Object
  Dim ConfigName As String
  Dim swTable As TableAnnotation

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

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

      '显示组件组态
      ConfigName = vConfig
      Debug.Print("-------------------------------------------------------")
      Debug.Print(" Component for Configuration : " & ConfigName)

      '取得BOM表详细资讯
      ProcessTableAnn(swApp, swModel, swTable, ConfigName)
    Next vConfig
  Next vTable

  End Sub

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

  Dim BOM As TableAnnotation = swTableAnn

  With ListView_BOM
    .Columns.Clear()
    .Items.Clear()
  End With

  For i = 1 To swTableAnn.RowCount - 1

    Dim RowData(swTableAnn.ColumnCount - 1) As String


    For j = 0 To swTableAnn.ColumnCount - 1

      If i = 1 Then

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

      Else
      RowData(j) = BOM.DisplayedText(i, j)
      End If
    Next

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


  End Sub

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

    .View = Windows.Forms.View.Details
    .GridLines = True
    .MultiSelect = False
    .AllowDrop = True
    .FullRowSelect = True
  End With
  End Sub

  '处发条件:开始Item拖曳
  Private Sub ListView_BOM_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView_BOM.ItemDrag
  '读取被拖曳Item
  Dim SelectItem As ListViewItem = ListView_BOM.SelectedItems.Item(0)
  sender.DoDragDrop(SelectItem, DragDropEffects.Move)
  End Sub

  '触发条件:拖曳完成
  Private Sub ListView_BOM_DragDrop(sender As Object, e As DragEventArgs) Handles ListView_BOM.DragDrop

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

    '判定拖曳的资料类型是否正确
    If e.Data.GetDataPresent(GetType(ListViewItem)) Then
      '取得被拖曳的元素
      Dim InsertItem As ListViewItem = e.Data.GetData(GetType(ListViewItem))

      '必须先移除被拖曳的元素才能重新加入,不然会发生错误
      .items.Remove(InsertItem)

      '被拖曳Item插入位置
      If FinalCount = -1 Then
      '拖曳至空白区,插入至最下方
      .items.add(InsertItem)
      Else
      '拖曳至Item群组内,插入滑鼠放开的位置
      .items.insert(FinalCount, InsertItem)
      End If
    End If

  End With
  End Sub

  '触发条件:拖曳中
  Private Sub ListView_BOM_DragOver(sender As Object, e As DragEventArgs) Handles ListView_BOM.DragOver
  '按着滑鼠左键且点选Item时才执行下列程式码
  If InitialCount-1 And MouseButtons = MouseButtons.Left Then
    '定义拖曳鼠标型态,如果没有使用这个事件与拖曳效果无法完成拖曳
    e.Effect = DragDropEffects.Move
  End If
  End Sub

  '触发条件:在ListView内按下滑鼠
  Private Sub ListView_BOM_MouseDown(sender As Object, e As MouseEventArgs) Handles ListView_BOM.MouseDown
  '取得滑鼠点击时所在的Item位置
  InitialCount = ListView_BOM.Items.IndexOf(ListView_BOM.HitTest(e.X, e.Y).Item)
  End Sub

  '触发条件:拖曳时离开ListView
  Private Sub ListView_BOM_DragLeave(sender As Object, e As EventArgs) Handles ListView_BOM.DragLeave
  '删除Item
  With sender
    '按着滑鼠左键且点选Item时才执行下列程式码()
    If InitialCount-1 And MouseButtons = MouseButtons.Left And .Items.Count - 1 >= InitialCount Then
      .items.removeat(InitialCount)
    End If
  End With
  End Sub
End Class


BOM表輸出.zip (603.05 KB, 下载次数: 166)
BOM表輸出.txt (7.86 KB, 下载次数: 233)


作者: x0x1x2    时间: 2018-5-27 04:08
这个我在公司有前辈制作一个类似的,也有将所有模组的BOM,整合成一张总表的EXCEL巨集,但他的作法比较麻烦,必须先自行调适表格格式,后来我就自己做另一个较方便的版本,过二天,我把内容整理整理,再分享出来!
作者: mklcjm    时间: 2018-7-7 20:12
rock大不会是G&G的员工吧??以前我还在职的时候就是这样做,因为该公司的习惯是每个组件单独出BOM,但最终还是需要一张总BOM

加上当时刚开始接触巨集,所以编写了两个Excel的档案给研发用。功能就像您说的一样
但是并不用自己调适表格,因为已经都设定好了
作者: wuhugk    时间: 2018-7-17 01:51
大佬真厉害,这样就被你发现了!你所指的应该就是"模组BOM范本"和"总表BOM范本"吧!但是SW转出的EXCEL不是要先复制贴入"模组BOM范本",然后加框线,然后将档名复制到A1后才能整合至总表吗?这样如果有10个模组,同样的事情就要做10次了,至少我去的时候,大家是这样做的.....,因为范本都是被保护,我只好循着前辈的思维,重新做过,并简化成一键完成,但还是遇到一些问题,例如明明2016版执行都OK,可是2010或2007都会出现问题,不过也都一一克服了!有你们这些前辈真好,不然,我现在出图,可能还呆呆的一个个编辑,进到G&G,也让我进步很多,视野也开阔许多!!
作者: hunter2932    时间: 2018-7-20 00:27
这两天在搞BOM,正好需要这些讯息先谢谢了 再来研究研究
作者: zjl2001    时间: 2018-7-21 10:51
DisplayedText Property (ITableAnnotation)
主要是用这个指令捞资料,其他程式码都只是前置或辅助而已
作者: dabk1774    时间: 2018-7-27 18:17
我比较好奇的事,你都怎么去TRY这些API的
作者: qwertyuiop1234    时间: 2018-8-5 03:31
把API Help的范例复制下来执行,如果可以出现预期的结果
就用逐步执行看所有变数的资料变化,观察API的工作原理
或是把几行可能是重点的程式码去掉,看看有没有影响
这是比较能够深入熟悉指令的方法,但是很花时间

而且前提是""你要先知道你要达成的目标需要用哪个指令""
作者: sgy145    时间: 2018-8-6 01:25
我都是用Solidworks自带的材料明细表,在明细表内添加些公式。基本满足使用
作者: UDF998    时间: 2021-12-25 12:35
下载下来看看,应该会有用!
作者: 夜行者    时间: 2021-12-28 20:45
很不错,顶一下!
作者: mdj186    时间: 2021-12-29 15:47
看着不错,不会用呀
作者: clowery    时间: 2022-3-14 17:07
完全看不懂的路过
作者: ppspps    时间: 2022-5-28 22:30

大佬真厉害,这样就被你发现了!你所指的应该就是"模组BOM范本"和"总表BOM范本"吧!但是SW转出的EXCEL不是要先复制贴入"模组BOM范本",然后加框线,然后将档名复制到A1后才能整合至总表吗?这样如果有10个模组,同样的事情就要做10次了,至少我去的时候,大家是这样做的.....,因为范本都是被保护,我只好循着前辈的思维,重新做过,并简化成一键完成,但还是遇到一些问题,例如明明2016版执行都OK,可是2010或2007都会出现问题,不过也都一一克服了!有你们这些前辈真好,不然,我现在出图,可能还呆呆的一个个编辑,进到G&G,也让我进步很多,视野也开阔许多!
作者: swxiaobai    时间: 2022-5-29 12:40
下载看看················
作者: wscgb123    时间: 2022-5-30 19:32
SW机械工程师网,找到组织了!
作者: 18977048828    时间: 2023-3-5 19:38
活到老学到老!
作者: 小飞侠888    时间: 2023-4-1 21:22
谢谢分享学习了了




欢迎光临 SolidWorks机械工程师网——最大的SolidWorks学习平台 (https://www.swbbsc.com/) Powered by Discuz! X3.2