Excelファイル(*.xls, *.xlsx)を読み込むDataPluginの作成

更新しました Mar 3, 2023

環境

ソフトウェア

  • DIAdem

ExcelファイルをLabVIEW Report Generation Toolkit, DIAdemで読み込む場合、Active XによるExcelアプリケーションを介した読み込み方法が使用される場合が多いです。しかし、この方法はActive Xが使用可能である事、Excelアプリケーションが使用可能である事などの条件が満たされている必要があり、また、SystemLinkのように複数のファイルを同時に読み込む事を想定しているアプリケーションではActive X自体、使用できない為、データの読み込みに別の方法を使用する必要があります。

このような場合、VBScriptで作成されたDataPluginが有効な対処方法となります。ここではExcelファイル(*.xls, *.xlsx)を読み込むDataPluginの作成の手順について確認します。

DataPluginの作成はDIAdem(VBScript), VisualStudioCode (Python), LabVIEW (DataPlugin SDK)で行うことができ、各開発環境におけるDataPluginの作成方法については下記の資料が存在します。

DataPluginの作成方法はDIAdemヘルプのプログラミングリファレンス >> オブジェクト指向スクリプトインタフェース >> DataPlugin >> Exampleから確認することができます。
 
DIAdemHelpDataPlugin.png


こちらの記事の手順に従い、DIAdem上でVBScriptのDataPluginを作成します。ここでは下記のスクリプトを使用します。
 
Option Explicit  'Forces the explicit declaration of all the variables in a script.

Sub ReadStore(Workbook)
  ' Extract document properties
  Root.Properties.Add "Author", Workbook.WorkbookInfo.Author
  Root.Properties.Add "Title",  Workbook.WorkbookInfo.Title
  ' Loop over all sheets of the current workbook
  Dim oSheet
  For Each oSheet In Workbook.Sheets
    If Not SkipSheet(oSheet) Then
      ' Add a new group for each sheet
      Dim oGroup
      Set oGroup = Root.ChannelGroups.Add(oSheet.Name)
      ' Assume the first row contains the channel names
      ' Create a cell block reader starting at second row, first column
      Dim oBlock
      Set oBlock = oSheet.GetCellBlock(2, 1)
      ' Loop over all defined columns
      Dim iColumnIndex
'      For iColumnIndex = 1 To oSheet.MaxPosition.Column
      For iColumnIndex = 1 To 10
        ' Extract the channel name from the first row
        Dim sChannelName
        sChannelName = oSheet.GetCellValue(1, iColumnIndex)
        ' Create a DirectAccessChannel for each column
        Dim oBlockChn
        Set oBlockChn = oBlock.Channels.Add(sChannelName)
        ' Assign the DirectAccessChannel to the group
        oGroup.Channels.AddDirectAccessChannel(oBlockChn)      
      Next
    End If
  Next
End Sub

Function SkipSheet(Sheet)
  SkipSheet = False
  ' Skip the first sheet if the file was written by TDM Excel Add-In 
'If Sheet.GetCellValue(1,1) = "Root Name" Then SkipSheet = True
  If Sheet.Index = "1" Then SkipSheet = True
  
  'Skip empty sheets
  If ((Sheet.MinPosition.Column = Sheet.MaxPosition.Column) And _
      (Sheet.MinPosition.Row    = Sheet.MaxPosition.Row   )    ) Then SkipSheet = True
End Function 

この記事の下部のAttachmentsからExcelDataPluginC1.zipをダウンロードする事でDataPluginのスクリプト、挙動、サンプルデータの読み込みの確認を行うことができます。サンプルデータ(test.xl)は下記のようにSheet1にはデータは存在せず、Dataという名前のSheet2に10列のデータが存在します。その為、下記のようにSkipSheetのFunctionを定義し、Sheet indexが1のもの(Sheet1)はデータの読み込みを行わない設定を追加しています。また、10列分のデータの読み込みをForループで指定します。

 
DataAndDataPlugin.png

DIAdemを使用し、登録されたDataPluginのテストを行う場合、NAVIGATORにおいてこの記事の下部のAttachmentsのtest.xlsもしくはtest.xlsxの読み込みを行うことができます。データの読み込みを行うと下記のように10チャンネル分のデータがData Portalにロードされます。
 
Exceldataplug.png