前言

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. ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析
  2. Git从零教你入门(4):Git服务之 gogs部署安装
  3. Fancy Product Designer 产品定制 wordpress插件
  4. 如何在eclipse中添加android ADT
  5. Illustrator 教程,如何在 Illustrator 中锁定、分组和隐藏内容?
  6. linux内核make 时间久,Linux内核makefile问题
  7. 190228每日一句
  8. 微博上一些有用的话(四)
  9. 如何对PDF文件的文字图片编辑修改
  10. Java基本数据类型有哪些
  11. Allegro 常见问题
  12. 微信内置浏览器缓存如何避免,如何防止微信缓存
  13. 我的第一本书,被选作大学教材了!
  14. 暑期计算机数学培训心得体会,关于暑期培训心得体会三篇
  15. LabVIEW程序框图进行缩放
  16. com 如何新打开ac
  17. 2023年Java面试题大全(最新版版)面试题附答案详解,看完BTA可进
  18. HTML学生个人网站作业设计:电影网站设计——电影资讯博客(5页) HTML+CSS+JavaScript 简单DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载
  19. 学海无涯!分享一些行业经验,最新整理
  20. 产业复苏|2020区块链与数字经济高峰论坛暨区块链战“疫”报告线上发布会召开...

热门文章

  1. 微信小程序框架--weui
  2. 【JAVA】每日练习——02
  3. 【javaEE】——synchronized使用和单例模式(线程安全)03
  4. 【爆赞】这款Python小程序自动抠图只需5秒,秒杀PS手动抠图?
  5. 【重识云原生】第三章云存储第一节——分布式云存储总述
  6. Sketch79 mac专业矢量绘图设计
  7. 小程序轮播图测试用例
  8. 用于黑客渗透测试的 21 个最佳 Kali Linux 工具
  9. android 公式编辑器,公式编辑器
  10. Android Lottie动画