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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

好品数字
好品数字
查看: 6269|回复: 17
打印 上一主题 下一主题

取出BOM表资料输出至Excel(VB.NET)

  [复制链接]

7

主题

51

帖子

38

金币

天使

Rank: 2Rank: 2

积分
118
QQ
跳转到指定楼层
楼主
发表于 2018-5-24 16:41:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
制作纸本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)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 转播转播 分享教程|习题|模型|技巧 点赞点赞 拍砖拍砖
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复

使用道具 举报

1

主题

36

帖子

9

金币

天使

Rank: 2Rank: 2

积分
53
QQ
沙发
发表于 2018-5-27 04:08:27 | 只看该作者
这个我在公司有前辈制作一个类似的,也有将所有模组的BOM,整合成一张总表的EXCEL巨集,但他的作法比较麻烦,必须先自行调适表格格式,后来我就自己做另一个较方便的版本,过二天,我把内容整理整理,再分享出来!
SolidWorks机械工程师网
提示:建议使用谷歌浏览器浏览本网站!如单击这里下载!否则,可能无法下载附件文件!(支持大多数版本的谷歌浏览器,支持360和QQ浏览器的极速模式,即谷歌内核模式,使用IE和Edge浏览器,浏览个别网页以及下载文件时,会误报“***不安全”,此时需要单击“继续访问此不安全站点(不推荐)”才可以继续下载,另外,本网站不含任何不安全的文件,已联系微软公司解决,纯属IE和Edge浏览器误报)
回复 支持 反对

使用道具 举报

9

主题

55

帖子

52

金币

天使

Rank: 2Rank: 2

积分
159
QQ
板凳
发表于 2018-7-7 20:12:04 | 只看该作者
rock大不会是G&G的员工吧??以前我还在职的时候就是这样做,因为该公司的习惯是每个组件单独出BOM,但最终还是需要一张总BOM

加上当时刚开始接触巨集,所以编写了两个Excel的档案给研发用。功能就像您说的一样
但是并不用自己调适表格,因为已经都设定好了
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

8

主题

43

帖子

50

金币

天使

Rank: 2Rank: 2

积分
149
QQ
地板
发表于 2018-7-17 01:51:33 | 只看该作者
大佬真厉害,这样就被你发现了!你所指的应该就是"模组BOM范本"和"总表BOM范本"吧!但是SW转出的EXCEL不是要先复制贴入"模组BOM范本",然后加框线,然后将档名复制到A1后才能整合至总表吗?这样如果有10个模组,同样的事情就要做10次了,至少我去的时候,大家是这样做的.....,因为范本都是被保护,我只好循着前辈的思维,重新做过,并简化成一键完成,但还是遇到一些问题,例如明明2016版执行都OK,可是2010或2007都会出现问题,不过也都一一克服了!有你们这些前辈真好,不然,我现在出图,可能还呆呆的一个个编辑,进到G&G,也让我进步很多,视野也开阔许多!!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

5

主题

42

帖子

33

金币

天使

Rank: 2Rank: 2

积分
115
QQ
5#
发表于 2018-7-20 00:27:00 | 只看该作者

   经典案例图书
这两天在搞BOM,正好需要这些讯息先谢谢了 再来研究研究
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

3

主题

49

帖子

23

金币

天使

Rank: 2Rank: 2

积分
100
QQ
6#
发表于 2018-7-21 10:51:59 | 只看该作者
DisplayedText Property (ITableAnnotation)
主要是用这个指令捞资料,其他程式码都只是前置或辅助而已
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

2

主题

42

帖子

13

金币

天使

Rank: 2Rank: 2

积分
74
QQ
7#
发表于 2018-7-27 18:17:59 | 只看该作者

   经典案例图书
我比较好奇的事,你都怎么去TRY这些API的
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

6

主题

43

帖子

38

金币

天使

Rank: 2Rank: 2

