需求:解析Word文档里的内容,输出到Excel文档。
Word的内容有3-5级项目编号,最后一级项目编号的文本对应表名称,项目编号下面的正文内容对应表结构的元数据。如图一所示。
图一
非叶子项目编号对应着表所属的类别。按照文档的项目编号结构,最多会有4级类别。具体编码是按照10级类别来处理。
String[] arrLevel = new String[10]; //保存当前解析位置的每级项目编号的文本BigInteger level = BigInteger.ZERO; //当前levellevel = document.getStyles().getStyle(paragraph.getStyle()).getCTStyle().getPPr().getOutlineLvl().getVal();arrLevel[level.intValue()] = paragraphText.trim();Table table = null;Field field = null;for (int i = 13/*跳过文档的目录*/; i < paragraphs.size(); i++) { XWPFParagraph paragraph = paragraphs.get(i); String style = paragraph.getStyle(); if ("90"/*具体文档这个值会不同,可以debug一下*/.equalsIgnoreCase(style)) { //设置当前Table为叶子结点 leaf=true if(table==null || !table.leaf){ table = new Table(); table.leaf = true; //设置Table的level } //解析正文,用Field对象接收,add到Table中 field = new Field(); ... ... table.addField(field); }else{ // 用Table对象接收 // 设置Table的level,从全局arrLevel取 table = new Table(); table.leaf = false; //设置Table的level } }// 定义内部类存储Table数据 @Setter @Getter public class Table { boolean leaf = false; BigInteger level; String[] levels; List fields;public void addField(Field value){...} } // 定义内部类存储Field数据 @Getter @Setter public class Field { private String content; private String metaName; private String metaValue; } //表头,和word读取的metaName一致String[] title = new String[]{""};//Excel表头,和metaName可以不一致String[] showTitle = new String[]{""}; HSSFRow row = sheet.createRow(0); for (int i = 0; i < title.length; i++) { HSSFCell cell = row.createCell(i); cell.setCellValue(showTitle[i]); }//遍历Tables,过滤leaf=true,创建HSSFRow//遍历每个Table的Field,创建HSSFCell | 留言与评论(共有 0 条评论) “” |