Word ActiveX Delete content underneath a heading

6 views (last 30 days)
Alessandro
Alessandro on 10 May 2021
Commented: Alessandro on 11 May 2021
Hi,
I am using word to store images of some measurament.
everything works fine but I would like to add some automation.
By now I am doing the following:
actx_word = actxserver('Word.Application');
actx_word.Visible = true;
trace(actx_word.Visible);
% Open existing document
word_handle = invoke(actx_word.Documents,'Open',fullfile(word_file_p));
%Here I would like to delete the content of the heading
Nr=2
WordUtils.WordGoTo(actx_word, 11, 1, Nr)%Go to specific heading in document
WordUtils.WordGoTo(actx_word_p, 3, 2, Nr)%Go one line down
hgexport(fig, '-clipboard')%Copy figure image to Clipboard
invoke(actx_word.Selection,'Paste');%Paste it to word document
actx_word_p.Selection.TypeParagraph; %enter
Now my Problem is I would like to rewrite the content of the heading. So delete first the content underneath it. Is there a easy way for doing that ?

Accepted Answer

Thomas Jensen
Thomas Jensen on 10 May 2021
Hi Alessandro,
Working with Word documents in MATLAB is not that easy indeed, even a simple task as the one you described might be a nightmare.
I am not used to the WordUtils functions, but that is how I would approach this issue:
You can get the objects returned by the ActiveX Library, for example, to open the document you can use the line:
wordDocument = actx_word.Documents.Open(fullfile(word_file_p));
If you know the text of the heading and it is unique int the document, you can search for the text and replace it by a different text:
wordRange = wordDocument.Content;
wordRange.Find.Execute('HEADING_TEXT');
wordRange.Text = 'NEW_TEXT';
I usually create a unique string in the template with a unique string, like %%UNIQUE_STRING%% and I search for this string to replace it using the method I explained.
You can also create the heading by script:
wordRange.Text = 'HEADING_TEXT';
wordRange.Style = -2; % wdStyleHeading1
I hope these two approaches can already give you some directions.
Best regards,
  1 Comment
Alessandro
Alessandro on 11 May 2021
Hi Thomas,
thanks for the answer. Your solution would work if the content would be only text.
Yesterday I came with the follow solution:
actx_word.Selection.GoTo(11, 1, Nr);%<-Go to heading
actx_word.Selection.GoTo(3, 2, 1);%<-Go 1 Line down
Start = actx_word_p.Application.Selection.Start; % Save current position
actx_word.Selection.GoTo(11, 1, Nr+1);%<-Go to the next heading
if (actx_word.Application.Selection.end < Start)%there was no next heading. So put end position to end of document
actx_word.Application.Selection.end = actx_word.activedocument.content.end;
end
if Start<actx_word_p.Application.Selection.end %only use Delete if Start is smaller as end or it will delete a character
actx_word.Application.Selection.Start = Start;
actx_word.Application.Selection.Delete
end
It did work well. It doesnt feel right but looks like it would work :). And you are right word connection is not an easy task !
Best regards,
Alessandro

Sign in to comment.

More Answers (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!