POI-读取Word生成Excel

需求:解析Word文档里的内容,输出到Excel文档。

Word的内容有3-5级项目编号,最后一级项目编号的文本对应表名称,项目编号下面的正文内容对应表结构的元数据。如图一所示。

图一


非叶子项目编号对应着表所属的类别。按照文档的项目编号结构,最多会有4级类别。具体编码是按照10级类别来处理。

  • 读取Word代码
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;     } 


  • 输出到Excel
//表头,和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
POI
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章