Page 1 of 1

Getting null value when i read WordprocessingMLPackage

PostPosted: Fri Aug 16, 2013 1:48 am
by teja1524
hi this is teja,

i'm getting null value when i run this program
at
WordprocessingMLPackage template,template.getMainDocumentPart() ,this template variable returns null value.

Code: Select all
package com.nitspl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;

import org.docx4j.XmlUtils;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.ContentAccessor;
import org.docx4j.wml.P;
import org.docx4j.wml.Tbl;
import org.docx4j.wml.Text;
import org.docx4j.wml.Tr;

public class WordDocxToJava {

   @SuppressWarnings("unused")
   private static WordprocessingMLPackage getTemplate(String name) throws Docx4JException, FileNotFoundException  {
      
      WordprocessingMLPackage template = WordprocessingMLPackage.load(new FileInputStream(new File("C:\\Users\\nitspl\\Desktop\\template001.docx")));
        return template;
       }
   private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
        List<Object> result = new ArrayList<Object>();
        if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();
      
        if (obj.getClass().equals(toSearch))
         result.add(obj);
        else if (obj instanceof ContentAccessor) {
         List<?> children = ((ContentAccessor) obj).getContent();
         for (Object child : children) {
          result.addAll(getAllElementFromObject(child, toSearch));
         }
      
        }
        return result;
       }
   @SuppressWarnings("unused")
   private void replacePlaceholder(WordprocessingMLPackage template, String name, String placeholder ) {
        List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), Text.class);
      
        for (Object text : texts) {
         Text textElement = (Text) text;
         if (textElement.getValue().equals(placeholder)) {
          textElement.setValue(name);
         }
        }
       }
   @SuppressWarnings("unused")
   private void writeDocxToStream(WordprocessingMLPackage template, String target) throws IOException, Docx4JException {
       File f = new File(target);
       template.save(f);
      }
   
   @SuppressWarnings({ "rawtypes" })
   private static void replaceParagraph(String placeholder, String textToAdd, WordprocessingMLPackage template, ContentAccessor addTo) {
       // 1. get the paragraph
       List<Object> paragraphs = getAllElementFromObject(template.getMainDocumentPart(), P.class);

       P toReplace = null;
       for (Object p : paragraphs) {
        List<Object> texts = getAllElementFromObject(p, Text.class);
        for (Object t : texts) {
         Text content = (Text) t;
         if (content.getValue().equals(placeholder)) {
          toReplace = (P) p;
          break;
         }
        }
       }

       // we now have the paragraph that contains our placeholder: toReplace
       // 2. split into seperate lines
       String as[] = StringUtils.splitPreserveAllTokens(textToAdd, '\n');

       for (int i = 0; i < as.length; i++) {
        String ptext = as[i];

        // 3. copy the found paragraph to keep styling correct
        P copy = (P) XmlUtils.deepCopy(toReplace);

        // replace the text elements from the copy
        List texts = getAllElementFromObject(copy, Text.class);
        if (texts.size() > 0) {
         Text textToReplace = (Text) texts.get(0);
         textToReplace.setValue(ptext);
        }

        // add the paragraph to the document
        addTo.getContent().add(copy);
       }

       // 4. remove the original one
       ((ContentAccessor)toReplace.getParent()).getContent().remove(toReplace);

      }
   
   
    private static void replaceTable(String[] placeholders, List<Map<String, String>> textToAdd,
            WordprocessingMLPackage template) throws Docx4JException, JAXBException {
           List<Object> tables = getAllElementFromObject(template.getMainDocumentPart(), Tbl.class);
         
           // 1. find the table
           Tbl tempTable = getTemplateTable(tables, placeholders[0]);
           List<Object> rows = getAllElementFromObject(tempTable, Tr.class);
         
           // first row is header, second row is content
           if (rows.size() == 2) {
            // this is our template row
            Tr templateRow = (Tr) rows.get(1);
         
            for (Map<String, String> replacements : textToAdd) {
             // 2 and 3 are done in this method
             addRowToTable(tempTable, templateRow, replacements);
            }
         
            // 4. remove the template row
            tempTable.getContent().remove(templateRow);
           }
          }
   @SuppressWarnings("rawtypes")
   private static  void addRowToTable(Tbl reviewtable, Tr templateRow, Map<String, String> replacements) {
        Tr workingRow = (Tr) XmlUtils.deepCopy(templateRow);
        List textElements = getAllElementFromObject(workingRow, Text.class);
        for (Object object : textElements) {
         Text text = (Text) object;
         String replacementValue = (String) replacements.get(text.getValue());
         if (replacementValue != null)
          text.setValue(replacementValue);
        }
      
        reviewtable.getContent().add(workingRow);
       }
   private static  Tbl getTemplateTable(List<Object> tables, String templateKey) throws Docx4JException, JAXBException {
        for (Iterator<Object> iterator = tables.iterator(); iterator.hasNext();) {
         Object tbl = iterator.next();
         List<?> textElements = getAllElementFromObject(tbl, Text.class);
         for (Object text : textElements) {
          Text textElement = (Text) text;
          if (textElement.getValue() != null && textElement.getValue().equals(templateKey))
           return (Tbl) tbl;
         }
        }
        return null;
       }
   [color=#FF0000]static WordprocessingMLPackage template[/color];   
   @SuppressWarnings("unused")
   public static void main(String[] args) throws Docx4JException, JAXBException, FileNotFoundException {
      String placeholder = "SJ_EX1";
       String toAdd = "jos\ndirksen";
       
       FileInputStream  fis=new FileInputStream("C:\\Users\\nitspl\\Desktop\\template001.docx");
      
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(fis);
        wordMLPackage=template;
      
[color=#FF0000]      replaceParagraph(placeholder, toAdd, template, template.getMainDocumentPart());
[/color]      
      Map<String,String> repl1 = new HashMap<String, String>();
        repl1.put("SJ_FUNCTION", "function1");
        repl1.put("SJ_DESC", "desc1");
        repl1.put("SJ_PERIOD", "period1");
      
        Map<String,String> repl2 = new HashMap<String,String>();
        repl2.put("SJ_FUNCTION", "function2");
        repl2.put("SJ_DESC", "desc2");
        repl2.put("SJ_PERIOD", "period2");
      
        Map<String,String> repl3 = new HashMap<String,String>();
        repl3.put("SJ_FUNCTION", "function3");
        repl3.put("SJ_DESC", "desc3");
        repl3.put("SJ_PERIOD", "period3");
      
        replaceTable(new String[]{"SJ_FUNCTION","SJ_DESC","SJ_PERIOD"}, Arrays.asList(repl1,repl2,repl3), template);
      
   }
   

}











Re: Getting null value when i read WordprocessingMLPackage

PostPosted: Fri Aug 16, 2013 8:03 am
by jason
teja1524 wrote:this template variable returns null value.


On a quick scan of your code:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
  <span style="color: #FF0000">static WordprocessingMLPackage template</span>;    
   @SuppressWarnings("unused")
   public static void main(String[] args) throws Docx4JException, JAXBException, FileNotFoundException {
      String placeholder = "SJ_EX1";
       String toAdd = "jos\ndirksen";
       
       FileInputStream  fis=new FileInputStream("C:\\Users\\nitspl\\Desktop\\template001.docx");
     
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(fis);
        wordMLPackage=template;
 
Parsed in 0.015 seconds, using GeSHi 1.0.8.4


that's because you aren't setting it to anything.

Try template=wordMLPackage;