我已经提到过这个链接:apply-style-to-specific-text-in-a-styled-paragraph-using-docx4j。我采取了另一种方法。 以下是我使用docx4j查找和应用字符样式的步骤:
例如,我在下面的文本中搜索文本表1:
II< 1(极低风险组)。两组的人群特征和术后即刻不良事件如表1所示。在术前特征中,在极低风险患者中没有活动性心内膜炎,透析或既往心脏手术(重做)的情况。在比较风险组时,低风险患者年龄越大,女性患病率越高,体外循环时间越长,交叉钳夹时间越长,冠状动脉手术的分离程度低于极低风险患者。
在拆分运行内容之前:
< w:r w:rsidRPr =" 00F83849"> < W:RPR> < W:朗 瓦特:VAL ="的en-US" /> < / W:RPR> < W:T>&的EuroSCORE LT; / W:T> < / W:R> < w:proofErr w:type =" spellEnd" /> < W:R t 瓦特:rsidRPr =" 00F83849"> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> II< 1(非常 低风险群体)。人口特征和即时 两组术后不良事件见表1。 在术前特征中,没有活动的情况 心内膜炎,透析或先前的心脏手术(重做)非常 低风险患者。在比较风险组时,低风险患者是 年龄较大,女性患病率较高,体外循环较长 和交叉钳夹时间,以及较少孤立的冠状动脉手术 非常低风险的患者。< / w:t> < / W:R>
分割后(我只是复制部分文字):
< W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> E< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> u< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> r< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> o< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> S< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> C< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> O< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> R< / w:t> < / W:R> < W:R> < W:RPR> < w:lang w:val =" en-US" /> < / W:RPR> < w:t xml:space ="保留"> E< / w:t> < / W:R> < w:proofErr w:type =" spellEnd" />
我能够提取" 表1 "使用以下代码:
public static P ApplyCharStyleOccurBaseInParagraph(P p,ObjectFactory factory, String search,
String CharStyle, boolean matchCase, int occurence) throws Exception
{
String[] searchArray = search.split("(?!^)");
int occurCount = 0;
ClassFinder runs = new ClassFinder(R.class);
new TraversalUtil(p,runs);
ClassFinder texts = new ClassFinder(Text.class);
new TraversalUtil(p,texts);
StringBuilder sb = new StringBuilder();
for (Object text : texts.results)
{
sb.append(((Text)text).getValue());
}
if (sb.toString().contains(search)|| (!matchCase && sb.toString().toUpperCase().contains(search.toUpperCase())))
{
System.out.println("Strings Match !!");
boolean cont = false;
for (int i = 0; i <= (runs.results.size()) - searchArray.length; ++i)
{
boolean match = true;
for (int c = 0; c < searchArray.length; ++c)
{
R CurrRunNode = (R) runs.results.get(i + c);
String textElement = "";
String nextTextElement = "";
R nextRunNode = null;
int nextRunIndex = c + 1;
ClassFinder Currtext = new ClassFinder(Text.class);
new TraversalUtil(CurrRunNode,Currtext);
if (Currtext.results.size()> 0)
{
for(Object txt : Currtext.results)
{
textElement += ((Text)txt).getValue();
}
}
if (textElement == "")
{
ClassFinder currTempText = new ClassFinder(Text.class);
new TraversalUtil(CurrRunNode,currTempText);
if(CurrRunNode != null && currTempText.results.size() == 0)
{
i++;
c--;
continue;
}
else
{
match = false;
cont = true;
break;
}
}
if (textElement.equals(searchArray[c].toString()))
{
logger.info("Match String run index :"+((ContentAccessor) ((R) runs.results.get(i + c)).getParent()).getContent().indexOf((R) runs.results.get(i + c)));
if(nextRunIndex < searchArray.length)
{
nextRunNode = (R) runs.results.get(i + nextRunIndex);
ClassFinder nextRuntext = new ClassFinder(Text.class);
new TraversalUtil(nextRunNode,nextRuntext);
if (nextRunNode != null && nextRuntext.results.size()> 0)
{
/*For testing purpose*/
/*For testing purpose*/
for(Object txt1 : nextRuntext.results)
{
nextTextElement += ((Text)txt1).getValue();
}
}
if(nextTextElement == "") {
//For testing purpose
if(nextRunNode != null && nextRuntext.results.size() == 0)
{
continue;
}
else
{
match = false;
cont = true;
break;
}
}
if (nextTextElement.equals(searchArray[nextRunIndex].toString()))
{
continue;
}
else
{
match = false;
cont = true;
break;
}
}
else
{
continue;
}
}
if (!matchCase && textElement.toUpperCase()
.equals(searchArray[c].toString().toUpperCase())) {
continue;
}
match = false;
cont = true;
break;
}
if (match)
{
if (occurence == occurCount)
{
for (int c = 0; c < searchArray.length; c++)
{
R CurrRunNode = (R) runs.results.get(i + c);
RPr runProps = CurrRunNode.getRPr();
if (runProps != null)
{
if(runProps.getRStyle() != null)
{
runProps.getRStyle().setVal(CharStyle);
}
else
{
RStyle rstyle = factory.createRStyle();
rstyle.setVal(CharStyle);
runProps.setRStyle(rstyle);
}
}
else if (runProps == null)
{
RPr rPr = factory.createRPr();
RStyle rstyle = factory.createRStyle();
rstyle.setVal(CharStyle);
rPr.setRStyle(rstyle);
CurrRunNode.setRPr(rPr);
}
/*
* Find and apply character style for the first
* occurence
*/
cont = false;
/*For testing purpose*/
logger.info("char currRun"+c+": "+((ContentAccessor) (CurrRunNode).getParent()).getContent().indexOf(CurrRunNode)+XmlUtils.marshaltoString(CurrRunNode));
}
}
occurCount++;
}
if (!cont)
{
break;
}
}
}
return p;
}
上面的代码本身应该能够应用于找到的文本的字符样式。但它在这个w:r的分割形式
中应用整个文本的字符样式&lt; w:r w:rsidRPr =&#34; 00F83849&#34;&gt; &LT; W:RPR&GT; &LT; W:朗 瓦特:VAL =&#34;的en-US&#34; /&GT; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; II &LT; 1(极低风险组)。人口特征与 两组患者的术后即刻不良事件均显示于 表1.在术前特征中,没有任何病例 非常活跃的心内膜炎,透析或先前的心脏手术(重做) 低风险患者。在比较风险组时,低风险患者是 年龄较大,女性患病率较高,体外循环较长 和交叉钳夹时间,以及较少孤立的冠状动脉手术 非常低风险的患者。&lt; / w:t&gt; &LT; / W:R&GT;
而不仅仅适用于这些w:r s(运行):
&LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; T&lt; / w:t&gt; &LT; / W:R&GT; &LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; a&lt; / w:t&gt; &LT; / W:R&GT; &LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; b&lt; / w:t&gt; &LT; / W:R&GT; &LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; l&lt; / w:t&gt; &LT; / W:R&GT; &LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; e&lt; / w:t&gt; &LT; / W:R&GT; &LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; &LT; / W:T&GT; &LT; / W:R&GT; &LT; W:R&GT; &LT; W:RPR&GT; &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt; &lt; w:lang w:val =&#34; en-US&#34; /&gt; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; 1&lt; / w:t&gt; &LT; / W:R&GT;
我也在这里复制我用于拆分运行的代码:
public static P SplitRuns(P paragraph, ObjectFactory factory,WordprocessingMLPackage wordMLPackage,File outputFile) throws Exception
{
ClassFinder runs = new ClassFinder(R.class);
new TraversalUtil(paragraph, runs);
for (Object r : runs.results)
{
R run = (R)r;
ContentAccessor parent = (ContentAccessor)run.getParent();
List<Object> childElements = getAllchildObj(run);
/*For testing purpose*/
/*For testing purpose*/
if (childElements.size() > 0)
{
logger.info("Origianl Run Index before splitting: "+parent.getContent().indexOf(run));
for(Object child : childElements)
{
int currentRunIndex = parent.getContent().indexOf(run);
if(child.getClass().getName() == "org.docx4j.wml.RPr")
{
continue;
}
if(child.getClass().getName() == "org.docx4j.wml.Text")
{
String[] textElementString = ((Text)child).getValue().split("(?!^)");
for(int i = 0; i <= textElementString.length - 1; i++)
{
currentRunIndex = parent.getContent().indexOf(run);
R newRun = factory.createR();
RPr runProps = factory.createRPr();
runProps = run.getRPr();
if(runProps != null)
{
newRun.setRPr(runProps);
}
Text t = factory.createText();
JAXBElement<org.docx4j.wml.Text> textWrapped = factory.createRT(t);
t.setSpace("preserve");
t.setValue(textElementString[i]);
newRun.getContent().add(t);
/*For testing purpose*/
logger.info("Newly created run Index: " + currentRunIndex);
/*For testing purpose*/
parent.getContent().add(currentRunIndex, newRun);
parent.getContent().set(currentRunIndex, newRun);
}
}
else
{
currentRunIndex = parent.getContent().indexOf(run);
R newRun = factory.createR();
RPr runProps = factory.createRPr();
runProps = run.getRPr();
if(runProps != null)
{
newRun.setRPr(runProps);
}
newRun.getContent().add(child);
/*For testing purpose*/
logger.info("Newly created run Index: " + currentRunIndex);
/*For testing purpose*/
parent.getContent().add(currentRunIndex, newRun);
parent.getContent().set(currentRunIndex, newRun);
}
}
}
logger.info("Original run Index before Deleting: " + parent.getContent().indexOf(run));
parent.getContent().remove(run);
}
return paragraph;
}
有人可以帮我解决这个问题吗?