前言
在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
请求方法之后,需要把响应结果另存为文件,并指定存储路径,如下图:
保存完成之后,我们就可以双击打开我们生成的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(Listlist) 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 {
Listlist = 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的结果如下图所示: