xmlをデータベースに
Microsoft Wordを操作 でとりあえず情報収集は可能になった。
ここではXMLをデータベースにして処理する方法をメモしておく。
参考サイト
XMLの作成 〜LinqtoXML利用〜
Imports Microsoft.Office.Interop Imports System.Runtime.InteropServices.Marshal Imports System.Xml Imports System.Xml.Linq --- Module test Sub test() Dim oWord As Word.ApplicationClass oWord = CreateObject("Word.Application") oWord.Visible = True Dim doc As New XDocument() Dim Dec As New XDeclaration("1.0", "UTF-8", True) 'XML宣言の作成 doc.Declaration = Dec Dim root As New XElement("root") doc.Add(root) 'ルートノードを追加 Dim xItem, xRow, xColumn, xText As XElement '各エレメントを定義 Dim FilePath As String = String.Empty For Each FilePath In Form1.FL 'FLに処理するファイルのフルパスを入れておく Dim wDoc As Word.Document 'ワードドキュメントを定義 wDoc = oWord.Documents.Open(FilePath) 'ドキュメントを開く Dim temStr, smartStr, sortID As String Dim wRow, wCol, Category, MaxRow As Integer sortID = "none" : MaxRow = 0 'MaxRow・・・Table が複数ある場合、ForEach で次の Table に移ると.RowIndex が1に戻ってしまうため設定した。 For Each wTable As Word.Table In wDoc.Tables 'ドキュメントの表(Tables)の1つを取得 For Each wCell As Word.Cell In wTable.Range.Cells '表内の1つ(Cell)を取得 temStr = Replace(wCell.Range.Text, vbCr & Chr(7), String.Empty) '値を取得する場合は「Value」ではなく「.Range.Text」、改行と・を置換 If temStr = (String.Empty) OrElse (temStr = "") Then Continue For '文字列が空なら処理を飛ばし、次の文字列へ wRow = wCell.RowIndex + MaxRow : wCol = wCell.ColumnIndex '行・列を取得 smartStr = Form1.textSmart(temStr) '文字列整形ファンクション Category = Form1.fnConJudge(smartStr) 'カテゴリ判別ファンクション sortID = Form1.fnSortID(smartStr) 'sortID判別ファンクション '□□□xmlにデータを入力していく xItem = New XElement("Item") 'Itemノードのインスタンスを作成 xItem.SetAttributeValue("Category", Category) 'ItemノードにCategory属性と属性値としてCategoryを追加 root.Add(xItem) 'rootノードにItemノードを子ノードとして追加 xText = New XElement("Text") 'Textノードのインスタンスを作成 xText.SetAttributeValue("smartText", smartStr) 'TextノードにsmartText属性と属性値としてsmartStrを追加 xItem.Add(xText) 'ItemノードにTextノードを子ノードとして追加 xRow = New XElement("Row") 'Rowノードのインスタンスを作成 xRow.Value = wRow 'Rowノードに値を追加 xItem.Add(xRow) 'ItemノードにRowノードを子ノードとして追加 xColumn = New XElement("Column") 'Columnノードのインスタンスを作成 xColumn.Value = wCol 'Columnノードに値を追加 xItem.Add(xColumn) 'ItemノードにColumnノードを子ノードとして追加 Next wCell MaxRow = wRow Next wTable wDoc.Close(SaveChanges:=False) 'ドキュメントを閉じる(変更は無視する) ReleaseComObject(wDoc) 'メモリ開放 Next oWord.Quit() 'ワードアプリケーション終了 ReleaseComObject(oWord) 'メモリ開放 oWord = Nothing '□□□クエリを作成 Dim Query2 = From C In root.Elements("Item") Where (C.@Category = "1") OrElse (C.@Category = "2") _ Let Row = CInt(C.Element("Row").Value) _ Let Col = CInt(C.Element("Column").Value) + 1 _ Let Col2 = CInt(C.Element("Column").Value) + 2 _ From D As XElement In root.Elements("Item") _ Where D.Element("Row").Value = Row AndAlso D.Element("Column").Value = Col _ From F As XElement In root.Elements("Item") _ Where F.Element("Row").Value = Row AndAlso F.Element("Column").Value = Col2 _ Select base = C.Element("Text").@smartText, target = D.Element("Text").@smartText, _ target2 = F.Element("Text").@smartText, Cate = C.@Category, FName = C.@FileName, SID = C.@sortID 'From C 以下 'ItemノードのCategory属性が1または2なら 'Rowの値はItem/Rowノードの値を取得 'Colの値はItem/Columnノードの値に1を加算したものを取得 'Col2の値はItem/Columnノードの値に2を加算した物を取得 'From D 以下 'Rowノードの値がRowと同じ且つColumnノードの値がColと同じItemノードを指定 'From F以下 'Rowノードの値がRowと同じ且つColumnノードの値がCol2と同じItemノードを指定 'Select 以下 'base:ベースアイテム 'target:RowおよびColが一致したテキスト 'target2:RowおよびCol2が一致したテキスト 'Cate:Cateboryテキスト 'FName:FileNameテキスト 'SID:sortIDテキスト Dim wDataList As New List(Of String) 'データリストを作成 '□□□クエリからデータをリストへ入力 For Each Item In Query2 'データリストにデータを入れていく Select Case (Item.Cate) Case 1 wDataList.Add(Item.base & "@" & Item.target & "@-") Case 2 wDataList.Add(Item.base & "@" & Item.target & "@" & Item.target2) End Select Console.WriteLine(Item) Next wDataList.Sort() End Sub End Module