HWPF is still very immature and I do not think that with the project in it's
current state there is a way to do any better than we already have, sorry.
With regard to the SWT/OLE technique, can I ask did you download from
Rapidshare the example I posted? If so, then you need to unzip the archive
into a folder and open the file called readme.rtf. It contains instructions
telling you how to proceed. Before going any further, I do need to stress
again that OLE will only work if you are running on a Windpws PC and a copy
of Word is installed onto the machine where you will be running the code.

Off of the top of my head, the first thing to do is unzip the SWT archive -
is has a name something like swt-3.2.3-win32.zip and contains two files you
are interested in. The first is the java achive which is called swt.jar.
Extract that into a folder and place it on your classpath so the code I sent
will compile and run. Secondly, you need to extract a dll and place it into
the system32 subfolder of your windows folder on the computers hard drive.
Again, I cannot remember the name of the dll exactly but think it will be
something like this - swt-win32-3236.dll.

Now, you are ready to compile and run the file of code that is also
contained in the archive. Extract it to a folder somewhere on you computer,
open it using whichever editor you like to use, make sure that the
-classpath environment variable is set so that it can access the swt.jar
archive and then you should be able to compile and run the code. Usually, I
place some code into the main() method that explains what to do and how to
run the class and if I remember correctly, that class is very simple to use
and you may be able to deduce from the code that is there how to search for
and replace strings of text on Word documents. At this stage, do not worry
at all about how the class does what it does. There is a vile mixture of VBA
and java in there which will be hard to decipher until you are a little more
familiar with the OLE technique. The class should run and ought to
successfully search for and replace items in a Word document. It will seem
to run slowly. This is because in the background, it is loading Word,
locating the file, perfroming the search and replace operation, saving the
file away again and then closing Word down.

As to patching HWPF, the first thing you need to do is figure out where the
problem is and the best way to accomplish this is to try to replace a string
of text with one that is far longer. HWPF should respond by throwing an
exception and the stacktrace will help you to identify which class and which
method is the source of that exception. Next, have a look at this page -
http://poi.apache.org/getinvolved/index.html - it explains a little of how
to get involved with developing the API. It asumes that you will commit your
changes to the project - which you are not of course forced to do - but is a
good place to start. Then, as suggested on that page, use SVN (subversion)
to checkout a copy of the project's code and see if you can figure out where
the changes need to be made and, if so, modify your checked out copy of the
project's code. Once you get to that poiont, you can think about whether or
not you wish to submit the changes as a patch and, if so, the easiest way to
do this would be to post to the list again saying that you have a patch you
would like to commit. Someone will respond and help you to commit the patch
to the project.

Sorry to say that I am not the best person to talk you through the process
of developing and commiting patches as I am still just working through that
myself. If you do want to work on HWPF after looking at the code then I
would suggest contacting Nick Burch - [email protected] - the project chair
and asking him how to proceed.

Yours

Mark B


