使用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依赖:

 cn.hutool hutool-all 5.7.16  

代码实现

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 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请求方法之后,需要把响应结果另存为文件,并指定存储路径,如下图:

image.png
image.png

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

image.png

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

使用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 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"), 345, 460);
     //再来一个小姐姐
     writer.addPicture(new FileInputStream("W:\\desktop\\5f017eeely1gweqlclludj20u011g107.jpg"), PicType.JPEG, "model",345, 445);
     //添加一个表格
     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 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如下图所示:

image.png

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

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的结果如下图所示:

image.png

你可能感兴趣的:(使用Java操作office的案例)