前言

java操作excel表格可以使用POI,但是我觉得这些太麻烦了。如果说我想实现合并单元格等操作,可能会更加麻烦。所以我就找到了Xdoc这个第三方API。

一、XDOC

Xdoc官网:http://www.xdocin.com/index.html,具体的使用方法可以自己看看,我就不赘述了。

一、excel模板

在xdoc官网的最下方有一个关于excel的模板,可以下载模板、填充数据后的表格以及实现代码。

但是我想结合springboot 使用,所以还是不能直接使用官方提供的代码的。但是excel模板可以参考一下。

特别注意的是重复数据的第一个单元格一定要加一个批注,这个批注和代码里的参数key值相同,下面会提到。

二、封装工具类

xdoc可以本地jar包调用也可以http请求调用。首先,我们下载官方提供的jar包:http://www.xdocin.com/XDocService.jar,由于maven远程仓库没有响应的jar包,所以就需要我们自己手动打进本地maven仓库,打包命令在以前的博客 SpringBoot使用银联支付 里提到过,可以参考一下。

接下来就是封装一个工具类。

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;import com.hg.xdoc.XDocService;
import com.yuyi.lwq.tool.HttpUtils;public class XdocClient {private static final String XDOC_HOST = "http://www.xdocin.com/";private static final String XDOC_PATH = "xdoc";private static final String KEY = "自己的key";/*** word文档预览* @param docUrl* @return*/public static String preview(String docUrl){return "http://www.xdocin.com/xdoc?_func=to&_format=html&_cache=true&_xdoc="+docUrl;}/*** 转换文档格式* @param docUrl* @return*/public static String convert(String docUrl,Format format){String result = null;Map<String, String> param = new HashMap<String, String>();param.put("_func", "to");param.put("_key", KEY);param.put("_xdoc", docUrl);param.put("_format", format.toString());//param.put("_to", "d:/b.pdf");try {HttpResponse response = HttpUtils.doGet(XDOC_HOST, XDOC_PATH, null, param);HttpEntity entity = response.getEntity();int code = response.getStatusLine().getStatusCode();if (Objects.equals(code,200)) {byte[] byteArray = EntityUtils.toByteArray(entity);result = Base64.encodeBase64String(byteArray);}} catch (Exception e) {e.printStackTrace();}return result;}/*** 通过文件模板生成带数据的文件* @param docUrl 文件,可以是本地文件,也可以是网络文件* @param param 文件模板里对应的参数* @param fileName 生成的文件的名字,生成地址为:项目/source/fileName* @return*/public static boolean localGenerate(String docUrl,Map<String,Object> param,String fileName){boolean isSuccess = false;XDocService service = new XDocService();try {service.run(docUrl, param, new File(System.getProperty("user.dir")+"/source/"+fileName));isSuccess = true;} catch (IOException e) {e.printStackTrace();}return isSuccess;}public enum Format{DOCX{@Overridepublic String toString() {return "docx";}},XLSX{@Overridepublic String toString() {return "xlsx";}},PPTX{@Overridepublic String toString() {return "pptx";}},PDF{@Overridepublic String toString() {return "docx";}},HTML{@Overridepublic String toString() {return "html";}};}}

其中HttpUtil在之前的博客里写过

System.getProperty("user.dir")+"/source/"+fileName 是模板填充数据后生成的文件的位置

三、调用

接下来就可以在service层调用了

 public ResultDTO<JSONObject> download() throws Exception {//根据类别查询数据并生成json格式字符串List<GoodsSaleDTO> breadList = goodsSaleLWQDAO.listAllGoodsSaleByClassify(1);String bread = JSONObject.toJSONString(breadList);List<GoodsSaleDTO> drinkList = goodsSaleLWQDAO.listAllGoodsSaleByClassify(2);String drink = JSONObject.toJSONString(drinkList);List<GoodsSaleDTO> iceList = goodsSaleLWQDAO.listAllGoodsSaleByClassify(3);String ice = JSONObject.toJSONString(iceList);List<GoodsSaleDTO> hotList = goodsSaleLWQDAO.listAllGoodsSaleByClassify(4);String hot = JSONObject.toJSONString(hotList);List<GoodsSaleDTO> otherList = goodsSaleLWQDAO.listAllGoodsSaleByClassify(5);String other = JSONObject.toJSONString(otherList);LocalDate now = LocalDate.now();//模板需要的参数Map<String, Object> param = new HashMap<String, Object>();param.put("日期",LocalDateTimeTool.localDateToString(now, "yyyy年 MM月 dd日"));param.put("面包类", bread);param.put("饮品类", drink);param.put("雪糕类", ice);param.put("热饮类", hot);param.put("其他", other);String fileName = "休闲吧出库单 "+now.toString()+".xlsx";boolean isSuccess = XdocClient.localGenerate("模板文件地址", param,fileName);if (!isSuccess) {return ResultDTO.error(-1);}String pathName = System.getProperty("user.dir")+"/source/"+fileName;File file = new File(pathName);InputStream in = new FileInputStream(file);String result = FileTool.inputStream2String(in);JSONObject res = new JSONObject();res.put("fileName",fileName);res.put("file", result);return ResultDTO.ok(res);}

其中输入流转String的工具类如下

public class FileTool {public static String inputStream2String(InputStream in) throws IOException {ByteArrayOutputStream baos = new ByteArrayOutputStream();int len = 0;byte[] b = new byte[1024];    while ((len = in.read(b, 0, b.length)) != -1) {                     baos.write(b, 0, len);}byte[] buffer =  baos.toByteArray();//base64加密return Base64.encodeBase64String(buffer);}}

这样,先是在工程目录下生成文件,然后用文件输入流读取,再转为字符串。controller层调用后,string转为byte字节数组,直接返给前端页面就可以下载了。

 public ResponseEntity<Object> download()throws Exception{ResultDTO<JSONObject> result = goodsSaleService.download();Integer status = result.getStatus();//404if (Objects.equals(status,0)) {return ResponseEntity.notFound().build();}//出错if (Objects.equals(status, -1)) {return ResponseEntity.badRequest().build();}JSONObject json = result.getData();byte[] decodeData = Base64.decodeBase64(json.getString("file"));HttpHeaders headers = new HttpHeaders();headers.setCacheControl("no-cache, no-store, must-revalidate");headers.setContentDispositionFormData("attachment",new String(json.getString("fileName").getBytes("utf-8"), "ISO-8859-1"));headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);//headers.setContentLength(file.getContentLength());headers.setPragma("no-cache");return new ResponseEntity<Object>(decodeData, headers, HttpStatus.CREATED);}

写在最后的话

虽然是可以下载了,但是项目里还会有一份文件,时间长了之后,就会占用空间,所以我们可以写个方法删除或者定期清理。

File rootfile = new File(System.getProperty("user.dir")+"/source");
File[] files = rootfile.listFiles();
if (files.length != 0) {for (File file : files) {file.delete();}
}

(一)office文档操作之excel表格模板填充数据导出相关推荐

  1. Py自动化办公—Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送实战案例...

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 平阳歌舞新承宠,帘外春寒赐锦袍. ...

  2. Android实现在线预览office文档(Word,Pdf,excel,PPT.txt等格式)

    1.概述 我们都知道,Android原生并没有提供浏览office文档格式的相关Api,在安卓端想要实现在线预览office文档的功能显然很是复杂,我们手机安装QQ浏览器时,在手机打开office文档 ...

  3. 【QT】word文档操作实例——根据word模板生成word报表

    文章目录 引言 一.word模板准备 二.WordDemo实现 1.mainwindow.ui 2.mainwindow.h 3.mainwindow.cpp 三.实现效果 引言 在QT5.3中,在. ...

  4. python能处理表格文档_python处理excel表格

    1. Python 操作 Excel 的函数库我主要尝试了 3 种读写 Exce... python 导出 oracle excel 报表 (字段名和内容支持中 文字符) 1.需要预先安装两个 pyt ...

  5. 如何将XPS文档转成Excel表格?

    今天收到一个XPS文档,打开文档后发现里面的内容都是数据,使用Excel用公式整理会非常方便,那么如何将XPS文件转换成表格呢? 搜索了一圈虽然没有找到XPS转Excel工具,但却找到好用的XPS转P ...

  6. 在Word文档中插入Excel表格时出现:“用于创建此对象的程序是Excel。您的计算机尚未安装此程序。”试试这个方法

    出现这个错误提示,别急这去重装OFFICE套装,先试试这个方法: 1.右键点击Word,属性,兼容性,取消所有勾选选项. 2.右键点击Excel,属性,兼容性,取消所有勾选选项. 我是用这个方法弄好的 ...

  7. 计算机word如何插入新列表,电脑word文档中怎么给表格自动添加序号?怎么增加表目录...

    电脑word文档中怎么给表格自动添加序号?怎么增加表目录 腾讯视频/爱奇艺/优酷/外卖 充值4折起 我们看一篇word文件的时候,如果篇幅比较长而表格又比较多的话,一般会给这篇word设置一个表目录. ...

  8. 如何在浏览器中直接打开Word/Excel等Office文档?

    历史背景 随着协调办公的兴起,网页在线编辑文档也越来越广泛,很多大公司也发布了在线Office,但是也存在很多问题.比如桌面版Office就存在一些功能缺失:需要网络随时保持在线.不能保存桌面生成的文 ...

  9. office文档管理服务器编辑,_卓正软件 - PageOffice官方网站 - 在线编辑Word、Excel的Office文档控件...

    Office 组件 在线显示.编辑.保存Word文档 √ √ √ 在线显示.编辑.保存Excel文档 √ √ √ 在线显示.编辑.保存PowerPoint文档 √ √ √ 在线播放PowerPoint ...

  10. Vue 预览word,excel,ppt等office文档-内网访问(基于onlyoffice,后端返回文件流)

    Vue 预览word,excel等office 先看效果!! 需求背景:在前端页面中预览office文件且是内网访问,服务器不可访问外网的前提. 因此微软的接口就废掉了,因为他接口的条件是可以访问外网 ...

最新文章

  1. 《.Net框架程序设计》读书笔记 之 结构和索引器
  2. NIS、NFS 與 Autofs 整合應用
  3. Java IDE——Eclipse下载与安装
  4. 分类算法之决策树介绍
  5. MySQL 索引类别与索引使用指南
  6. python--列表,元组,字符串互相转换
  7. unity3d 自动变化大小_自动做游戏(1),自动生成人物侧面图
  8. mysql创建jdbc数据库_创建本地数据库mySQL并连接JDBC
  9. 【避坑指南】GD32 KEIL中SW Device没有识别芯片,jlink下载不进去的问题
  10. html的表格怎么设置样式,html 静态表格样式的设置
  11. Android 自定义锁屏_分享一款MIUI10精致主题,多种时间样式可选,可自定义字体颜色...
  12. word水印为什么被文字盖住了?
  13. Amcharts属性的含义
  14. C# 串口CRC CCITT-FALSE 校验
  15. 2021-5月13日-今日收获
  16. 如何设置Mac电脑的DNS
  17. python玩扫雷_Python玩转算法—扫雷
  18. 什么是url静态化?
  19. C++:关于保留小数和保留有效数字。
  20. uniapp 真机调试 click点击事件无效

热门文章

  1. nginx判断手机端还是电脑
  2. 解决资源监视器不显示的问题。
  3. 【JAVA】数据结构——二叉树 例题练习及代码详解
  4. 泛微E8的数据展示集成方法
  5. K3S高可用安装体验
  6. 项目进度管理-活动历时估算工具技术:三点估算
  7. Python调用OpenCV实现图像反色(反相)处理
  8. win10录屏_99%的人都忽略Windows自带的录屏软件,超好用!
  9. 微信小程序引入UI组件库
  10. 2018清华计算机专业优秀学生名单,2018信息学竞赛清华北大优秀学生签约名单