word / VBA:无法从表中检索格式化文本

时间:2010-11-09 07:00:11

标签: vba

我使用下面的代码从word文件表生成XML。

Sub exprt() Dim nofT, cnt, tag, btxt As Integer
Dim Rcnt As Long
Dim tit, pTyp, cValu As String
Dim dum As Range
Set a = ActiveDocument.Tables
nofT = ActiveDocument.Tables.Count
Set docold = ActiveDocument

For cnt = 5 To nofT
Selection.TypeText ("")
Selection.TypeParagraph
Selection.TypeText ("")
Selection.TypeParagraph
Set dum = ActiveDocument.Tables(cnt).Cell(2, 1).Range
dum.End = dum.End - 1
tit = dum.Text
tit = LTrim(Right(tit, (Len(tit) - InStr(tit, ":"))))
Selection.TypeText (Chr(9) + "<" + Chr(33) + "[CDATA[" + tit + "]]><" + Chr(47) + "title_text_1>")
Selection.TypeParagraph
Selection.TypeParagraph
Rcnt = a(cnt).Rows.Count
Set dum = ActiveDocument.Tables(cnt).Cell(3, 1).Range
dum.End = dum.End - 1
pTyp = dum.Text
pTyp = LTrim(Right(pTyp, (Len(pTyp) - InStr(pTyp, ":"))))
tag = 1
For btxt = 6 To Rcnt - 1
Set dum = ActiveDocument.Tables(cnt).Cell(btxt, 1).Range.FormattedText
dum.End = dum.End - 1
Selection.TypeText (Chr(9) + "<" + Chr(33) + "[CDATA[" + dum + "]]><" + Chr(47) + "body_text_" + LTrim(Str(tag)) + ">")
Selection.TypeParagraph
Selection.TypeParagraph
tag = tag + 1
Next
Set dum = docold.Tables(cnt).Cell(Rcnt, 1).Range
dum.End = dum.End - 1
Selection.TypeText (Chr(9) + "<" + Chr(33) + "[CDATA[" + dum + "]]><" + Chr(47) + "prompt_text_1>")
Selection.TypeParagraph
Selection.TypeParagraph
Selection.TypeText ("<" + Chr(47) + "data>")
Selection.TypeParagraph
Selection.Extend
Selection.HomeKey Unit:=wdStory
newTxt = ActiveDocument.ActiveWindow.Selection
Selection.Cut
Set dum = docold.Tables(cnt).Cell(1, 1).Range
dum.End = dum.End - 1
Call pub(dum.Text)
Next
End Sub


Sub pub(nme As String)
Dim FolderPath As String
Dim FileName As String
FolderPath = "c:/Chandru/"
FileName = nme & ".xml"
Documents.Add
Selection.Paste
Call bld
ActiveDocument.SaveAs FileName:=FolderPath & FileName, FileFormat:=wdFormatText
ActiveDocument.Close
End Sub

问题:我想添加“&lt; b&gt;&amp;&lt; / b&gt;”对于粗体文本,类似于斜体文本。当我检索表格单元格内容时,我没有得到格式化文本。我如何添加&lt; B个&安培; &LT; I&GT;为了大胆和斜体文字分别??

2 个答案:

答案 0 :(得分:3)

一般来说,我不太确定以这种方式生成XML文件是否是一个非常好的主意,尤其是为数据添加格式。但这不是你的问题。

提取您依赖

的格式化文本
FormattedText
来自Range-object的

。现在你可以使用resultinc Range-object来实现将格式化文本粘贴到文档中的其他位置。但它并没有直接“给你”代码中使用的格式。

您需要做的是为字符解析此FormattedText-range对象字符(带格式)或使用其他方法(见下文)。

示例,使用一些格式输出当前选择中的每个字符

Dim myRange As Range
Dim myChar As Variant

Set myRange = Selection.FormattedText

For Each myChar In myRange.Characters
    Debug.Print myChar.Text, myChar.Bold, myChar.Italic, myChar.Underline
Next

您可以创建一个函数,将您的范围解析为包含HTML格式格式的字符串(即粗体显示为 ... 等)。

可行有点棘手,因为你需要确保你没有创造无效的东西,比如

<b>bold <i>bold italic</b> just italic </i> (no good!)

(Word或大多数浏览器可能不关心,但它确实不再是有效的XML)。

您可以考虑使用其他方法来提取格式化的表格内容。从Word 2003开始,您可以将文档保存为XML格式,您可以尝试在那里提取数据。 Word确实跟踪打开的格式化标签,但与Word一样,你有很多垃圾。

... [extract from an XML-Export; use e.g. Notepad++ to get a pretty-print version]
  <w:body>
    <wx:sect>
      <w:tbl>
        <w:tblPr>
          <w:tblStyle w:val="Tabellengitternetz"/>
          <w:tblW w:w="0" w:type="auto"/>
          <w:tblLook w:val="01E0"/>
        </w:tblPr>
        <w:tblGrid>
          <w:gridCol w:w="9286"/>
        </w:tblGrid>
        <w:tr wsp:rsidR="007A0EF3" wsp:rsidTr="007A0EF3">
          <w:tc>
            <w:tcPr>
              <w:tcW w:w="9286" w:type="dxa"/>
            </w:tcPr>
            <w:p wsp:rsidR="007A0EF3" wsp:rsidRDefault="007A0EF3" wsp:rsidP="007A0EF3">
              <w:r>
                <w:t>Titel </w:t>
              </w:r>
              <w:proofErr w:type="spellStart"/>
              <w:r wsp:rsidRPr="007A0EF3">
                <w:rPr>
                  <w:b/>
                </w:rPr>
                <w:t>Bold</w:t>
              </w:r>
              <w:proofErr w:type="spellEnd"/>
              <w:r>
                <w:t/>
              </w:r>
              <w:proofErr w:type="spellStart"/>
              <w:r wsp:rsidRPr="007A0EF3">
                <w:rPr>
                  <w:i/>
                </w:rPr>
                <w:t>Italic</w:t>
              </w:r>
              <w:proofErr w:type="spellEnd"/>
              <w:r>
                <w:t/>
              </w:r>
              <w:proofErr w:type="spellStart"/>
              <w:r wsp:rsidRPr="007A0EF3">
                <w:rPr>
                  <w:b/>
                  <w:i/>
                </w:rPr>
                <w:t>BoldItalic</w:t>
              </w:r>
              <w:proofErr w:type="spellEnd"/>
            </w:p>
          </w:tc>
        </w:tr>
...

通过不重要的位挖掘,您可以找到文本正文,表格,文本和相应的格式。

但是就像大多数这样的问题一样,这一切都归结为你需要多长时间来完成这项任务(你想要为自动化解决方案编程需要多少努力),读取了多少数据等等。

HTH 安德烈亚斯

答案 1 :(得分:0)

您必须单独检查范围中每个字符的字符格式。