积分
129
QQ
8#
发表于 2018-8-5 03:31:39 | 只看该作者
把API Help的范例复制下来执行,如果可以出现预期的结果
就用逐步执行看所有变数的资料变化,观察API的工作原理
或是把几行可能是重点的程式码去掉,看看有没有影响
这是比较能够深入熟悉指令的方法,但是很花时间

而且前提是""你要先知道你要达成的目标需要用哪个指令""
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

3

主题

47

帖子

22

金币

天使

Rank: 2Rank: 2

积分
100
QQ
9#
发表于 2018-8-6 01:25:20 | 只看该作者
我都是用Solidworks自带的材料明细表,在明细表内添加些公式。基本满足使用
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

2

主题

499

帖子

55

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2093

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

10#
发表于 2021-12-25 12:35:38 | 只看该作者
下载下来看看,应该会有用!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

1

主题

421

帖子

361

金币

长老

Rank: 6Rank: 6Rank: 6

积分
1773

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

11#
发表于 2021-12-28 20:45:32 | 只看该作者
很不错,顶一下!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

2

主题

141

帖子

108

金币

堂主

Rank: 4

积分
653

最佳新人活跃会员热心会员宣传达人灌水之王

12#
发表于 2021-12-29 15:47:30 | 只看该作者
看着不错,不会用呀
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

123

帖子

0

金币

堂主

Rank: 4

积分
868

最佳新人活跃会员热心会员宣传达人灌水之王

13#
发表于 2022-3-14 17:07:23 | 只看该作者
完全看不懂的路过
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

721

帖子

73

金币

传奇

Rank: 8Rank: 8

积分
5375

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

14#
发表于 2022-5-28 22:30:39 | 只看该作者

大佬真厉害,这样就被你发现了!你所指的应该就是"模组BOM范本"和"总表BOM范本"吧!但是SW转出的EXCEL不是要先复制贴入"模组BOM范本",然后加框线,然后将档名复制到A1后才能整合至总表吗?这样如果有10个模组,同样的事情就要做10次了,至少我去的时候,大家是这样做的.....,因为范本都是被保护,我只好循着前辈的思维,重新做过,并简化成一键完成,但还是遇到一些问题,例如明明2016版执行都OK,可是2010或2007都会出现问题,不过也都一一克服了!有你们这些前辈真好,不然,我现在出图,可能还呆呆的一个个编辑,进到G&G,也让我进步很多,视野也开阔许多!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

39

帖子

28

金币

天使

Rank: 2Rank: 2

积分
142

最佳新人活跃会员宣传达人

15#
发表于 2022-5-29 12:40:38 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

下载看看················
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

1

主题

786

帖子

441

金币

长老

Rank: 6Rank: 6Rank: 6

积分
2175

最佳新人活跃会员热心会员宣传达人灌水之王突出贡献

16#
发表于 2022-5-30 19:32:16 | 只看该作者

   经典案例图书
SW机械工程师网,找到组织了!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

30

帖子

4

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
208

最佳新人活跃会员宣传达人

17#
发表于 2023-3-5 19:38:42 | 只看该作者
加入QQ群
参与讨论和学习

SolidWorks技术交流群

或扫描二维码加入

活到老学到老!
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

0

主题

79

帖子

11

金币

侠客

Rank: 3Rank: 3Rank: 3

积分
256

最佳新人活跃会员热心会员宣传达人

18#
发表于 2023-4-1 21:22:28 | 只看该作者

   经典案例图书
谢谢分享学习了了
SolidWorks机械工程师网
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭 卷起
关闭 卷起

手机版|小黑屋| GMT+8, 2024-5-15 06:01 , Processed in 0.280364 second(s), 36 queries .

SolidWorks机械工程师网 ( 鲁ICP备14025122号-2 ) 鲁公网安备 37028502190335号

声明:本网言论纯属发表者个人意见,与本网立场无关。
如涉版权,可发邮件: admin@swbbsc.com

快速回复 返回顶部 返回列表