Loading...
墨滴

Bayanbulake

2021/11/20  阅读:20  主题:自定义主题1

Java常用的操作office案例

前言

在Web领域开发人员会经常遇到操作office的项目需求,作为Web领域占比较高的编程语言Java而言,更是如此。比如生成Word、导出Excel、Word转PDF(这个操作主要是为了能够使用户在浏览器端查看PDF文件)。

好了,话不多说,既然Java操作office如此常用,那就一起来实战吧~

使用Java导出Excel

我们在Spring Boot工程里面,使用hutool工具类进行Excel的写操作,hutool工具类是一个开源且功能强大的Java类库,其官方网站为:

https://www.hutool.cn/

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

Hutool中的工具方法来自每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;

在你的工程里面引入hutool maven依赖:

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.7.16</version>
</dependency>

代码实现

Controller层:

package com.geovis.bin.controller;

import com.geovis.bin.utils.office.ExcelUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;


/**
 * @Author Wangb
 * @Date 2021/10/20 9:19.
 */

@RestController
@RequestMapping(value = "/export")
public class OfficeController {
    @RequestMapping(value = "/excel",method = RequestMethod.GET)
    public void export(HttpServletResponse response) {
        ExcelUtil.exportExcel(response);
    }

}

方法功能实现的工具类层:

package com.geovis.bin.utils.office;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelWriter;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * @Author Wangb
 * @Date 2021/10/30 11:49.
 */


public class ExcelUtil {

    public static void exportExcel(HttpServletResponse httpServletResponse) {

        List<User> list = new ArrayList<>();
        list.add(new User("小王""23"new Date()));
        list.add(new User("小李""24"new Date()));
        list.add(new User("小波""25"new Date()));
        list.add(new User("小葛""26"new Date()));
        list.add(new User("小张""27"new Date()));
        list.add(new User("小轰""28"new Date()));

        //通过工具类创建writer,默认创建xls格式
        ExcelWriter writer = cn.hutool.poi.excel.ExcelUtil.getWriter();
        //自定义标题名
        writer.addHeaderAlias("name""姓名");
        writer.addHeaderAlias("age""年龄");
        writer.addHeaderAlias("birthday""生日");
        //合并单元格后的标题行,使用默认标题样式
        writer.merge(2"分数册");

        //一次性写出内容,使用默认样式,强制输出标题
        writer.write(list, true);
        //out为outputStream,需要写出到的目标流
        //httpServletResponse为HttpServletResponse对象
        httpServletResponse.setContentType("application/vnd.ms-excel;charset=utf-8");
        //text.xls是弹出的对话框的文件名,不能为中文,中文请自行编码
        String name = StrUtil.str(DateUtil.format(new Date(),"yyyyMMddHHmmss"), "UTF-8");
        httpServletResponse.setHeader("Content-Disposition""attachment;filename=" + name + ".xls");
        //可供浏览器直接下载
        httpServletResponse.setHeader("Content-type","text/html;charset=UTF-8");
        httpServletResponse.setCharacterEncoding("UTF-8");
        ServletOutputStream out = null;

        try {
            out = httpServletResponse.getOutputStream();
            writer.flush(out,true);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            writer.close();
        }
        //关闭servlet流
        IoUtil.close(out);
    }

   static class User {

        private String name;
        private String age;
        private Date birthday;

        public User(String name, String age, Date birthday) {
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public Date getBirthday() {
            return birthday;
        }

        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }

