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

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

/**

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

}` </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;

/**

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

}` </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;

/**

  • @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"), 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<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);
    

    }
    }` </pre>

生成的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;

/**

  • @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);
    }
    }` </pre>

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

image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容