_98K丶 2021-06-01 00:11 采纳率: 0%
浏览 135

springboot解析word

利用springboot解析word,word中有表格和图片,最好能循环解析,因为某些内容格式是重复的,只是数据不一样。

  • 写回答

1条回答 默认 最新

  • 小P聊技术 2021-06-01 08:58
    关注
    • 首先用maven快速搭建一个spring boot 项目

    添加pom文件

    
     
    <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring.boot.version>1.5.9.RELEASE</spring.boot.version>
        </properties>
     
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <!-- Import dependency management from Spring Boot -->
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-dependencies</artifactId>
                    <version>${spring.boot.version}</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            </dependencies>
        </dependencyManagement>

    创建application.yml修改启动端口为8088。server.port=8088

    添加启动主类

    
     
    @SpringBootApplication
    public class WordParseApplication {
            public static void main(String[] args) {
                SpringApplication.run(WordParseApplication.class, args);
            }
    }

    引入控制类验证项目是否搭建成功

    package com.hello.word.controller;
     
    import org.springframework.http.MediaType;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
     
    /**
     * @author zhangwq 
     */
    @RestController
    @RequestMapping(value = "/hello",produces = MediaType.APPLICATION_JSON_VALUE)
    public class PoiWordController {
        @RequestMapping(value = "/word",method = RequestMethod.GET)
        public String helloWord(@RequestParam(value = "name") String string){
            return string;
        }
     
    }

    访问地址:http://localhost:8088/hello/word?name=helloword

    项目搭建成功。

     

    • 引入poi和swagger相关依赖
    <!-- 引入poi -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.17</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.17</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>3.17</version>
            </dependency>

    为了方便测试我们引入swagger,直接图形化界面调用接口

    
     
    <!-- 引入swagger相关jar包 -->
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger2</artifactId>
                <version>2.8.0</version>
            </dependency>
            <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-swagger-ui</artifactId>
                <version>2.8.0</version>
            </dependency>
    • 创建swagger配置类
    
     
    package com.hello.word.config;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import springfox.documentation.builders.ApiInfoBuilder;
    import springfox.documentation.builders.PathSelectors;
    import springfox.documentation.builders.RequestHandlerSelectors;
    import springfox.documentation.service.ApiInfo;
    import springfox.documentation.service.Contact;
    import springfox.documentation.spi.DocumentationType;
    import springfox.documentation.spring.web.plugins.Docket;
    import springfox.documentation.swagger2.annotations.EnableSwagger2;
     
    @Configuration //让Spring来加载该类配置
    @EnableSwagger2 //启用Swagger2
    public class SwaggerConfig {
        @Bean
        public Docket dataManagerApi() {
            return new Docket(DocumentationType.SWAGGER_2)
                    .groupName("POI解析word文档")
                    .apiInfo(apiInfo())
                    .select()
                    .apis(RequestHandlerSelectors.basePackage("com.hello.word.controller"))
                    .paths(PathSelectors.any()).build();
        }
     
        private ApiInfo apiInfo() {
            return new ApiInfoBuilder()
                    .title("POI解析word文档")
                    .description("POI解析word文档,包括doc和docx格式")
                    .termsOfServiceUrl("-----")
                    .contact(new Contact("zhangwq","----", "lion_qiang@163.com"))
                    .version("1.0").build();
        }
     
    }
    • PoiWordController中添加如下方法,解析doc和docx需要使用不同的组件,具体内容见代码注释。注:word文档中,将硬回车作为段落区分的标识,该方法将每个段落分别放入map中,返回给前台。
    
     
    /**
         * 按段落解析一个word文档
         * @param file
         * @return
         * @throws Exception
         */
        @ApiOperation(value="解析word文档", notes="按段落解析word文档")
        @RequestMapping(value = "upload", method = RequestMethod.POST)
        public Map uploadFile(@RequestParam(value = "file", required = true) MultipartFile file){
            String textFileName=file.getOriginalFilename();
            Map wordMap = new LinkedHashMap();//创建一个map对象存放word中的内容
            try {
                if(textFileName.endsWith(".doc")){ //判断文件格式
                    InputStream fis = file.getInputStream();
                    WordExtractor wordExtractor = new WordExtractor(fis);//使用HWPF组件中WordExtractor类从Word文档中提取文本或段落
                    int i=1;
                    for(String words : wordExtractor.getParagraphText()){//获取段落内容
                        System.out.println(words);
                        wordMap.put("DOC文档,第("+i+")段内容",words);
                        i++;
                    }
                    fis.close();
                }
                if(textFileName.endsWith(".docx")){
                    File uFile = new File("tempFile.docx");//创建一个临时文件
                    if(!uFile.exists()){
                        uFile.createNewFile();
                    }
                    FileCopyUtils.copy(file.getBytes(), uFile);//复制文件内容
                    OPCPackage opcPackage = POIXMLDocument.openPackage("tempFile.docx");//包含所有POI OOXML文档类的通用功能,打开一个文件包。
                    XWPFDocument document = new XWPFDocument(opcPackage);//使用XWPF组件XWPFDocument类获取文档内容
                    List<XWPFParagraph> paras = document.getParagraphs();
                    int i=1;
                    for(XWPFParagraph paragraph : paras){
                        String words = paragraph.getText();
                        System.out.println(words);
                        wordMap.put("DOCX文档,第("+i+")段内容",words);
                        i++;
                    }
                    uFile.delete();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(wordMap);
            return wordMap;
        }

    测试文档的内容如下

     

    • 分别用poi解析word.doc和poi解析word.doc(两个文件内容相同)验证得到我们想要的结果。

    评论

报告相同问题?

悬赏问题

  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?
  • ¥20 用户端如何上传图片到服务器和数据库里
  • ¥15 现在研究生在烦开题,看了一些文献,但不知道自己要做什么,求指导。
  • ¥30 vivado封装时总是显示缺少一个dcp文件
  • ¥100 pxe uefi启动 tinycore
  • ¥15 我pycharm运行jupyter时出现Jupyter server process exited with code 1,然后打开cmd显示如下
  • ¥15 可否使用carsim-simulink进行四轮独立转向汽车的联合仿真,实现四轮独立转向汽车原地旋转、斜向形式、横移等动作,如果可以的话在carsim中如何进行相应设置
  • ¥15 Caché 2016 在Java环境通过jdbc 执行sql报Parameter list mismatch错误,但是同样的sql使用连接工具可以查询出数据
  • ¥15 疾病的获得与年龄是否有关