    public static void main(String[] args) {
        String sout = DateUtil.format(new Date(),"yyyyMMddHHmmss");
        System.out.println(sout);
    }

}

在方法实现的工具类里面,为了模拟在Excel里面插入结构化数据,我在工具类里面新建了一个静态类来实现自主定义的数据结构,原因就是方便,不想破坏外部代码的整洁。大家在实现的时候,完全可以在新建一个User类,来保证工具类的简洁。

接下来,我们使用postman来测试我们的方法,在postman请求方法之后,需要把响应结果另存为文件,并指定存储路径,如下图:

保存完成之后,我们就可以双击打开我们生成的Excel了。

根据上面的实战代码方法论,我们可以完成实际业务中复杂的数据导出工作。

使用Java生成Word

在使用Java生成word 的实战中,我们简单地插入了不同字体的文字、图片、表格,代码如下:

package com.geovis.bin.utils.office;

import cn.hutool.core.io.FileUtil;
import cn.hutool.poi.word.PicType;
import cn.hutool.poi.word.Word07Writer;

import java.awt.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @Author Wangb
 * @Date 20/11/2021 下午2:10.
 * @Description
 */

public class WordUtil {
    public static void createWord(List<WordUtil.User> list) throws FileNotFoundException {
        Word07Writer writer = new Word07Writer();

        // 添加段落(标题)
        writer.addText(new Font("方正小标宋简体", Font.PLAIN, 22), "我是第一部分""我是第二部分");
        // 添加段落(正文)
        writer.addText(new Font("宋体", Font.PLAIN, 22), "我是正文第一部分""我是正文第二部分");
        //添加一行不同字体的文字
        writer.addText(new Font("楷体", Font.PLAIN, 22), "我是正文第二部分""我是正文第二部分");
        //添加一个好看的小姐姐
        writer.addPicture(new File("W:\\desktop\\003YDHCvgy1gwa8b3rhp6j60u01407ak02.jpg"), 345460);
        //再来一个小姐姐
        writer.addPicture(new FileInputStream("W:\\desktop\\5f017eeely1gweqlclludj20u011g107.jpg"), PicType.JPEG, "model",345445);
        //添加一个表格
        writer.addTable(list);

        // 写出到文件
        writer.flush(FileUtil.file("W:\\desktop\\wordWrite.docx"));
        // 关闭
        writer.close();

    }
    static class User {

        private String name;
        private String age;
        private Date birthday;

        public User(String name, String age, Date birthday) {
            this.name = name;
            this.age = age;
            this.birthday = birthday;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public Date getBirthday() {
            return birthday;
        }

        public void setBirthday(Date birthday) {
            this.birthday = birthday;
        }
    }

    public static void main(String[] args) throws FileNotFoundException {
        List<WordUtil.User> list = new ArrayList<>();
        list.add(new WordUtil.User("小王""23"new Date()));
        list.add(new WordUtil.User("小李""24"new Date()));
        list.add(new WordUtil.User("小波""25"new Date()));
        list.add(new WordUtil.User("小葛""26"new Date()));
        list.add(new WordUtil.User("小张""27"new Date()));
        list.add(new WordUtil.User("小轰""28"new Date()));

        createWord(list);
    }
}

生成的word如下图所示:

你可以根据自己项目的需求,基于上面的代码进行改造。

Word转PDF

Web系统大多数时候上传的都是Word文件,但是用户有在Web端浏览文件的需求,那么Word转PDF则是一种很实际的需求。

现有的大多数使用Java把word转PDF,都需要借助第三方的服务或者是需要借助jar包和dll文件。我和大家分一个只需要jar包的方法。

公众号后台回复:word,即可获得jar包。

package com.geovis.bin.utils.office;

import com.aspose.words.Document;
import org.springframework.web.bind.annotation.RequestParam;

import java.io.File;

/**
 * @Author Wangb
 * @Date 20/11/2021 下午4:37.
 * @Description
 */

public class WordToPDF {
    public static void wordToPdf(@RequestParam(value = "wordPath") String wordPath, @RequestParam(value = "pdfPath") String pdfPath) {
        try {
            //doc路径
            Document document = new Document(wordPath);
            //pdf路径
            File outputFile = new File(pdfPath);
            //操作文档保存
            document.save(outputFile.getAbsolutePath(), com.aspose.words.SaveFormat.PDF);

            System.out.println(new File(wordPath).getName()+"转换PDF成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        String source = "W:\\desktop\\wordWrite.docx";
        String target = "W:\\desktop\\wordWrite.pdf";
        wordToPdf(source,target);
    }
}

word转PDF的结果如下图所示:

Bayanbulake

2021/11/20  阅读:20  主题:自定义主题1

作者介绍

Bayanbulake