java使用POI工具读取word文档并写入生成新的word文档及错误整理

一、读取word文档并写入生成新的word文档:

   1.使用工具包:poi-版本号.jar   poi-scratchpad-版本号-beta5.jar或poi-scratchpad-版本号.jar

   2.代码:   

import java.io.ByteArrayOutputStream;    
import java.io.File;    
import java.io.FileInputStream;    
import java.io.FileNotFoundException;    
import java.io.FileOutputStream;    
import java.io.IOException;    
import java.util.HashMap;    
import java.util.Iterator;    
import java.util.Map;    
    
import org.apache.poi.hwpf.HWPFDocument;    
import org.apache.poi.hwpf.model.FieldsDocumentPart;    
import org.apache.poi.hwpf.usermodel.Field;    
import org.apache.poi.hwpf.usermodel.Fields;    
import org.apache.poi.hwpf.usermodel.Paragraph;    
import org.apache.poi.hwpf.usermodel.Range;    
import org.apache.poi.hwpf.usermodel.Table;    
import org.apache.poi.hwpf.usermodel.TableCell;    
import org.apache.poi.hwpf.usermodel.TableIterator;    
import org.apache.poi.hwpf.usermodel.TableRow;    
    
public class WordTest    
{    
        
    /**  
    * @param args  
    */    
    public static void main(String[] args)    
    {    
        Map<String, String> map = new HashMap<String, String>();    
        map.put("${name}", "张三");    
        map.put("${age}", "20");    
        map.put("${province}", "山西");    
        map.put("${city}", "太原");    
        map.put("${district}", "迎泽区");    
        map.put("${school}", "test");    
        String srcPath = "C:\\Users\\Administrator\\Desktop\\test.doc";    
        readwriteWord(srcPath, map);    
    }    
        
    /**  
    * 实现对word读取和修改操作  
    *   
    * @param filePath  
    *            word模板路径和名称  
    * @param map  
    *            待填充的数据,从数据库读取  
    */    
    public static void readwriteWord(String filePath, Map<String, String> map)    
    {    
        // 读取word模板    
        // String fileDir = new    
        // File(base.getFile(),"http://www.cnblogs.com/http://www.cnblogs.com/../doc/").getCanonicalPath();    
        FileInputStream in = null;    
        try    
        {    
            in = new FileInputStream(new File(filePath));    
        }    
        catch (FileNotFoundException e1)    
        {    
            e1.printStackTrace();    
        }    
        HWPFDocument hdt = null;    
        try    
        {    
            hdt = new HWPFDocument(in);    
        }    
        catch (IOException e1)    
        {    
            e1.printStackTrace();    
        }    
        Fields fields = hdt.getFields();    
        Iterator<Field> it = fields.getFields(FieldsDocumentPart.MAIN)    
                .iterator();    
        while (it.hasNext())    
        {    
            System.out.println(it.next().getType());    
        }    
            
        //读取word文本内容    
        Range range = hdt.getRange();    
        TableIterator tableIt = new TableIterator(range);     
        //迭代文档中的表格    
        int ii = 0;    
        while (tableIt.hasNext()) {      
            Table tb = (Table) tableIt.next();      
            ii++;    
            System.out.println("第"+ii+"个表格数据...................");    
            //迭代行,默认从0开始    
            for (int i = 0; i < tb.numRows(); i++) {      
                TableRow tr = tb.getRow(i);      
                //只读前8行,标题部分    
                if(i >=8) break;    
                //迭代列,默认从0开始    
                for (int j = 0; j < tr.numCells(); j++) {      
                    TableCell td = tr.getCell(j);//取得单元格    
                    //取得单元格的内容    
                    for(int k=0;k<td.numParagraphs();k++){      
                        Paragraph para =td.getParagraph(k);      
                        String s = para.text();      
                        System.out.println(s);    
                    } //end for       
                }   //end for    
            }   //end for    
        } //end while    
        //System.out.println(range.text());    
            
        // 替换文本内容    
        for (Map.Entry<String, String> entry : map.entrySet())    
        {    
            range.replaceText(entry.getKey(), entry.getValue());    
        }    
        ByteArrayOutputStream ostream = new ByteArrayOutputStream();    
        String fileName = "" + System.currentTimeMillis();    
        fileName += ".doc";    
        FileOutputStream out = null;    
        try    
        {    
            out = new FileOutputStream("F:/" + fileName, true);    
        }    
        catch (FileNotFoundException e)    
        {    
            e.printStackTrace();    
        }    
        try    
        {    
            hdt.write(ostream);    
        }    
        catch (IOException e)    
        {    
            e.printStackTrace();    
        }    
        // 输出字节流    
        try    
        {    
            out.write(ostream.toByteArray());    
        }    
        catch (IOException e)    
        {    
            e.printStackTrace();    
        }    
        try    
        {    
            out.close();    
        }    
        catch (IOException e)    
        {    
            e.printStackTrace();    
        }    
        try    
        {    
            ostream.close();    
        }    
        catch (IOException e)    
        {    
            e.printStackTrace();    
        }    
    }    

二、问题整理:

    报错内容:org.apache.poi.poifs.filesystem.POIFSFileSystem.getRoot()

Lorg/apache/poi/poifs/filesystem/DirectoryNode错误!

    解决方案:升级poi-版本号.jar包

猜你喜欢

转载自my.oschina.net/u/1758234/blog/1626382