karthik-33 wrote:
> 
> Mark, Thanks for trying out. I tried the same way you did...
> Can you suggest me a way to resolve this..
> What is the option one to try patch HWPF.. May be i can try if you have
> any
> new way to approach this problem...
> And the option two, SWT/OLE iam new to it and i dont know how to work on
> that..
> 
> Thanks
> Karthik
> On Sun, Aug 9, 2009 at 6:07 AM, MSB <[email protected]> wrote:
> 
>>
>> This morning, I had the chance to try what I spoke of in my previous
>> email
>> -
>> using Java to replace text in a copy of the Paragraph's text and then
>> replacing all of the text in the Paragraph with the modified copy. It
>> worked
>> but only up to a point; if the replacement text was exactly the same
>> length
>> as the search term, this technique worked but any differences in length
>> rendered the resulting file corrupt; and I am guessing that this is the
>> same
>> problem as you originally encountered.
>>
>> So, I think I can conclude that if you are trying to replace the search
>> term
>> with a String of text that is longer than it, you will run into problems.
>> As
>> long as the replacement is shorter than the search term - or at most the
>> same length - then the previous piece of code I posted seems to work well
>> enough.
>>
>> To my mind then you have two options. Option 1 would be to patch HWPF so
>> that it will work as you wish - the API is very immature and has not been
>> the focus of the same sort of development effort as has HSSF for example.
>> Option 2 is to use an alternative such as SWT/OLE or OpenOffice. The
>> limitation with the OpenOffice approach is that whilst it can read
>> OpenXML
>> documents - Office 2007 and beyond with the .docx or similar extension -
>> it
>> cannot save a document in this format.
>>
>> Sorry for the bad news.
>>
>> Yours
>>
>> Mark B
>>
>>
>> karthik-33 wrote:
>> >
>> > Hi Mark, Thanks for sending this program.
>> > I tried this program with POI 3.2 final version, which iam currently
>> > using.
>> > CharaterRun doesnt behave consistently the same way, sometimes it
>> splits
>> > the
>> > paragraph text into more number of Character run, sometimes it doesnt
>> > split
>> > and i see the whole paragraph text in one character run. So the search
>> > text
>> > is not getting replaced.
>> > Is there anyway to solve this issue?
>> > On Sat, Aug 8, 2009 at 6:34 AM, MSB <[email protected]> wrote:
>> >
>> >>
>> >> Here is the HWPF based code that I put together to play around with.
>> It
>> >> was
>> >> written a very long time ago so I am not sure what testing I undertook
>> >> and
>> >> exactly what the results were but I have run it this morning just to
>> >> ensure
>> >> that
>> >> it does not crash the PC and all seems to be well. This section has
>> been
>> >> cut
>> >> from a much larger class that is full of other test code that I play
>> >> around
>> >> with peridocically. Everything you need is there I believe but on the
>> >> off-chance
>> >> that it calls another method whose source I have neglected to include,
>> >> just
>> >> drop
>> >> an email to the list please.
>> >>
>> >> Currently, I am running POI version 3.5 beta 7 on a PC operating under
>> >> Windows XP SP2. Office 2007 is installed now and it seems able to open
>> >> the
>> >> files this code produces quite happily. In the back of my mind, I seem
>> to
>> >> remember that the files produced by some search and replace code I put
>> >> together could be opened but not modified; I tested that problem this
>> >> morning
>> >> and the files this code produces seem fine, I can open them, make
>> changes
>> >> and
>> >> then save the results again. But do please be prepared for problems
>> like
>> >> that.
>> >>
>> >> Again, can I emphasise this is test code; it is scruffy and there are
>> >> going
>> >> to
>> >> be variables I put in there so that I could monitor the progress of
>> the
>> >> code
>> >> by dumping messages to the screen. As you go through, if something
>> seems
>> >> to
>> >> be superfluous, then this is likely the reason and you can comment it
>> out
>> >> or
>> >> delete it.
>> >>
>> >> Good luck and I do hope it all works. If you have any problems, just
>> drop
>> >> a
>> >> message onto the list.
>> >>
>> >> Yours
>> >>
>> >> Mark B
>> >>
>> >>
>> >> import org.apache.poi.poifs.filesystem.POIFSFileSystem;
>> >> import org.apache.poi.hwpf.HWPFDocument;
>> >> import org.apache.poi.hwpf.usermodel.Range;
>> >> import org.apache.poi.hwpf.usermodel.Paragraph;
>> >> import org.apache.poi.hwpf.usermodel.CharacterRun;
>> >>
>> >> import java.io.File;
>> >> import java.io.FileOutputStream;
>> >> import java.io.FileInputStream;
>> >> import java.io.BufferedOutputStream;
>> >> import java.io.BufferedInputStream;
>> >> import java.util.HashMap;
>> >> import java.util.Iterator;
>> >>
>> >> /**
>> >>  * This code is provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR
>> >>  * CONDITIONS OF ANY KIND, either express or implied. It is not
>> intended
>> >> to
>> >>  * be used in a 'production' environment without undergoing rigorous
>> >> testing.
>> >>  *
>> >>  * With that out of the way, an instance of this class can be used to
>> >> search
>> >> for
>> >>  * and replace Strings of text within a Word document. To see how the
>> >> code
>> >> may
>> >>  * be used, look into the main() method for examples.
>> >>  *
>> >>  * Note the replacements made by the code contained within this class
>> >> ignore
>> >>  * any formatting that may have been applied to the text that is
>> >> replaced.
>> >> That
>> >>  * is to say that if the text was originally formatted to use the
>> Arial
>> >> font,
>> >>  * was sized to 24 points, emboldened, underlined and red in colour,
>> then
>> >> all
>> >>  * of this will be lost if it is replaced. Further if any text is
>> >> replaced
>> >> in a
>> >>  * Paragraph, all the formatting applied to that Paragraph's contents
>> is
>> >> likely
>> >>  * to be lost.
>> >>  *
>> >>  * @author Mark Beardsley [msb at apache.org]
>> >>  * @version 1.00 8th August 2009 (cannot remember when originally put
>> >> together)
>> >>  */
>> >> public class SearchReplace {
>> >>
>> >>
>> >>        /**
>> >>         * Search for and replace a single occurrence of a string of
>> text
>> >> within a
>> >>         * Word document.
>> >>         *
>> >>         * Note that no checks are made on the parameter's values; that
>> is
>> >> to say
>> >>         * that the file named in the InputFilename parameter will not
>> be
>> >> checked
>> >>         * to ensure the file exists and neither of the searchTerm nor
>> >>         * replacementTerm parameters will be checked to ensure they
>> are
>> >> not
>> >> null.
>> >>         * Also, note that I have never tested passing the same String
>> to
>> >> the
>> >>         * inputFilename and outputFilename parameters but cannot see
>> why
>> >> that
>> >>         * should not be possible.
>> >>         *
>> >>         * @param inputFilename An instance of the String class that
>> >> encapsulates
>> >>         *                      the name of and path to a Word document
>> >> which is
>> >>         *                      in the binary (OLE2CDF) format. The
>> >> contents
>> >> of
>> >> this
>> >>         *                      document will be searched for
>> occurrences
>> >> of
>> >> the
>> >>         *                      search term.
>> >>         * @param outputFilename An instance of the String class that
>> >> encapsulates
>> >>         *                       the name of and path to a Word
>> document
>> >> which is
>> >>         *                       in the binary (OLE2CDF) format. This
>> >> document will
>> >>         *                       contain the results of the search and
>> >> replace
>> >>         *                       operation.
>> >>         * @param searchTerm An instance of the String class that
>> >> encapsulates a
>> >>         *                   series of characters, a word or words. The
>> >> document
>> >>         *                   will be searched for occurrences of this
>> >> String.
>> >>         * @param replacementTerm An instance of the String class that
>> >> contains a
>> >>         *                        series of characters, a word or
>> words.
>> >> The
>> >> String
>> >>         *                        encapsulated by the searchTerm
>> parameter
>> >> will be
>> >>         *                        replaced by the 'contents' of this
>> >> parameter.
>> >>         *
>> >>         */
>> >>        public void searchAndReplace(String inputFilename,
>> >>                                 String outputFilename,
>> >>                                 String searchTerm,
>> >>                                 String replacementText) {
>> >>
>> >>        File inputFile = null;
>> >>        File outputFile = null;
>> >>        FileInputStream fileIStream = null;
>> >>        FileOutputStream fileOStream = null;
>> >>        BufferedInputStream bufIStream = null;
>> >>        BufferedOutputStream bufOStream = null;
>> >>        POIFSFileSystem fileSystem = null;
>> >>        HWPFDocument document = null;
>> >>        Range docRange = null;
>> >>        Paragraph paragraph = null;
>> >>        CharacterRun charRun = null;
>> >>        int numParagraphs = 0;
>> >>        int numCharRuns = 0;
>> >>        String text = null;
>> >>
>> >>        try {
>> >>            // Create an instance of the POIFSFileSystem class and
>> >>            // attach it to the Word document using an InputStream.
>> >>            inputFile = new File(inputFilename);
>> >>            fileIStream = new FileInputStream(inputFile);
>> >>            bufIStream = new BufferedInputStream(fileIStream);
>> >>            fileSystem = new POIFSFileSystem(bufIStream);
>> >>            document = new HWPFDocument(fileSystem);
>> >>
>> >>            // Get the overall Range object for the document. Note the
>> >>            // use of the getRange() method and not the
>> getOverallRange()
>> >>            // method, this is just historic - when the code was
>> >> originally
>> >>            // written, I do not believe the latter method was part of
>> the
>> >> API.
>> >>            docRange = document.getRange();
>> >>
>> >>            // Get the number of Paragraph(s) in the overall range and
>> >> iterate
>> >>            // through them
>> >>            numParagraphs = docRange.numParagraphs();
>> >>            for(int i = 0; i < numParagraphs; i++) {
>> >>
>> >>                // Get a Paragraph and recover the text from it. This
>> step
>> >> is
>> >> far from
>> >>                // necessary and I think I only got the text so that I
>> >> could
>> >> print
>> >>                // it to screen as a diagnostic check to ensure that
>> the
>> >> Paragraph
>> >>                // contained the text I was searching for. Experiment
>> with
>> >> this.
>> >>                paragraph = docRange.getParagraph(i);
>> >>                text = paragraph.text();
>> >>
>> >>                // Get the number of CharacterRuns in the Paragraph
>> >>                numCharRuns = paragraph.numCharacterRuns();
>> >>                for(int j = 0; j < numCharRuns; j++) {
>> >>
>> >>                        // Get a character run and recover it's text -
>> >> note
>> >> that
>> >>                        // the same text variable is used as for the
>> >> Paragraph
>> >> above.
>> >>                        // So, it MUST be safe to remove the text =
>> >> paragraph.text()
>> >>                        // line above.
>> >>                    charRun = paragraph.getCharacterRun(j);
>> >>                    text = charRun.text();
>> >>
>> >>                    // Check to see if the text of the CharacterRun
>> >> contains
>> >> the
>> >>                    // search term. If it does, find out where that
>> term
>> >> starts
>> >>                    // and call the replaceText() method passing the
>> >> index.
>> >>                    // Maybe this is the key difference between what we
>> >> are
>> >>                    // doing.
>> >>                    if(text.contains(searchTerm)) {
>> >>                        int start = text.indexOf(searchTerm);
>> >>                        charRun.replaceText(searchTerm,
>> replacementText,
>> >> start);
>> >>                    }
>> >>                }
>> >>            }
>> >>
>> >>            // Close the InputStream
>> >>            bufIStream.close();
>> >>            bufIStream = null;
>> >>
>> >>            // Open an OutputStream and write the document away.
>> >>            outputFile = new File(outputFilename);
>> >>            fileOStream = new FileOutputStream(outputFile);
>> >>            bufOStream = new BufferedOutputStream(fileOStream);
>> >>
>> >>            document.write(bufOStream);
>> >>
>> >>        }
>> >>        catch(Exception ex) {
>> >>            System.out.println("Caught an: " +
>> ex.getClass().getName());
>> >>            System.out.println("Message: " + ex.getMessage());
>> >>            System.out.println("Stacktrace follows.............");
>> >>            ex.printStackTrace(System.out);
>> >>        }
>> >>        finally {
>> >>            if(bufOStream != null) {
>> >>                try {
>> >>                    //bufOStream.flush();
>> >>                    bufOStream.close();
>> >>                    bufOStream = null;
>> >>                }
>> >>                catch(Exception ex) {
>> >>
>> >>                }
>> >>            }
>> >>            if(bufIStream != null) {
>> >>                try {
>> >>                    bufIStream.close();
>> >>                    bufIStream = null;
>> >>                }
>> >>                catch(Exception ex) {
>> >>                    // I G N O R E //
>> >>                }
>> >>            }
>> >>        }
>> >>
>> >>    }
>> >>
>> >>    /**
>> >>         * Search for and replace a single occurrence of a string of
>> text
>> >> within a
>> >>         * Word document.
>> >>         *
>> >>         * Note that no checks are made on the parameter's values; that
>> is
>> >> to say
>> >>         * that the file named in the InputFilename parameter will not
>> be
>> >> checked
>> >>         * to ensure the file exists and neither of the searchTerm nor
>> >>         * replacementTerm pare,eters will be checked to ensure they
>> are
>> >> not
>> >> null.
>> >>         * Also, note that I have never tested passing the same String
>> to
>> >> the
>> >>         * inputFilename and outputFilename parameters but cannot see
>> why
>> >> that
>> >>         * should not be possible.
>> >>         *
>> >>         * @param inputFilename An instance of the String class that
>> >> encapsulates
>> >>         *                      the name of and path to a Word document
>> >> which is
>> >>         *                      in the binary (OLE2CDF) format. The
>> >> contents
>> >> of
>> >> this
>> >>         *                      document will be searched for
>> occurrences
>> >> of
>> >> the
>> >>         *                      search term.
>> >>         * @param outputFilename An instance of the String class that
>> >> encapsulates
>> >>         *                       the name of and path to a Word
>> document
>> >> which is
>> >>         *                       in the binary (OLE2CDF) format. This
>> >> document will
>> >>         *                       contain the results of the search and
>> >> replace
>> >>         *                       operation.
>> >>         * @param replacements An instance of the java.util.HashMap
>> class
>> >> that
>> >>         *                     contains a series of key, value pairs.
>> Each
>> >> key
>> >>         *                     is an instance of the String class that
>> >> encapsulates
>> >>         *                     a series of characters, a word or words
>> >> that
>> >> the
>> >>         *                     code will search for and the
>> accompanying
>> >> value is
>> >>         *                     also an instance of the String class
>> that
>> >> likewise
>> >>         *                     encapsulates a series of characters, a
>> word
>> >> or
>> >> words.
>> >>         *                     The 'contents' of the value's String
>> will
>> >> be
>> >> used to
>> >>         *                     replace the contents of the key's String
>> if
>> >> an
>> >>         *                     occurrence of the latter is found.
>> >>         */
>> >>    public void searchAndReplace(String inputFilename,
>> >>                                 String outputFilename,
>> >>                                 HashMap<String, String> replacements)
>> {
>> >>
>> >>        File inputFile = null;
>> >>        File outputFile = null;
>> >>        FileInputStream fileIStream = null;
>> >>        FileOutputStream fileOStream = null;
>> >>        BufferedInputStream bufIStream = null;
>> >>        BufferedOutputStream bufOStream = null;
>> >>        POIFSFileSystem fileSystem = null;
>> >>        HWPFDocument document = null;
>> >>        Range docRange = null;
>> >>        Paragraph paragraph = null;
>> >>        CharacterRun charRun = null;
>> >>        Set<String> keySet = null;
>> >>        Iterator<String> keySetIterator = null;
>> >>        int numParagraphs = 0;
>> >>        int numCharRuns = 0;
>> >>        String text = null;
>> >>        String key = null;
>> >>        String value = null;
>> >>
>> >>        try {
>> >>            // Create an instance of the POIFSFileSystem class and
>> >>            // attach it to the Word document using an InputStream.
>> >>            inputFile = new File(inputFilename);
>> >>            fileIStream = new FileInputStream(inputFile);
>> >>            bufIStream = new BufferedInputStream(fileIStream);
>> >>            fileSystem = new POIFSFileSystem(bufIStream);
>> >>            document = new HWPFDocument(fileSystem);
>> >>
>> >>                        // Get a reference to the overall Range for the
>> >> document
>> >>                        // and discover how many Paragraphs objects
>> there
>> >> are
>> >>                        // in the document.
>> >>            docRange = document.getRange();
>> >>            numParagraphs = docRange.numParagraphs();
>> >>
>> >>            // Recover a Set of the keys in the HashMap
>> >>            keySet = replacements.keySet();
>> >>
>> >>            // Step through each Paragraph
>> >>            for(int i = 0; i < numParagraphs; i++) {
>> >>                paragraph = docRange.getParagraph(i);
>> >>                // This line can almost certainly be removed - see
>> >>                // the comments in the method above.
>> >>                text = paragraph.text();
>> >>
>> >>                // Get the number of CharacterRuns in the Paragraph
>> >>                // and step through each one.
>> >>                numCharRuns = paragraph.numCharacterRuns();
>> >>                for(int j = 0; j < numCharRuns; j++) {
>> >>                    charRun = paragraph.getCharacterRun(j);
>> >>
>> >>                    // Get the text from the CharacterRun and recover
>> an
>> >>                    // Iterator to step through the Set of keys.
>> >>                    text = charRun.text();
>> >>                    keySetIterator = keySet.iterator();
>> >>                    while(keySetIterator.hasNext()) {
>> >>
>> >>                        // Get the key - which is also the search term
>> -
>> >> and
>> >>                        // check to see if it can be found within the
>> >>                        // CharacterRuns text.
>> >>                        key = keySetIterator.next();
>> >>                        if(text.contains(key)) {
>> >>
>> >>                                // If the search term was found in the
>> >> text,
>> >> get
>> >> the
>> >>                                // matching value from the HashMap,
>> find
>> >> out
>> >> whereabouts
>> >>                                // in the CharacterRuns text the search
>> >> term
>> >> is
>> >>                                // and call the replaceText() method to
>> >> substitute
>> >>                                // the replacement term for the search
>> >> term.
>> >>                            value = replacements.get(key);
>> >>                            int start = text.indexOf(key);
>> >>                            charRun.replaceText(key, value, start);
>> >>
>> >>                            // Note that this code was added to test
>> >> whether
>> >>                            // it was possible to replace multiple
>> >> occurrences
>> >>                            // of the search term. I cannot remember if
>> I
>> >> tested
>> >>                            // it but believe that it did work; either
>> >> way,
>> >>                            // it could be tested now and if succeeds,
>> >> then
>> >> the
>> >>                            // searchAndReplace() method above could be
>> >> modified
>> >>                            // to include this.
>> >>                            docRange = document.getRange();
>> >>                            paragraph = docRange.getParagraph(i);
>> >>                            charRun = paragraph.getCharacterRun(j);
>> >>                            text = charRun.text();
>> >>                        }
>> >>                    }
>> >>                }
>> >>            }
>> >>
>> >>            // Close the InputStream
>> >>            bufIStream.close();
>> >>            bufIStream = null;
>> >>
>> >>            // Open an OutputStream and save the modified document
>> away.
>> >>            outputFile = new File(outputFilename);
>> >>            fileOStream = new FileOutputStream(outputFile);
>> >>            bufOStream = new BufferedOutputStream(fileOStream);
>> >>            document.write(bufOStream);
>> >>        }
>> >>        catch(Exception ex) {
>> >>            System.out.println("Caught an: " +
>> ex.getClass().getName());
>> >>            System.out.println("Message: " + ex.getMessage());
>> >>            System.out.println("Stacktrace follows.............");
>> >>            ex.printStackTrace(System.out);
>> >>        }
>> >>        finally {
>> >>            if(bufIStream != null) {
>> >>                try {
>> >>                    bufIStream.close();
>> >>                    bufIStream = null;
>> >>                }
>> >>                catch(Exception ex) {
>> >>                    // I G N O R E //
>> >>                }
>> >>            }
>> >>            if(bufOStream != null) {
>> >>                try {
>> >>                    bufOStream.flush();
>> >>                    bufOStream.close();
>> >>                    bufOStream = null;
>> >>                }
>> >>                catch(Exception ex) {
>> >>
>> >>                }
>> >>            }
>> >>        }
>> >>
>> >>    }
>> >>
>> >>        /**
>> >>         * The main entry point to the program demonstrating how the
>> code
>> >> may
>> >>         * be utilised.
>> >>         *
>> >>         * @param args An array of type String containing argumnets
>> passed
>> >> to the
>> >>         *             program on execution.
>> >>         */
>> >>        public static void main(String[] args) {
>> >>                SearchReplace replacer = new SearchReplace();
>> >>
>> >>                // To serach for and replace single items. Note, the
>> code
>> >> has not, at
>> >>                // least as far as I can remember, been tested by
>> passing
>> >> the same
>> >>                // file to both the searchTerm and replacementTerm
>> >> parameters. It ought
>> >>                // to work but has NOT been tested I believe.
>> >>                replacer.searchAndReplace("Document.doc",            //
>> >> Source Document
>> >>                        "Replaced Document.doc",
>> >> //
>> >> Result Document
>> >>                        "search term",
>> >> //
>> >> Search term
>> >>                        "replacement term");
>> >> //
>> >> Replacement term
>> >>
>> >>                // To search for and replace a series of items
>> >>                HashMap<String, String> searchTerms = new
>> HashMap<String,
>> >> String>();
>> >>                searchTerms.put("search term 1", "replacement term 1");
>> >>                searchTerms.put("search term 2", "replacement term 2");
>> >>                searchTerms.put("search term 3", "replacement term 3");
>> >>                searchTerms.put("search term 4", "replacement term 4");
>> >>
>> >>                replacer.searchAndReplace("Document.doc",    // Source
>> >> Document
>> >>                        "Replaced Document.doc",                 //
>> Result
>> >> Document
>> >>                        searchTerms)                             //
>> >> Search/replacement items
>> >>         }
>> >> }
>> >>
>> >>
>> >>
>> >> karthik-33 wrote:
>> >> >
>> >> > Thanks for the reply mark.
>> >> > I dont think i need to preserve text formatting, but i would like to
>> >> try
>> >> > your code and see how it works.
>> >> > I think that would help me too.
>> >> >
>> >> > I cant go the open office since my business requirement is to use
>> >> > microsoft
>> >> > word documents.
>> >> > I will be using this search and replace function in the same PC as
>> that
>> >> of
>> >> > the application.
>> >> >
>> >> > If you can send me that code, i will try and let u know how it
>> works.
>> >> >
>> >> > Thanks
>> >> > Karthik
>> >> >
>> >> >
>> >> > On Fri, Aug 7, 2009 at 11:49 AM, MSB <[email protected]>
>> wrote:
>> >> >
>> >> >>
>> >> >> Can I ask two questions please?
>> >> >>
>> >> >> Do you need to preserve the formatting applied to the text? If not,
>> >> then
>> >> >> I
>> >> >> think that somewhere I have a piece of HWPF code that does a search
>> >> and
>> >> >> replace. I am not at all certain about the state of the code and
>> >> cannot
>> >> >> remember if I hit the same problem as you - and I may well have -
>> but
>> >> I
>> >> >> am
>> >> >> willing to look it out if you think it might help.
>> >> >>
>> >> >> Secondly, do you have to use HWPF/XWPF? The API is still immature
>> and
>> >> it
>> >> >> is
>> >> >> really only suitable for realtively simple tasks. Better
>> alternatives
>> >> >> might
>> >> >> be OpenOffice which you can 'control' through it's UNO API or Word
>> >> itself
>> >> >> that can be manipulated using OLE. You can ONLY use OLE if you are
>> >> >> working
>> >> >> on a windows based PC and you have Word installed on that PC.
>> >> OpenOffice
>> >> >> is
>> >> >> more flexible but it still cannot be used - at least as far as I am
>> >> aware
>> >> >> -
>> >> >> as a document server, so it is best to have that application
>> installed
>> >> on
>> >> >> the PC you will be using for the search/replace operation.
>> >> >>
>> >> >> Yours
>> >> >>
>> >> >> Mark B
>> >> >>
>> >> >>
>> >> >> karthik-33 wrote:
>> >> >> >
>> >> >> > I have microsoft office 2007 and while saving the document, i
>> save
>> >> it
>> >> >> as
>> >> >> > microsoft 2003 document.
>> >> >> > Iam trying to replace the text using replaceText method in
>> >> Paragraph.
>> >> >> > It works fine when the replacement text and search text are of
>> equal
>> >> >> > length.
>> >> >> > It corrupts the document, when the length of the string is either
>> >> >> greater
>> >> >> > or
>> >> >> > less.
>> >> >> > If anyone has gone through the issue and resolved or have any
>> idea.
>> >> >> Please
>> >> >> > let me know, it will be useful for me..
>> >> >> > Iam not sure what is causing the problem to corrupt the document
>> >> >> >
>> >> >> > Code is:
>> >> >> >
>> >> >> > String replaceTxt = "Replacement";
>> >> >> > String searchText = "Orginial";
>> >> >> > POIFSFileSystem ps = new POIFSFileSystem (new
>> >> >> > FileInputStream("C:/Document.doc"));
>> >> >> > HWPFDocument doc = new HWPFDocument ();
>> >> >> > Range range = doc.getRange();
>> >> >> > for(int x=0;x<range.numSections();x++)
>> >> >> > {
>> >> >> >     Section s = range.getSection(x);
>> >> >> >     for(int y=0;y<s.numParagraphs();y++)
>> >> >> >     {
>> >> >> >         Paragraph p = s.getParagraph(y);
>> >> >> >         String paraText = p.text();
>> >> >> >         int offset = paraText.indexOf(searchText );
>> >> >> >         if(offset != -1)
>> >> >> >         {
>> >> >> >              p.replaceText(searchText,replaceTxt,offset);
>> >> >> >
>> >> >> >         }
>> >> >> >     }
>> >> >> >
>> >> >> > }
>> >> >> >
>> >> >> >
>> >> >>
>> >> >> --
>> >> >> View this message in context:
>> >> >>
>> >>
>> http://www.nabble.com/Replace-Text-Problem-%28Document-Corrupt%29---POI-HWPFDocument-tp24864855p24867251.html
>> >> >> Sent from the POI - User mailing list archive at Nabble.com.
>> >> >>
>> >> >>
>> >> >>
>> ---------------------------------------------------------------------
>> >> >> To unsubscribe, e-mail: [email protected]
>> >> >> For additional commands, e-mail: [email protected]
>> >> >>
>> >> >>
>> >> >
>> >> >
>> >> > --
>> >> > karthik
>> >> >
>> >> >
>> >>
>> >> --
>> >> View this message in context:
>> >>
>> http://www.nabble.com/Replace-Text-Problem-%28Document-Corrupt%29---POI-HWPFDocument-tp24864855p24876942.html
>> >>  Sent from the POI - User mailing list archive at Nabble.com.
>> >>
>> >>
>> >> ---------------------------------------------------------------------
>> >> To unsubscribe, e-mail: [email protected]
>> >> For additional commands, e-mail: [email protected]
>> >>
>> >>
>> >
>> >
>> > --
>> > karthik
>> >
>> >
>>
>> --
>> View this message in context:
>> http://www.nabble.com/Replace-Text-Problem-%28Document-Corrupt%29---POI-HWPFDocument-tp24864855p24885699.html
>> Sent from the POI - User mailing list archive at Nabble.com.
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
> 
> 
> -- 
> karthik
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Replace-Text-Problem-%28Document-Corrupt%29---POI-HWPFDocument-tp24864855p24894775.html
Sent from the POI - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to