none
VB.Net內,抓取word中的Cell中的特定文字。 RRS feed

  • 問題

  • 我在VB.net內,用word的元件做表格並可以輸出成文件檔。

    但是,表格中某個欄位的文字,有一些比較重點的部分,想抓出來變成黑體字。

    我試了很久,就是沒辦法做到。

    假設這個表格是myTable,文字是在cell(2,1)裡十個字中的第四個字到第六個字。

    是用myTable.cell(2,1).range.move(wdCharacter,4)<-----類似的寫法,因為,我也不知道要用哪個,也不知道有沒有試錯方向。

    請教一下,要如何才能做到呢?

     

    2007年4月13日 下午 03:28

解答

  • Word 這部份其實不容易定位,只能勤 K 線上手冊,我大概兩年沒碰,有些東西已經忘了

     

    Selection 是啥可以用 Type 來抓:

    mkAngryMSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1028\vbawd10.chm::/html/woproType1.htm

     

    是哪個 Range ,我印象中是沒有。所以一開始說不容易定位,用 Find 反而比較單純。

     

    但是有 Start/End 可以抓位置:

    mkAngryMSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1028\vbawd10.chm::/html/woproStart1.htm

     

    我比較偏好輸出 xml 格式,比較單純,而且不用使用 Automation,不過這要回頭去念 WordML ,先前也有些相關討論,如果不想唸 WordML,唸 WordML 輸出一個簡單的範例大概要一天,MSDN for Visual Studio 2005 裡面也有 WordML 的說明,可以參查,Word 也支援 html 格式,也可以輸出為 html 然後取名為 xxx.doc ,這種是比較偷雞的方法。

    2007年4月13日 下午 04:43
    版主

