精华内容
下载资源
问答
  • DOCX4J 解析DOCX文档字体格式

    千次阅读 2017-07-28 17:37:22
    一、DOCX文档格式 docx4j只能解析docx格式的word文档,这种文档其实是一个压缩文件,加压后会有如下图所示的多个文件,文档中字体格式主要包含在document.xml和styles.xml文件中,theme文件夹可能也有,本文没有分析...

    一、DOCX文档格式

    docx4j只能解析docx格式的word文档,这种文档其实是一个压缩文件,加压后会有如下图所示的多个文件,文档中字体格式主要包含在document.xml和styles.xml文件中,theme文件夹可能也有,本文没有分析里面的格式。

    image

    document.xml中的格式定义:

    image

    image

    二、maven引入

    <!-- https://mvnrepository.com/artifact/org.docx4j/docx4j -->
            <dependency>
                <groupId>org.docx4j</groupId>
                <artifactId>docx4j</artifactId>
                <version>3.3.5</version>
            </dependency>

    三、测试类

    getMainDocumentPart可以得到文档内容,getStyleDefinitionsPart可以得到styles的内容,经过测试发现有些格式存在styles.xml中,比如大纲、页眉、页脚等,而一般段落的格式在文档内容中document.xml,因此可以结合这两个方法去得到对应的格式。

    package thesisadmin;

    import org.apache.log4j.Logger;

    import org.junit.Test;

    import java.util.ArrayList;

    import java.util.List;

    import javax.xml.bind.JAXBElement;

    import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

    import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;

    import org.docx4j.openpackaging.parts.WordprocessingML.StyleDefinitionsPart;

    import org.docx4j.wml.Body;

    import org.docx4j.wml.HpsMeasure;

    import org.docx4j.wml.PPr;

    import org.docx4j.wml.PPrBase.Ind;

    import org.docx4j.wml.PPrBase.Spacing;

    import org.docx4j.wml.ParaRPr;

    import org.docx4j.wml.R;

    import org.docx4j.wml.RFonts;

    import org.docx4j.wml.RPr;

    import org.docx4j.wml.Style;

    import org.docx4j.wml.Styles;

    public class MyTest {

    private static final Logger logger = Logger.getLogger(MyTest.class);

    @Test

    public void t2() {

    // logger.info(EndecryptUtil.d("QWp6RfwMwQL9M6bbTwqlUQ%3D%3D"));

    try {

    parserDocx("c:\\b.docx");

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    public ArrayList<String> parserDocx(String inputfilepath) throws Exception {

    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage

    .load(new java.io.File(inputfilepath));

    MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();

    System.out.println(documentPart.getXML());

    org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document) documentPart

    .getJaxbElement();

    Body body = wmlDocumentEl.getBody();

    List<Object> bodyChildren = body.getContent();//.getEGBlockLevelElts();

    ArrayList<String> lss = walkJAXBElements(inputfilepath, bodyChildren);

    return lss;

    }

    public ArrayList<String> walkJAXBElements(String inputpath,

    List<Object> bodyChildren) {

    ArrayList<String> lss = new ArrayList<String>();

    for (Object o : bodyChildren) {

    if (o instanceof javax.xml.bind.JAXBElement) {

    System.out.println("JAXBElement:" + o.getClass().getName());

    } else if (o instanceof org.docx4j.wml.P) {

    try{

    System.out.println("=====================");

    String paragraph = walkList(((org.docx4j.wml.P) o).getContent());

    System.out.println("------------段落内容------------");

    System.out.println(paragraph);

    System.out.println("------------段落内容结束-----------");

    lss.add(paragraph);

    System.out.println("------------段落样式------------");

    PPr ppr = ((org.docx4j.wml.P) o).getPPr();

    if(ppr!=null){

    ParaRPr prpr=ppr.getRPr();

    RFonts rfs = prpr.getRFonts();

    HpsMeasure hps = prpr.getSz();

    System.out.println("字体Ascii:"+rfs.getAscii());

    System.out.println("字体HAnsi:"+rfs.getHAnsi());

    System.out.println("字体大小:"+hps.getVal());

    System.out.println("字体颜色:"+prpr.getColor().getVal());

    Ind ind=ppr.getInd();

    System.out.println("左缩进:"+ind.getLeftChars());

    Spacing sp=ppr.getSpacing();

    System.out.println("行距:"+sp.getLine());

    }

    System.out.println("---------样式结束--------------");

    System.out.println("=====================");

    }catch(Exception e){

    System.out.println(e.getMessage());

    continue;

    }

    }

    }

    return lss;

    }

    public String walkList(List children) {

    String line = "";

    for (Object o : children) {

    if (o instanceof javax.xml.bind.JAXBElement) {

    if (((JAXBElement) o).getDeclaredType().getName()

    .equals("org.docx4j.wml.Text")) {

    org.docx4j.wml.Text t = (org.docx4j.wml.Text) ((JAXBElement) o)

    .getValue();

    line = line + t.getValue();

    } else if (((JAXBElement) o).getDeclaredType().getName()

    .equals("org.docx4j.wml.Drawing")) {

    System.out.println("find img");

    // ((JAXBElement)o).getValue() );

    }

    } else if (o instanceof org.w3c.dom.Node) {

    System.out.println(" IGNORED "

    + ((org.w3c.dom.Node) o).getNodeName());

    } else if (o instanceof org.docx4j.wml.R) {

    RPr rPr = ((R) o).getRPr();

    // System.out.println("=========字体样式============");

    // if(rPr!=null){

    //

    // RFonts rfs = rPr.getRFonts();

    // HpsMeasure hps = rPr.getSz();

    // System.out.println("字体Ascii:"+rfs.getAscii());

    // System.out.println("字体HAnsi:"+rfs.getHAnsi());

    // System.out.println("字体大小:"+hps.getVal());

    // System.out.println("字体颜色:"+rPr.getColor().getVal());

    //

    // }

    // System.out.println("=====================");

    org.docx4j.wml.U u = rPr.getU();

    org.docx4j.wml.R run = (org.docx4j.wml.R) o;

    String tmpStr = walkList(run.getRunContent());

    if (u != null) {

    for (int i = 0; i < tmpStr.length(); i++) {

    line = line + "_" + tmpStr.charAt(i);

    }

    } else

    line = line + tmpStr;

    }

    else {

    System.out.println(" IGNORED " + o.getClass().getName());

    }

    }

    return line;

    }

    @Test

    public void t3() {

    try {

    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage

    .load(new java.io.File("c:\\b.docx"));

    StyleDefinitionsPart styleDefinitionsPart =

    wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart(true);

    Styles styles = styleDefinitionsPart.getContents();

    System.out.println(styleDefinitionsPart.getXML());

    try {

    String defaultParagraphStyleId = styleDefinitionsPart.getDefaultParagraphStyle().getStyleId();

    System.out.println("defaultParagraphStyleId:"+defaultParagraphStyleId);

    } catch (NullPointerException npe) {

    System.out.println("No default paragraph style!!");

    }

    try {

    String defaultCharacterStyleId = styleDefinitionsPart.getDefaultCharacterStyle().getStyleId();

    System.out.println("defaultCharacterStyleId:"+defaultCharacterStyleId);

    } catch (NullPointerException npe) {

    System.out.println("No default character style!!");

    }

    List<Style> stylesList = styles.getStyle();

    for (Style style : stylesList) {

    System.out.println("************************");

    try{

    System.out.println(style.getName().getVal());

    System.out.println(style.getStyleId());

    RFonts rfs = style.getRPr().getRFonts();

    HpsMeasure hps = style.getRPr().getSz();

    System.out.println("字体Ascii:"+rfs.getAscii());

    System.out.println("字体HAnsi:"+rfs.getHAnsi());

    System.out.println("字体大小:"+hps.getVal());

    }catch(Exception e){

    System.out.println(e.getMessage());

    }

    System.out.println("************************");

    }

    } catch (Exception e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

     

    运行结果:

    段落格式:

    image

    页脚格式:

    image

    展开全文
  • 自己写一个docx格式解析

    千次阅读 2018-12-24 10:35:25
    众所周知,docx格式是国际软件巨头-微软为其自家产品Word所定义的一个文件格式,当然docx这种格式已经有很多很多的解析库可用了,但是你有没有想过自己一个docx解析器呢? 首先,我们先做一个小小的实验,准备一...

    众所周知,docx格式是国际软件巨头-微软为其自家产品Word所定义的一个文件格式,当然docx这种格式已经有很多很多的解析库可用了,但是你有没有想过自己一个docx的解析器呢?

    首先,我们先做一个小小的实验,准备一个docx的文件,比如下面这个:

    先用记事本打开,不出意外的话,应该是下面的结果:

    但是,如果我们用另一种软件,比如7zip打开,会是什么情况呢?结果如下

    很显然,docx文件格式是一种压缩文档格式,而这个压缩文档里面以xml的形式定义了文档的样式,文本和其他的内容

     

    正常来说,一个docx压缩文档包含以下结构:

    docProps
        app.xml
        core.xml
    word
        theme                    //主题文件夹
            theme1.xml
        _rels
            document.xml.rels
        document.xml            //包含文档内容的xml文件,主要是解析它
        fontTable.xml            
        setting.xml             //word文档的设置信息
        styles.xml
        webSettings.xml
    _rels
        .rels
    [Content_Types].xml

    既然docx的本质不过是一个zip格式的压缩文件,而我们又清楚了docx的格式,那么编写一个parser岂不是易如反掌的事情 :)

     

    我们先看看word里面的内容:

    再看document.xml文件:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" 
                xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" 
                xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" 
                xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" 
                xmlns:cx3="http://schemas.microsoft.com/office/drawing/2016/5/9/chartex" 
                xmlns:cx4="http://schemas.microsoft.com/office/drawing/2016/5/10/chartex" 
                xmlns:cx5="http://schemas.microsoft.com/office/drawing/2016/5/11/chartex" 
                xmlns:cx6="http://schemas.microsoft.com/office/drawing/2016/5/12/chartex" 
                xmlns:cx7="http://schemas.microsoft.com/office/drawing/2016/5/13/chartex" 
                xmlns:cx8="http://schemas.microsoft.com/office/drawing/2016/5/14/chartex" 
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                xmlns:aink="http://schemas.microsoft.com/office/drawing/2016/ink" 
                xmlns:am3d="http://schemas.microsoft.com/office/drawing/2017/model3d" 
                xmlns:o="urn:schemas-microsoft-com:office:office" 
                xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" 
                xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" 
                xmlns:v="urn:schemas-microsoft-com:vml" 
                xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" 
                xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" 
                xmlns:w10="urn:schemas-microsoft-com:office:word" 
                xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" 
                xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" 
                xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" 
                xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" 
                xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" 
                xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" 
                xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" 
                xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" 
                xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" 
                mc:Ignorable="w14 w15 w16se w16cid wp14">
      <w:body>
        <w:p w14:paraId="487FD595" w14:textId="088DF81C" w:rsidR="0096521E" w:rsidRDefault="006C2D61">
          <w:r>
            <w:rPr>
              <w:rFonts w:hint="eastAsia"/>
            </w:rPr>
            <w:t>11111</w:t>
          </w:r>
          <w:bookmarkStart w:id="0" w:name="_GoBack"/>
          <w:bookmarkEnd w:id="0"/>
        </w:p>
        <w:sectPr w:rsidR="0096521E">
          <w:pgSz w:w="11906" w:h="16838"/>
          <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>
          <w:cols w:space="425"/>
          <w:docGrid w:type="lines" w:linePitch="312"/>
        </w:sectPr>
      </w:body>
    </w:document>

    w:document标记没什么好说的,就是声明一个document的根类,当然它里面有一堆namespace的声明,看着挺心烦的。。。

    w:body标记,就是声明文档的主体部分

    w:p标记,标记一个段落

    w:r标记,标记一行

    w:rPr标记

    w:t标记,标记一个文本,我们的老朋友"11111"就在这里

    w:bookmarkStart标记,书签起始标记

    w:bookmarkEnd标记,书签终止标记

    w:secPr标记

    w:pgSz标记,页面大小标记,其中w:w表示宽度,w:h表示高度

    w:pgMar标记

    w:cols标记

    w:docGrid标记

    作为最简单的文本解析,我们只需定位到w:body标记,读出所有的w:p标记,然后挨个遍历w:p标记,从w:p标记解析出w:t标记,这样就能获取到相应的文本内容

    如果我们能够处理docx文档里面的所有的内容,或许你也可以写一个word软件来 :)

    展开全文
  • php读取word文件解析图片公式及文字,目前仅支持docx后缀格式
  • Docx简介 ...Java对docx文件操作 常见功能 – docx解析 – docx生成(完全生成,模板加部分生成:套打) 处理的第三方库 – Jacob,COM4J (基于Windows平台) – POI, docx4j (纯Java的第三方库)

    Docx简介

    • 以Microsoft Office的doc/docx 为主要处理对象
    • Word2003和之前都是doc,文档格式不公开
    • Word2007和之后都是docx,文档格式公开,遵循XML路线
    • docx 为主要研究对象
      – 文字样式
      – 表格
      – 图片
      – 公式

    Java对docx文件操作

    • 常见功能
      – docx解析
      – docx生成(完全生成,模板加部分生成:套打)
    • 处理的第三方库
      – Jacob,COM4J (基于Windows平台)
      POI, docx4j (纯Java的第三方库)
      – 一些其他平台的第三方库(OpenOffice/Libre Office SDK)linux平台
      – Aspose(收费)
      – 一些开源的OpenXML的包

    POI

    Apache POI

    • poi.apche.org
    • 可处理docx,xlsx,pptx,visio等office套件
    • 纯Java工具包,无需第三方依赖
    • 主要类
      – XWPFDocument 整个文档对象
      – XWPFParagraph 段落(以回车来定义的,并非文本上的段落)
      – XWPFRun 一个片段(字体样式相同的一段)
      – XWPFPicture 图片
      – XWPFTable 表格

    读取docx文件 文本
    docx整个文本对象,然后分为段落,段落分为片段,遍历进行判断,输出文本或者其他

    public static void main(String[] args) throws Exception {
    		readDocx();
    	}
    
    public static void readDocx() throws Exception {
    		InputStream is;
    		is = new FileInputStream("test.docx");
    		XWPFDocument xwpf = new XWPFDocument (is);
    		
    		List<IBodyElement> ibs= xwpf.getBodyElements();
    		for(IBodyElement ib:ibs)  //遍历文本的每一个段落
        	{
    			BodyElementType bet = ib.getElementType();
    			if(bet== BodyElementType.TABLE)
        		{
    				//表格
    				System.out.println("table" + ib.getPart());
        		}
    			else
    			{				
    				//段落
    				XWPFParagraph para = (XWPFParagraph) ib;
    				System.out.println("It is a new paragraph....The indention is " 
    				         + para.getFirstLineIndent() + "," + para.getIndentationFirstLine() );
    				//System.out.println(para.getCTP().xmlText());
    				
    				List<XWPFRun> res = para.getRuns();  //段落再分为片段
    				//System.out.println("run");
    				if(res.size()<=0)
    				{
    					System.out.println("empty line");
    				}
    				for(XWPFRun re: res)  //遍历每一个片段
    				{							
    					if(null == re.text()||re.text().length()<=0)  //是图片
    					{
    						if(re.getEmbeddedPictures().size()>0)
    						{
    							System.out.println("image***" + re.getEmbeddedPictures().size());							
    						} else
    						{
    							System.out.println("objects:" + re.getCTR().getObjectList().size());
    							if(re.getCTR().xmlText().indexOf("instrText") > 0) {
    								System.out.println("there is an equation field");
    							}
    							else
    							{
    								//System.out.println(re.getCTR().xmlText());
    							}												
    						}
    					}
    					else
    					{						
    						System.out.println("==="+ re.getCharacterSpacing() + re.text());
    					}
    				}				
    			}
        	}		
    		is.close();
    	}
    
    //输出
    It is a new paragraph....The indention is -1,-1
    ===0我们是中国人,
    ===0 
    ===0C
    ===0hinese!
    It is a new paragraph....The indention is 420,420
    ===0Hello ECNU! Hello China!
    It is a new paragraph....The indention is -1,-1
    empty line
    

    docx中图片的读取操作

     public static void imageRead() throws IOException, InvalidFormatException {
            File docFile = new File("simple.docx");
    
            XWPFDocument doc = new XWPFDocument(OPCPackage.openOrCreate(docFile));
            
            int i = 0;
            for (XWPFParagraph p : doc.getParagraphs()) {  
                for (XWPFRun run : p.getRuns()) {
                	System.out.println("a new run");
                    for (XWPFPicture pic : run.getEmbeddedPictures()) {  //有图片就进入for循环,没有会返回空
                    	System.out.println(pic.getCTPicture().xmlText());
                    	//image EMU(English Metric Unit)
                    	System.out.println(pic.getCTPicture().getSpPr().getXfrm().getExt().getCx());
                    	System.out.println(pic.getCTPicture().getSpPr().getXfrm().getExt().getCy());
                    	//image 显示大小  以厘米为单位
                    	System.out.println(pic.getCTPicture().getSpPr().getXfrm().getExt().getCx()/360000.0);
                    	System.out.println(pic.getCTPicture().getSpPr().getXfrm().getExt().getCy()/360000.0);
                    	int type = pic.getPictureData().getPictureType();
                        byte [] img = pic.getPictureData().getData();
                        BufferedImage bufferedImage= ImageRead.byteArrayToImage(img);
                        System.out.println(bufferedImage.getWidth());
                        System.out.println(bufferedImage.getHeight());
                        String extension = "";
                        switch(type)
                        {
    	                    case Document.PICTURE_TYPE_EMF: extension = ".emf";
    	                    								break;
    	                    case Document.PICTURE_TYPE_WMF: extension = ".wmf";
    							break;
    	                    case Document.PICTURE_TYPE_PICT: extension = ".pic";
    							break;
    	                    case Document.PICTURE_TYPE_PNG: extension = ".png";
    							break;
    	                    case Document.PICTURE_TYPE_DIB: extension = ".dib";
    							break;
    							default: extension = ".jpg";
                        }
                        //outputFile = new File ( );                
                        //BufferedImage image = ImageIO.read(new File(img));
                        //ImageIO.write(image , "png", outputfile);
                        FileOutputStream fos = new FileOutputStream("test" + i + extension);  //将读取出来的图片写入其他目标文件
                        fos.write(img);
                        fos.close();
                        i++;
                    }
                }
            }
        }
        public static BufferedImage  byteArrayToImage(byte[] bytes){  
            BufferedImage bufferedImage=null;
            try {
                InputStream inputStream = new ByteArrayInputStream(bytes);
                bufferedImage = ImageIO.read(inputStream);
            } catch (IOException ex) {
                System.out.println(ex.getMessage());
            }
            return bufferedImage;
    }
    

    将图片写入到一个docx文件里面

     public class ImageWrite {
    
        public static void main(String[] args) throws Exception {
            XWPFDocument doc = new XWPFDocument();
            XWPFParagraph p = doc.createParagraph();  
    
            XWPFRun r = p.createRun();
            
            String[] imgFiles = new String[2];
            
            imgFiles[0] = "c:/temp/ecnu.jpg";
            imgFiles[1] = "c:/temp/shida.jpg";        		
    
            for(String imgFile : imgFiles) {
                int format;
                //判断图像文件的格式
                if(imgFile.endsWith(".emf")) format = XWPFDocument.PICTURE_TYPE_EMF;
                else if(imgFile.endsWith(".wmf")) format = XWPFDocument.PICTURE_TYPE_WMF;
                else if(imgFile.endsWith(".pict")) format = XWPFDocument.PICTURE_TYPE_PICT;
                else if(imgFile.endsWith(".jpeg") || imgFile.endsWith(".jpg")) format = XWPFDocument.PICTURE_TYPE_JPEG;
                else if(imgFile.endsWith(".png")) format = XWPFDocument.PICTURE_TYPE_PNG;
                else if(imgFile.endsWith(".dib")) format = XWPFDocument.PICTURE_TYPE_DIB;
                else if(imgFile.endsWith(".gif")) format = XWPFDocument.PICTURE_TYPE_GIF;
                else if(imgFile.endsWith(".tiff")) format = XWPFDocument.PICTURE_TYPE_TIFF;
                else if(imgFile.endsWith(".eps")) format = XWPFDocument.PICTURE_TYPE_EPS;
                else if(imgFile.endsWith(".bmp")) format = XWPFDocument.PICTURE_TYPE_BMP;
                else if(imgFile.endsWith(".wpg")) format = XWPFDocument.PICTURE_TYPE_WPG;
                else {
                    System.err.println("Unsupported picture: " + imgFile +
                            ". Expected emf|wmf|pict|jpeg|png|dib|gif|tiff|eps|bmp|wpg");
                    continue;
                }
    
                r.setText(imgFile);  //加入文本
                r.addBreak();      // 换行
                //加入文件输入流
                r.addPicture(new FileInputStream(imgFile), format, imgFile, Units.toEMU(200), Units.toEMU(200)); // 200x200 pixels
                r.addBreak(BreakType.PAGE); //加入分页符
            }
    
            FileOutputStream out = new FileOutputStream("images.docx");
            doc.write(out);
            out.close();
        }
    

    读取一个表格
    一个XWPFTable包含多个XMPFTableRow
    一个XMPFTableRow包括多个XWPFTableCell
    一个XMPFTableCell包含文本
    文本可以只是一句话,也可以包括多个XWPFParagraph
    一个XWPFParagraph包括多个XWPFRun

    读取表格只需要在XWPFParagraph这个层面就行

    public class TableRead {
    	public static void main(String[] args) throws Exception {
    		testTable();
    	}
    	
    	public static void testTable() throws Exception {
    		InputStream is = new FileInputStream("simple2.docx");
    		XWPFDocument xwpf = new XWPFDocument(is);
    		List<XWPFParagraph> paras = xwpf.getParagraphs();
    		//List<POIXMLDocumentPart> pdps = xwpf.getRelations();
    		
    		List<IBodyElement> ibs= xwpf.getBodyElements();
    		for(IBodyElement ib:ibs)
        	{
    			BodyElementType bet = ib.getElementType();
    			if(bet== BodyElementType.TABLE)
        		{
    				//表格
    				System.out.println("table" + ib.getPart());
    				XWPFTable table = (XWPFTable) ib;
    	    		List<XWPFTableRow> rows=table.getRows(); 
    	    		 //读取每一行数据
    	    		for (int i = 0; i < rows.size(); i++) {
    	    			XWPFTableRow  row = rows.get(i);
    	    			//读取每一列数据
    		    	    List<XWPFTableCell> cells = row.getTableCells(); 
    		    	    for (int j = 0; j < cells.size(); j++) {
    		    	    	XWPFTableCell cell=cells.get(j);
    		    	    	System.out.println(cell.getText());
    		    	    	List<XWPFParagraph> cps = cell.getParagraphs();
    		    	    	System.out.println(cps.size());
    					}
    	    		}
        		}
    			else
    			{				
    				//段落
    				XWPFParagraph para = (XWPFParagraph) ib;
    				System.out.println("It is a new paragraph....The indention is " 
    				   + para.getFirstLineIndent() + "," + para.getIndentationFirstLine() + "," 
    				   + para.getIndentationHanging()+"," + para.getIndentationLeft() + "," 
    				   + para.getIndentationRight() + "," + para.getIndentFromLeft() + ","
    				   + para.getIndentFromRight()+"," + para.getAlignment().getValue());
    				
    				//System.out.println(para.getAlignment());
    				//System.out.println(para.getRuns().size());
    				List<XWPFRun> res = para.getRuns();
    				System.out.println("run");
    				if(res.size()<=0)
    				{
    					System.out.println("empty line");
    				}
    				for(XWPFRun re: res)
    				{					
    					if(null == re.text()||re.text().length()<=0)
    					{
    						if(re.getEmbeddedPictures().size()>0)
    						{
    							System.out.println("image***" + re.getEmbeddedPictures().size());
    							
    						}
    						else
    						{
    							System.out.println("objects:" + re.getCTR().getObjectList().size());
    							System.out.println(re.getCTR().xmlText());
    												
    						}
    					}
    					else
    					{
    						System.out.println("===" + re.text());
    					}
    				}
    				
    			}
        	}		
    		is.close();
    	}
    
    
    

    如何写一个表格 到 docx文件

    public static void main(String[] args) throws Exception {
     	try {
     		createSimpleTable();
     	}
     	catch(Exception e) {
     		System.out.println("Error trying to create simple table.");
     		throw(e);
     	} 	
     }
    
     public static void createSimpleTable() throws Exception {
         XWPFDocument doc = new XWPFDocument();
    
         try {
             XWPFTable table = doc.createTable(3, 3); //创建表格
    
             table.getRow(1).getCell(1).setText("表格示例");
    
             XWPFParagraph p1 = table.getRow(0).getCell(0).getParagraphs().get(0);
    
             XWPFRun r1 = p1.createRun();
             r1.setBold(true);
             r1.setText("The quick brown fox");
             r1.setItalic(true);
             r1.setFontFamily("Courier");
             r1.setUnderline(UnderlinePatterns.DOT_DOT_DASH);
             r1.setTextPosition(100);
    
             table.getRow(2).getCell(2).setText("only text");
    
             OutputStream out = new FileOutputStream("simpleTable.docx");
             try {
                 doc.write(out);
             } finally {
                 out.close();
             }
         } finally {
             doc.close();
         }
     } 
    

    文件套打,在docx模板文件中放入数据文件

    public static void main(String[] args) throws Exception {
    		XWPFDocument doc = openDocx("template.docx");//导入模板文件
    		Map<String, Object> params = new HashMap<>();//文字类 key-value
    		params.put("${name}", "Tom");
    		params.put("${sex}", "男");
    		Map<String,String> picParams = new HashMap<>();//图片类 key-url
    		picParams.put("${pic}", "c:/temp/ecnu.jpg");
    		List<IBodyElement> ibes = doc.getBodyElements();
    		for (IBodyElement ib : ibes) {
    			if (ib.getElementType() == BodyElementType.TABLE) { //文件中有表格
    				replaceTable(ib, params, picParams, doc);
    			}
    		}
    		writeDocx(doc, new FileOutputStream("template2.docx"));//输出
    	}
    
    
      public static XWPFDocument openDocx(String url) {
    		InputStream in = null;
    		try {
    			in = new FileInputStream(url);
    			XWPFDocument doc = new XWPFDocument(in);
    			return doc;
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} finally {
    			if (in != null) {
    				try {
    					in.close();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    		return null;
    	}
      
      public static void writeDocx(XWPFDocument outDoc, OutputStream out) {
    		try {
    			outDoc.write(out);
    			out.flush();
    			if (out != null) {
    				try {
    					out.close();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    
      private static Matcher matcher(String str) {
    		Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
    		Matcher matcher = pattern.matcher(str);
    		return matcher;
    	}
    
      /**
    	 * 替换表格内占位符
    	 * @param para 表格对象
    	 * @param params 文字替换map
    	 * @param picParams 图片替换map
    	 * @param indoc
    	 * @throws Exception 
    	 */
    	public static void replaceTable(IBodyElement para ,Map<String, Object> params, 
    			Map<String, String> picParams, XWPFDocument indoc)
    			throws Exception {
    		Matcher matcher;
    		XWPFTable table;
    		List<XWPFTableRow> rows;
    		List<XWPFTableCell> cells;
    		table = (XWPFTable) para;
    		rows = table.getRows();
    		for (XWPFTableRow row : rows) {
    			cells = row.getTableCells();
    			int cellsize = cells.size();
    			int cellcount = 0;
    			for(cellcount = 0; cellcount<cellsize;cellcount++){
    				XWPFTableCell cell = cells.get(cellcount);
    				String runtext = "";
    				List<XWPFParagraph> ps = cell.getParagraphs();
    				for (XWPFParagraph p : ps) {
    					for(XWPFRun run : p.getRuns()){
    						runtext = run.text();  
    						matcher = matcher(runtext);
    						//表格中的Run 中的文本是不是满足模板中的正则表达式
    						if (matcher.find()) {
    							if (picParams != null) {
    								for (String pickey : picParams.keySet()) {
    									if (matcher.group().equals(pickey)) {
    										run.setText("",0);
    										replacePic(run, picParams.get(pickey), indoc);
    									}
    								}
    							}
    							if (params != null) {
    								for (String pickey : params.keySet()) {
    									if (matcher.group().equals(pickey)) {
    										run.setText(params.get(pickey)+"",0);
    									}
    								}
    							}
    						}
    					}
    				}
    			}
    		}
    	}
    
       /**
    	 * 写入image
    	 * @param run
    	 * @param imgFile
    	 * @param doc
    	 * @throws InvalidFormatException
    	 * @throws FileNotFoundException
    	 * @throws IOException
    	 */
    	 //为了上面代码中替换表格中的图片
    	public static void replacePic(XWPFRun run,  String imgFile,  XWPFDocument doc) throws Exception {
    		int format;
    		if (imgFile.endsWith(".emf"))
    			format = Document.PICTURE_TYPE_EMF;
    		else if (imgFile.endsWith(".wmf"))
    			format = Document.PICTURE_TYPE_WMF;
    		else if (imgFile.endsWith(".pict"))
    			format = Document.PICTURE_TYPE_PICT;
    		else if (imgFile.endsWith(".jpeg") || imgFile.endsWith(".jpg"))
    			format = Document.PICTURE_TYPE_JPEG;
    		else if (imgFile.endsWith(".png"))
    			format = Document.PICTURE_TYPE_PNG;
    		else if (imgFile.endsWith(".dib"))
    			format = Document.PICTURE_TYPE_DIB;
    		else if (imgFile.endsWith(".gif"))
    			format = Document.PICTURE_TYPE_GIF;
    		else if (imgFile.endsWith(".tiff"))
    			format = Document.PICTURE_TYPE_TIFF;
    		else if (imgFile.endsWith(".eps"))
    			format = Document.PICTURE_TYPE_EPS;
    		else if (imgFile.endsWith(".bmp"))
    			format = Document.PICTURE_TYPE_BMP;
    		else if (imgFile.endsWith(".wpg"))
    			format = Document.PICTURE_TYPE_WPG;
    		else {
    			System.err.println(
    					"Unsupported picture: " + imgFile + ". Expected emf|wmf|pict|jpeg|png|dib|gif|tiff|eps|bmp|wpg");
    			return;
    		}
    		if(imgFile.startsWith("http")||imgFile.startsWith("https")){
    			run.addPicture(new URL(imgFile).openConnection().getInputStream(), format, "rpic",Units.toEMU(100),Units.toEMU(100));
    		}else{
    			run.addPicture(new FileInputStream(imgFile), format, "rpic",Units.toEMU(100),Units.toEMU(100));
    		}
    	}
    

    总结

    不同的Office工具,产生出来的docx文件格式不兼容
    不同的第三方包,能够解析和生成内容也不用,使用的类也不同
    第三方库,能处理的情况也只是一般的,也存在一些复杂的情况处理不了

    展开全文
  • java 解析doc,docx,rtf格式文件代码 解析读取文件前首先将以下jar包引入程序中: doc 解析 String buffer=""; InputStream is = new FileInputStream(dest); WordExtractor ex = new WordExtractor(is); buffer ...

    java 解析doc,docx,rtf格式文件代码

    解析读取文件前首先将以下jar包引入程序中:
    在这里插入图片描述

    1. doc 解析

    String buffer="";
    InputStream is = new FileInputStream(dest);
    WordExtractor ex = new WordExtractor(is);
    buffer = ex.getText();
    System.out.println(buffer);

    2.docx 解析

    String buffer="";
    FileInputStream fis = new FileInputStream(dest);
    XWPFDocument xdoc = new XWPFDocument(fis);
    XWPFWordExtractor extractor = new XWPFWordExtractor(xdoc);
    buffer = extractor.getText();
    System.out.println(buffer);

    3.rtf 解析

    String result = null;
    try {
    DefaultStyledDocument styledDoc = new DefaultStyledDocument();
    // 创建文件输入流
    InputStream streamReader = new FileInputStream(dest);
    new RTFEditorKit().read(streamReader, styledDoc, 0);
    //以 ISO-8859-1的编码形式获取字节byte[], 并以 GBK 的编码形式生成字符串
    result = new String(styledDoc.getText(0, styledDoc.getLength()).getBytes(“ISO8859-1”),“GBK”);
    } catch (IOException e) {
    e.printStackTrace();
    } catch (BadLocationException e) {
    e.printStackTrace();
    }
    System.out.println(result);

    展开全文
  • 我试图从多个docx文件中读取标题。令人恼火的是,这些标题没有可识别的段落样式。所有段落都有“正常”段落样式,所以我使用正则表达式。标题采用粗体格式,结构如下:A.猫B.狗C.猪D.福克斯如果一个文件中有超过26个...
  • 关于JAVA Apache POI读取word文档,网上资料很多,但是大多数还是仅仅提取文档中的纯文本,好一点的,也就提取所有图片,但是,word...这是因为docx文件遵循了OfficeOpenXML规范,该规范内容很多,有兴趣的同学可以自行
  • 1.android本地对Word文件进行操作的所有jar包; 2.只是对Word文件的两种格式的读取操作,不涉及写操作。
  • 关于JAVA Apache POI读取word文档,网上资料很多,但是大多数还是仅仅提取文档中的纯文本,好一点的,也就提取所有图片,但是,word...这是因为docx文件遵循了OfficeOpenXML规范,该规范内容很多,有兴趣的同学可以自行
  • Word-docx文件图片信息格式分析

    千次阅读 2017-08-22 16:20:38
    本文为笔记、仅作参考。 前文为: 用FreeMarker生成Word文档...解析导出信息、将 <img ... src="xxx" ...> 抽取出来。 替换为 [img[xxxIdInt]]; 替换 HTML 标签;将 [img[xxxIdInt]] 格式的字符串、使用XML标签替换回去。
  • KLARF文件格式 说明,适用于半导体行业,在很多工艺流程中通用的保存结果的文本格式。可用于读取Klarf文件,解析结果中的WaferID, LotID,坐标信息等内容
  • CUE文件格式说明.docx

    2020-01-07 15:33:11
    CUE文件格式说明 本文档分为三部分:   一、CUE 基本规范  二、CUE 命令参考  三、范例解析
  • docx解析

    2016-03-29 17:38:55
    最近在造轮子,尝试解析和重写docx文件,过程也是蛮烦躁的 没有参考文档,都是一个个关键字去试效果,初步的工作是能解析和写入一个带图片的 docx文件吧 现在读取一个完整的文件已经可以实现了,写入的话...
  • 有的时候我们在开发android中需要解析一些我们比较常用的格式,比如doc、docx、xls、xlsx,那么我们要是正常的话就解析不了。这时我们就要用tm-extractors-0.4.jar。 解析doc,要tm-extractors-0.4.jar这个包 ...
  • RTF 批量转换为 DOCX 文件

    千次阅读 2018-04-26 20:12:21
    RTF 批量转换为 DOCX 文件   RTF是多信息文本格式,可用于多设备、系统。最近在做一个小的数据批量处理程序时遇到了RTF格式的数据文件,这种格式...所以我需要将RTF文件转换为DOCX文件。单个文件的话,直接用wo...
  • 解析doc,要tm-extractors-0.4.jar这个包 解析xls,要jxl.jar这个包下载jxl.jar public static String readDOC(String path) { // 创建输入流读取doc文件 FileInputStream in;
  • 导读:有的时候我们在开发android中需要解析一些我们比较常用的格式,比如doc、docx、xls、xlsx,那么我们要是正常的话就解析不了。这时我们就要用tm-extractors-0.4.jar。 可以直接复制实验, 解析doc,要tm-...
  • Android 解析 doc,docx,xls,xlsx,ppt等格式文件的源码
  • 导读:有的时候我们在开发android中需要解析一些我们比较常用的格式,比如doc、docx、xls、xlsx,那么我们要是正常的话就解析不了。这时我们就要用tm-extractors-0.4.jar。 可以直接复制实验, 解析doc,要tm-...
  • 导读:有的时候我们在开发android中需要解析一些我们比较常用的格式,比如doc、docx、xls、xlsx,那么我们要是正常的话就解析不了。这时我们就要用tm-extractors-0.4.jar。 可以直接复制实验, 解析doc,要tm-...
  • 不少仪器数据报告输出为Word格式文件,同Excel文件,Word文件doc和docx的存储格式是不同的,相应的解析Word文件的方式也类似,主要有以下方式: 1.通过MS Word应用程序的DCOM接口; 2.WPS Word应用程序的DCOM接口...
  • Tika是一个内容抽取的工具集合(a ...其次,Tika也提供了便利的扩展API,用来丰富其对第三方文件格式的支持。在当前的0.2-SNAPSHOT版本中, Tika提供了对如下文件格式的支持: ● PDF - 通过Pdfbox ● MS-* - 通过POI
  • 导出word文档(docx) 前言 我们常常在代码中读取...本次导出word的文档格式docx,大概说一下实现思路是:准备一个排好版的docx文档,使用freemarker将其中的变量替换。docx文档本身其实是一个压缩的zip文件,将其
  • PHP读取word文档里的文字及图片,并保存一、composer安装phpWordcomposer require phpoffice/phpword二、phpWord读取 docx文档(注意是docx格式,doc格式不行)如果你的文件是doc格式,直接另存为一个docx就行了;...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 131
精华内容 52
关键字:

docx文件格式解析