Spire.Doc is a professional Word .NET library specifically designed for developers to create, read, write, convert and print Word document files. Get free and professional technical support for Spire.Doc for .NET, Java, Android, C++, Python.
Fri May 06, 2011 10:08 am
Hi,
I want to replace some text (a keyword) with a new Bookmark (with some other text).
So I tried...
- Code: Select all
//text is the keyword to "replace" and is located everywhere in my document
TextRange textRange = text.GetAsOneRange();
Paragraph paragraph = textRange.OwnerParagraph;
int index = paragraph.ChildObjects.IndexOf(textRange);
if (index != -1){
//
//is this the correct way ????? :(
//
paragraph.AppendBookmarkStart(bookName);
paragraph.AppendText(sVal);
paragraph.AppendBookmarkEnd(bookName);
paragraph.ChildObjects.RemoveAt(index);
paragraph.ChildObjects.Insert(index, paragraph);
}
The keyword text is replaced with the sVal text
but I lose the format!!.
How can I do this?
THANKS
-
michelap
-
- Posts: 6
- Joined: Mon Jan 17, 2011 7:44 am
Tue May 10, 2011 3:32 am
Dear michelap,
Thans for your query!
Maybe you can try this
- Code: Select all
paragraph.Replace(string matchString, string newValue, bool caseSensitive, bool wholeWord);
If you still have some question.Ask us again,please!Attch your code and the file will be good!
Justin
Technical Support / Developer,
e-iceblue Support Team
-
Justin Weng
-
- Posts: 110
- Joined: Mon Mar 28, 2011 5:54 am
Tue May 10, 2011 12:26 pm
Thanks but in this way I replace "only" the text.
My goal is to replace some text with the new textand create a new bookmark with it.
The bookmark is very important so I'll locate it and replace its content again.
es ->before
bla bla bla Keyword bla bla bla
after
bla bla bla <BOOKMARKSTART> text replaced <BOOKMARKEND> bla bla bla
1) I'm not sure if my code to insert the bookmark is correct. (I have some doubt here: paragraph.ChildObjects.Insert(index, paragraph);)
2) My code seems to work well but I lose the original format .
Thanks
-
michelap
-
- Posts: 6
- Joined: Mon Jan 17, 2011 7:44 am
Wed May 11, 2011 3:17 am
Dear michelap,
Thanks for your inqury.
you can use this:
- Code: Select all
Document document = new Document("test.doc");
TextSelection[] textSelections = document.FindAllString("e-iceblue", true, true);
foreach (TextSelection textSelection in textSelections)
{
TextRange range = textSelection.GetAsOneRange();
Paragraph p = range.OwnerParagraph;
int index = p.Items.IndexOf(range);
if (-1 != index)
{
BookmarkStart start = p.AppendBookmarkStart("test");
TextRange text = p.AppendText("testbookmark");
BookmarkEnd end = p.AppendBookmarkEnd("test");
p.Items.RemoveAt(index);//p.ChildObjects.RemoveAt(index);
p.Items.Insert(index, start);
p.Items.Insert(index, text);
p.Items.Insert(index, end);
}
}
document.SaveToFile("result.doc");
Justin
Technical Support / Developer,
e-iceblue Support Team
-
Justin Weng
-
- Posts: 110
- Joined: Mon Mar 28, 2011 5:54 am
Wed May 11, 2011 2:20 pm
Thank you! Your code works fine!!
but....
when I create the bookmark I lose the original text format
I made a little example
- Code: Select all
...
Hashtable htCustom = new Hashtable();
htCustom.Add("D_N1", "text for D_N1");
htCustom.Add("D_N2", "text for D_N2");
htCustom.Add("D_N3", "text for D_N3");
htCustom.Add("D_N4", "text for D_N4");
htCustom.Add("D_N5", "text for D_N5");
Document _doc = new Document();
_doc.LoadFromFile(@"C:\TEMP\DEMO.docx", FileFormat.Docx);
//-- 1 -- Cerco tutti i TOKEN (stringhe che cominciano per D_ )
Regex reg = new Regex(@"\bD_[A-Za-z0-9]+");
TextSelection[] selections = _doc.FindAllPattern(reg);
string sToken, bookName;
// --4 -- REPLACE DEL TESTO e Inserimento dei Bookmark
foreach (TextSelection text in selections)
{
TextRange textRange = text.GetAsOneRange();
bookName = textRange.Text;
if (!htCustom.ContainsKey(bookName))
continue;
try
{
Paragraph p = textRange.OwnerParagraph;
int index = p.Items.IndexOf(textRange);
if (-1 != index)
{
BookmarkStart start = p.AppendBookmarkStart(bookName);
TextRange _tr1 = p.AppendText(htCustom[bookName].ToString());
BookmarkEnd end = p.AppendBookmarkEnd(bookName);
//p.Items.RemoveAt(index);//p.ChildObjects.RemoveAt(index);
p.Items.Insert(index, start);
p.Items.Insert(index, _tr1);
p.Items.Insert(index, end);
}
}
catch (Exception ex)
{
MessageBox.Show("Compile DOC. error bookmark: " + bookName + " Error: " + ex.Message);
}
}
_doc.SaveToFile(@"C:\TEMP\RESULT.docx", FileFormat.Docx);
- as you can see in Result.docx the style of "text for D_N1" is different
Any suggestions?
Thank's
Michela
Login to view the files attached to this post.
-
michelap
-
- Posts: 6
- Joined: Mon Jan 17, 2011 7:44 am
Thu May 12, 2011 2:00 am
Thanks for your inqury,
I am sorry for that I don't notice that you ask me the question about formatting.
From your code you can do like this:
- Code: Select all
.......
TextRange _tr1 = p.AppendText(htCustom[bookName].ToString());
_tr1.ApplyCharacterFormat(textRange.CharacterFormat);
The format didn't lose .And I tested it, it worked!
Justin
Technical Support / Developer,
e-iceblue Support Team
-
Justin Weng
-
- Posts: 110
- Joined: Mon Mar 28, 2011 5:54 am
Thu May 12, 2011 7:46 am
Thanks for your support.
I'm sorry but after insert a bookmark my object model of p.Items is like this
- Code: Select all
p.Items.Count = 4
[0] {Spire.Doc.Fields.TextRange} object {Spire.Doc.Fields.TextRange} //text before bookmark
[1] {Spire.Doc.BookmarkEnd} object {Spire.Doc.BookmarkEnd} //??????
[2] {Spire.Doc.Fields.TextRange} object {Spire.Doc.Fields.TextRange}
[3] {Spire.Doc.BookmarkStart} object {Spire.Doc.BookmarkStart} //??????
so I tried to increment index like this and seems to works fine
- Code: Select all
BookmarkStart start = p.AppendBookmarkStart(bookName);
TextRange _tr1 = p.AppendText(htCustom[bookName].ToString());
_tr1.ApplyCharacterFormat(textRange.CharacterFormat);
BookmarkEnd end = p.AppendBookmarkEnd(bookName);
p.Items.RemoveAt(index);
p.Items.Insert(index, start);
p.Items.Insert(++index, _tr1);
p.Items.Insert(++index, end);
Regards
Michela
-
michelap
-
- Posts: 6
- Joined: Mon Jan 17, 2011 7:44 am
Thu May 12, 2011 7:55 am
It's true michelap! The index must be added!
Thanks for your inqury!
If you have some questions again,ask us , please!
Justin
Technical Support / Developer,
e-iceblue Support Team
-
Justin Weng
-
- Posts: 110
- Joined: Mon Mar 28, 2011 5:54 am