使用Java操作office的案例

2021-11-20  本文已影响0人  WongBynn

前言

在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依赖:

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;"><dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.16</version> </dependency> </pre>

代码实现

Controller层:

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">`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;

/**

}` </pre>

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

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">`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;

/**

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);
}

}` </pre>

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

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

image.png image.png

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

image.png

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

使用Java生成Word

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

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">`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;

/**

生成的word如下图所示:

image.png

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

Word转PDF

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

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

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

<pre class="custom" data-tool="mdnice编辑器" style="margin-top: 10px; margin-bottom: 10px; border-radius: 5px; box-shadow: rgba(0, 0, 0, 0.55) 0px 2px 10px;">`package com.geovis.bin.utils.office;

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

import java.io.File;

/**

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

image.png
上一篇 下一篇

猜你喜欢

热点阅读