所有回覆

  • 你可以先錄製一段巨集後,再轉寫成 VBNET 的語法。

     

    比如說在 Word 內選錄製巨集後,用搜尋找到指定文字,變粗體,停止錄製巨集,再把該段程式碼貼到 VBNET 修改語法成為 VBNET 能跑的。

    2007年4月13日 下午 04:21
    版主
  • 嗯,我大部分程式都是用錄巨集的方式下去改。^^,word…畢竟不熟。

    不過…我可能沒有說清楚我的問題。

    我指的“特定文字”,是特定位置…但是,不是“同樣”內容的文字。

    也就是說,每次文件產生的時候,“這個位置”的文字會不同,但我是要針對這個位置的文字來做標重點的動作。

     

    我用巨集錄下來我移動到該位置…

    都是出現

    .Selection move...bulabula...

    可是,我搞不清楚這個.Selection,是哪個range的?

     

    2007年4月13日 下午 04:27
  • Word 這部份其實不容易定位,只能勤 K 線上手冊,我大概兩年沒碰,有些東西已經忘了

     

    Selection 是啥可以用 Type 來抓:

    mkAngryMSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1028\vbawd10.chm::/html/woproType1.htm

     

    是哪個 Range ,我印象中是沒有。所以一開始說不容易定位,用 Find 反而比較單純。

     

    但是有 Start/End 可以抓位置:

    mkAngryMSITStore:C:\Program%20Files\Microsoft%20Office\OFFICE11\1028\vbawd10.chm::/html/woproStart1.htm

     

    我比較偏好輸出 xml 格式,比較單純,而且不用使用 Automation,不過這要回頭去念 WordML ,先前也有些相關討論,如果不想唸 WordML,唸 WordML 輸出一個簡單的範例大概要一天,MSDN for Visual Studio 2005 裡面也有 WordML 的說明,可以參查,Word 也支援 html 格式,也可以輸出為 html 然後取名為 xxx.doc ,這種是比較偷雞的方法。

    2007年4月13日 下午 04:43
    版主
  • OK,我先把type研究看看…是哪個部分的selection。

    看能不能做出來再說…

    先謝了。

     

    2007年4月13日 下午 04:46
  • 嗯,我會了…

    原來,直接用word的selection就行了…

    不需要把cell選起來。

    巨集錄的那個selection也是word的…(好像,selection本來就是word的)

    而我之前一直出錯,是因為我先做了cell的range.select的動作。

    所以,一直沒辦法抓到該文字。

     

     .Cell(4, 1).Range.InsertAfter("所得卦資訊:")
                .Cell(4, 1).SetWidth(60, Word.WdRulerStyle.wdAdjustSameWidth)
                .Cell(4, 1).Select()
                oWord.Selection.Style = "項目"
                .Cell(4, 2).Range.InsertAfter("本例起卦得『" + getrow.Item("卦名") + "』變在" + getrow.Item("爻位") + ",外應屬" + getrow.Item("外應") + "。")
                oWord.Selection.MoveStart(Word.WdUnits.wdCharacter, 6)
                oWord.Selection.MoveRight(Word.WdUnits.wdCharacter, 2, Word.WdMovementType.wdExtend)

     

    這是其中一段程式碼…跟大家分享一下我的心得。

    我的做法是,一列一列的畫下來…所以,我在我要抓的這個欄位下方,直接字oword.selection…就可以抓到了。

    而之前不知道,一直把目前這一欄的range選取起來…所以,一直抓不到。

    就這樣了…謝謝璉兄,您的回覆。

    2007年4月13日 下午 06:11
  • ?

    Selection 是代名詞物件,所有的物件均可 Select ,但是必須要有 Select 動作後,Selection 物件才會參照到東西。

     

    你的程式碼有 Select 啊~

              .Cell(4, 1).Select()
                oWord.Selection.Style = "項目"

    2007年4月13日 下午 11:58
    版主
  • 嗯…其實,我也是不知其所以然。

    不過…這個Select執行的時候,是focus在Cell(4,1)的。

    但是,在oword.selection之前…我還插入一個欄位,就是Cell(4,2)。

    我並不是很清楚word在運作的時候,是不是會在這時focus到我這個Cell(4,2)欄位。

    但是,我這樣做是work的,因為,之前的作法是把Select放在cell(4,2), 但是,這樣做,它並不會選取到裡面的文字,而是以欄的單位做程動?(雖然,我的selection.move的unit是設成wdcharacter,但還是一樣)

    加上,我照您講的方法在word裡面,試用巨集,呼叫Selection.Type,它回傳的值是move的unit的index值。

    我『感覺』…selection似乎是這個word的物件(所以,錄巨集的時候前面不會出現它的母階層)…

    所以,我就想,該不會不用select,直接做move的動作?所以,把Cell(4,2)的Select拿掉。

    就成功了。

     

    我是不太清楚,我的觀念正不正確。

    下面是我另一段程式碼…

     

             With .Cell(5, 1)
                    .Merge(mytb.Cell(7, 1))
                    .Range.InsertAfter("起卦日資料:")
                    .VerticalAlignment = Word.WdCellVerticalAlignment.wdCellAlignVerticalTop
                    .Select()
                End With
                oWord.Selection.Style = "項目"
                .Cell(5, 1).SetWidth(60, Word.WdRulerStyle.wdAdjustSameWidth)
                .Cell(5, 2).Range.InsertAfter(CDate(getrow.Item("占卦日期")).ToShortDateString + getrow.Item("時間"))
                .Cell(6, 2).Range.InsertAfter(DateEffect.DateGanZhi + getrow.Item("時間"))
                .Cell(7, 2).Range.InsertAfter("該日月建為:" + DateEffect.YueJian + " 日辰為:" + DateEffect.RiChen + " 空亡為:" + DateEffect.KongWang)
                With oWord.Selection
                    .MoveDown(5, 2, 0)
                    .MoveStart(1, 6)
                    .MoveRight(1, 1, 1)
                    .Font.Bold = True
                    .Font.Color = Word.WdColor.wdColorLavender
                    .MoveRight(1, 6, 0)
                    .MoveRight(1, 1, 1)
                    .Font.Bold = True
                    .Font.Color = Word.WdColor.wdColorLavender
                    .MoveRight(1, 6, 0)
                    .MoveRight(1, 2, 1)
                    .Font.Bold = True
                    .Font.Color = Word.WdColor.wdColorLavender
                End With

     

    跟上一段,比較不一樣的是,我把Cell(5,1)到Cell(7,1)合成一個欄位。(整個Table,我一開始是設成兩個column)

    我不太清楚,為何我跑到

       .Cell(7, 2).Range.InsertAfter("該日月建為:" + DateEffect.YueJian + " 日辰為:" + DateEffect.RiChen + " 空亡為:" + DateEffect.KongWang)
       這行程式碼之後,在word裡的游標會停在Cell(5,2)的那一欄。

    這段也讓我抓錯誤抓了很久…才發現。

    所以,在oword.selection裡面,我還得下移游標,而且,還得選wdline(值5),而不是wdcell(值12)。

     

    這是我試做的心得,嗯…我其實是不太清楚word的語法和結構,大部分都是參照巨集錄製和查裡面的VBA說明,實作出來的。

    可以說…是試出來的。

    剛剛也在word試了一下…沒有range或select的動作,看selection是不是可以跑。

    結果,是可以的。

    我想…或許在沒有select的時候,selection的單位是直接以游標為單位。

    當有select的時候,會變成一這個select的物件為單位?

    不知道這樣想對不對(^ ^")

    如有錯,還請糾正。

    2007年4月14日 上午 05:33
  • 想請問兩位大哥 如果要寫有關word的程式像在word中 畫 table 還要做cells merge可以參考什麼資料或者如何去寫,可否指引小弟一個方向

    我看msdn裡很少範例有關cells merge的範例程式,只有一篇有畫tables ,像有很多selection 及range的關念物件架構不知如何開始!

    謝謝回答

    2007年5月14日 下午 03:33
  • 選單 工具 巨集 錄製巨集 是你最好的導師

     

    錄製完後,搭配 VBA 線上手冊看該段程式碼即可。

     

    註:VBA 線上手冊預設不安裝,請拿出安裝光碟用新增元件加入。

    2007年5月15日 上午 01:30
    版主