导出Word有两种方式,分别是前端和后端
这两种方式在实际开发中根据实际需要会选择不同的方式
方式对比:

前端导出:

优点:简单,快捷,对于样式的设定也比较方便
缺陷:只可以导出本页展示的数据,导出的内容有限制

后端导出:

优点:对于数据没有限制
缺点:要到后台去重新获取数据,并且要进行格式的设定,比较麻烦

综合:

一般在前台导出报表等选择前端导出,但是如果数据很多,达到上万条的时候就只能选择后台导出

使用详解:

前端导出:
前端导出比较简单,采用了前端插件wordExport.js,改插件在使用的时候需要和FileSaver.js搭配使用
步骤:

  1. 首先在jsp文件中引入插件FileSaver.js和wordExport.js,注意一定要注意顺序,先引入FileSaver.js后引入wordExport.js
    FileSaver.js如下:
/* FileSaver.js* A saveAs() FileSaver implementation.* 1.3.2* 2016-06-16 18:25:19** By Eli Grey, http://eligrey.com* License: MIT*   See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md*//*global self */
/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true *//*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */var saveAs = saveAs || (function(view) {"use strict";// IE <10 is explicitly unsupportedif (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {return;}vardoc = view.document// only get URL when necessary in case Blob.js hasn't overridden it yet, get_URL = function() {return view.URL || view.webkitURL || view;}, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a"), can_use_save_link = "download" in save_link, click = function(node) {var event = new MouseEvent("click");node.dispatchEvent(event);}, is_safari = /constructor/i.test(view.HTMLElement), is_chrome_ios =/CriOS\/[\d]+/.test(navigator.userAgent), throw_outside = function(ex) {(view.setImmediate || view.setTimeout)(function() {throw ex;}, 0);}, force_saveable_type = "application/octet-stream"// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to, arbitrary_revoke_timeout = 1000 * 40 // in ms, revoke = function(file) {var revoker = function() {if (typeof file === "string") { // file is an object URLget_URL().revokeObjectURL(file);} else { // file is a Filefile.remove();}};setTimeout(revoker, arbitrary_revoke_timeout);}, dispatch = function(filesaver, event_types, event) {event_types = [].concat(event_types);var i = event_types.length;while (i--) {var listener = filesaver["on" + event_types[i]];if (typeof listener === "function") {try {listener.call(filesaver, event || filesaver);} catch (ex) {throw_outside(ex);}}}}, auto_bom = function(blob) {// prepend BOM for UTF-8 XML and text/* types (including HTML)// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BFif (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {return new Blob([String.fromCharCode(0xFEFF), blob], {type: blob.type});}return blob;}, FileSaver = function(blob, name, no_auto_bom) {if (!no_auto_bom) {blob = auto_bom(blob);}// First try a.download, then web filesystem, then object URLsvarfilesaver = this, type = blob.type, force = type === force_saveable_type, object_url, dispatch_all = function() {dispatch(filesaver, "writestart progress write writeend".split(" "));}// on any filesys errors revert to saving with object URLs, fs_error = function() {if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {// Safari doesn't allow downloading of blob urlsvar reader = new FileReader();reader.onloadend = function() {var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');var popup = view.open(url, '_blank');if(!popup) view.location.href = url;url=undefined; // release reference before dispatchingfilesaver.readyState = filesaver.DONE;dispatch_all();};reader.readAsDataURL(blob);filesaver.readyState = filesaver.INIT;return;}// don't create more object URLs than neededif (!object_url) {object_url = get_URL().createObjectURL(blob);}if (force) {view.location.href = object_url;} else {var opened = view.open(object_url, "_blank");if (!opened) {// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.htmlview.location.href = object_url;}}filesaver.readyState = filesaver.DONE;dispatch_all();revoke(object_url);};filesaver.readyState = filesaver.INIT;if (can_use_save_link) {object_url = get_URL().createObjectURL(blob);setTimeout(function() {save_link.href = object_url;save_link.download = name;click(save_link);dispatch_all();revoke(object_url);filesaver.readyState = filesaver.DONE;});return;}fs_error();}, FS_proto = FileSaver.prototype, saveAs = function(blob, name, no_auto_bom) {return new FileSaver(blob, name || blob.name || "download", no_auto_bom);};// IE 10+ (native saveAs)if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {return function(blob, name, no_auto_bom) {name = name || blob.name || "download";if (!no_auto_bom) {blob = auto_bom(blob);}return navigator.msSaveOrOpenBlob(blob, name);};}FS_proto.abort = function(){};FS_proto.readyState = FS_proto.INIT = 0;FS_proto.WRITING = 1;FS_proto.DONE = 2;FS_proto.error =FS_proto.onwritestart =FS_proto.onprogress =FS_proto.onwrite =FS_proto.onabort =FS_proto.onerror =FS_proto.onwriteend =null;return saveAs;}(typeof self !== "undefined" && self|| typeof window !== "undefined" && window|| this.content));
// `self` is undefined in Firefox for Android content script context
// while `this` is nsIContentFrameMessageManager
// with an attribute `content` that corresponds to the windowif (typeof module !== "undefined" && module.exports) {module.exports.saveAs = saveAs;
} else if ((typeof define !== "undefined" && define !== null) && (define.amd !== null)) {define([], function() {return saveAs;});
}

wordExport.js文件如下:

if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") {(function($) {$.fn.wordExport = function(fileName) {fileName = typeof fileName !== 'undefined' ? fileName : "jQuery-Word-Export";var static = {mhtml: {top: "Mime-Version: 1.0\nContent-Base: " + location.href + "\nContent-Type: Multipart/related; boundary=\"NEXT.ITEM-BOUNDARY\";type=\"text/html\"\n\n--NEXT.ITEM-BOUNDARY\nContent-Type: text/html; charset=\"utf-8\"\nContent-Location: " + location.href + "\n\n<!DOCTYPE html>\n<html>\n_html_</html>",head: "<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n<style>\n_styles_\n</style>\n</head>\n",body: "<body>_body_</body>"}};var options = {maxWidth: 624};// Clone selected element before manipulating itvar markup = $(this).clone();// Remove hidden elements from the outputmarkup.each(function() {var self = $(this);if (self.is(':hidden'))self.remove();});// Embed all images using Data URLsvar images = Array();var img = markup.find('img');for (var i = 0; i < img.length; i++) {// Calculate dimensions of output imagevar w = Math.min(img[i].width, options.maxWidth);var h = img[i].height * (w / img[i].width);// Create canvas for converting image to data URLvar canvas = document.createElement("CANVAS");canvas.width = w;canvas.height = h;// Draw image to canvasvar context = canvas.getContext('2d');context.drawImage(img[i], 0, 0, w, h);// Get data URL encoding of imagevar uri = canvas.toDataURL("image/png/jpg");$(img[i]).attr("src", img[i].src);img[i].width = w;img[i].height = h;// Save encoded image to arrayimages[i] = {type: uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")),encoding: uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")),location: $(img[i]).attr("src"),data: uri.substring(uri.indexOf(",") + 1)};}// Prepare bottom of mhtml file with image datavar mhtmlBottom = "\n";for (var i = 0; i < images.length; i++) {mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n";mhtmlBottom += "Content-Location: " + images[i].location + "\n";mhtmlBottom += "Content-Type: " + images[i].type + "\n";mhtmlBottom += "Content-Transfer-Encoding: " + images[i].encoding + "\n\n";mhtmlBottom += images[i].data + "\n\n";}mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";//TODO: load css from included stylesheet//var styles=' /* Font Definitions */@font-face{font-family:宋体;panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-alt:SimSun;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 680460288 22 0 262145 0;}  @font-face{font-family:"Cambria Math";panose-1:2 4 5 3 5 4 6 3 2 4;mso-font-charset:1;mso-generic-font-family:roman;mso-font-format:other;mso-font-pitch:variable;mso-font-signature:0 0 0 0 0 0;}  @font-face{font-family:"\@宋体";panose-1:2 1 6 0 3 1 1 1 1 1;mso-font-charset:134;mso-generic-font-family:auto;mso-font-pitch:variable;mso-font-signature:3 680460288 22 0 262145 0;}/* Style Definitions */p.MsoNormal, li.MsoNormal, div.MsoNormal{mso-style-unhide:no;mso-style-qformat:yes;mso-style-parent:"";margin:0cm;margin-bottom:.0001pt;mso-pagination:widow-orphan;font-size:14.0pt;font-family:宋体;mso-bidi-font-family:宋体;}p.MsoHeader, li.MsoHeader, div.MsoHeader{mso-style-noshow:yes;mso-style-priority:99;mso-style-link:"页眉 Char";margin:0cm;margin-bottom:.0001pt;text-align:center;mso-pagination:widow-orphan;layout-grid-mode:char;font-size:9.0pt;font-family:宋体;mso-bidi-font-family:宋体;}p.MsoFooter, li.MsoFooter, div.MsoFooter{mso-style-noshow:yes;mso-style-priority:99;mso-style-link:"页脚 Char";margin:0cm;margin-bottom:.0001pt;mso-pagination:widow-orphan;layout-grid-mode:char;font-size:9.0pt;font-family:宋体;mso-bidi-font-family:宋体;}p.MsoAcetate, li.MsoAcetate, div.MsoAcetate{mso-style-noshow:yes;mso-style-priority:99;mso-style-link:"批注框文本 Char";margin:0cm;margin-bottom:.0001pt;mso-pagination:widow-orphan;font-size:9.0pt;font-family:宋体;mso-bidi-font-family:宋体;}span.Char{mso-style-name:"页眉 Char";mso-style-noshow:yes;mso-style-priority:99;mso-style-unhide:no;mso-style-locked:yes;mso-style-link:页眉;font-family:宋体;mso-ascii-font-family:宋体;mso-fareast-font-family:宋体;mso-hansi-font-family:宋体;}span.Char0{mso-style-name:"页脚 Char";mso-style-noshow:yes;mso-style-priority:99;mso-style-unhide:no;mso-style-locked:yes;mso-style-link:页脚;font-family:宋体;mso-ascii-font-family:宋体;mso-fareast-font-family:宋体;mso-hansi-font-family:宋体;}span.Char1{mso-style-name:"批注框文本 Char";mso-style-noshow:yes;mso-style-priority:99;mso-style-unhide:no;mso-style-locked:yes;mso-style-link:批注框文本;font-family:宋体;mso-ascii-font-family:宋体;mso-fareast-font-family:宋体;mso-hansi-font-family:宋体;}p.msochpdefault, li.msochpdefault, div.msochpdefault{mso-style-name:msochpdefault;mso-style-unhide:no;mso-margin-top-alt:auto;margin-right:0cm;mso-margin-bottom-alt:auto;margin-left:0cm;mso-pagination:widow-orphan;font-size:10.0pt;font-family:宋体;mso-bidi-font-family:宋体;}span.msonormal0{mso-style-name:msonormal;mso-style-unhide:no;}.MsoChpDefault{mso-style-type:export-only;mso-default-props:yes;font-size:10.0pt;mso-ansi-font-size:10.0pt;mso-bidi-font-size:10.0pt;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman";mso-font-kerning:0pt;}/* Page Definitions */  @page WordSection1{size:595.3pt 841.9pt;margin:72.0pt 90.0pt 72.0pt 90.0pt;mso-header-margin:42.55pt;mso-footer-margin:49.6pt;mso-paper-source:0;}div.WordSection1{page:WordSection1;}';var styles="";// Aggregate parts of the file togethervar fileContent = static.mhtml.top.replace("_html_", static.mhtml.head.replace("_styles_", styles) + static.mhtml.body.replace("_body_", markup.html())) + mhtmlBottom;// Create a Blob with the file contentsvar blob = new Blob([fileContent], {type: "application/msword;charset=utf-8"});saveAs(blob, fileName + ".doc");};})(jQuery);
} else {if (typeof jQuery === "undefined") {console.error("jQuery Word Export: missing dependency (jQuery)");}if (typeof saveAs === "undefined") {console.error("jQuery Word Export: missing dependency (FileSaver.js)");}
}

2.然后给导出按钮添加事件
$("#id").wordExport(‘文件名称’);
3.收工完成,你没有看错,这就结束了,哈哈!

后端导出

后端导出的思想就是在数据库中将要导出的数据查出来,然后利用工具类将数据以一定的格式进行导出,并且自己根据需要添加样式,因为样式和数据差异较大,我就将工具类分享出来,大家可以去看看
工具类:

package com.inspur.dtdcommon.print.office.poi;import java.math.BigInteger;import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;/**
* @ClassName: PoiTableUtil
* @Description:使用poi生成word内容相关工具类
* @author: zjw
* @date: 2018-11-22 10:57:33
*/
public class PoiTableUtil {/*** 设置word表格边框属性** @param borderType*          线条类型* @param borderSize*          线条大小* @param borderColor*          设置颜色*/public static void setBorder(XWPFTable table, String borderType, String borderSize, String borderColor) {CTTblBorders borders = table.getCTTbl().getTblPr().addNewTblBorders();CTBorder hBorder = borders.addNewInsideH();hBorder.setVal(STBorder.Enum.forString(borderType)); // 线条类型hBorder.setSz(new BigInteger(borderSize)); // 线条大小hBorder.setColor(borderColor); // 设置颜色CTBorder vBorder = borders.addNewInsideV();vBorder.setVal(STBorder.Enum.forString(borderType));vBorder.setSz(new BigInteger(borderSize));vBorder.setColor(borderColor);CTBorder lBorder = borders.addNewLeft();lBorder.setVal(STBorder.Enum.forString(borderType));lBorder.setSz(new BigInteger(borderSize));lBorder.setColor(borderColor);CTBorder rBorder = borders.addNewRight();rBorder.setVal(STBorder.Enum.forString(borderType));rBorder.setSz(new BigInteger(borderSize));rBorder.setColor(borderColor);CTBorder tBorder = borders.addNewTop();tBorder.setVal(STBorder.Enum.forString(borderType));tBorder.setSz(new BigInteger(borderSize));tBorder.setColor(borderColor);CTBorder bBorder = borders.addNewBottom();bBorder.setVal(STBorder.Enum.forString(borderType));bBorder.setSz(new BigInteger(borderSize));bBorder.setColor(borderColor);}/*** 设置表格内容** @param table*          当前表格* @param cellIndex* :* 当前操作的列* @param rowIndex*          当前操作的行* @param content*          内容* @param fontSize*          字体大小* @param fontFamily*          字体样式*/public static void setFontStyle(XWPFTable table, int cellIndex, int rowIndex, String content, int fontSize, String fontFamily) {XWPFRun run = table.getRow(rowIndex).getCell(cellIndex).getParagraphs().get(0).createRun();run.setText(content);run.setFontSize(fontSize);run.setFontFamily(fontFamily);}/*** 设置段落换行** @param value*          需要换行的内容* @param paragraph*          当前段落* @param run*/public static void setWrap(Object value, XWPFParagraph paragraph, XWPFRun run) {if (((String) value).indexOf("\r") > 0) {// 设置换行String[] text = value.toString().split("\r");paragraph.removeRun(0);run = paragraph.insertNewRun(0);for (int f = 0; f < text.length; f++) {if (f == 0) {// 此处不缩进因为word模板已经缩进了。run.setText(text[f].trim());} else {run.addCarriageReturn();// 硬回车// 注意:wps换行首行缩进是三个空格符,office要的话可以用 run.addTab();缩进或者四个空格符run.setText(text[f].trim());}}} else {run.setText((String) value);}}
}

导出Word的两种方式相关推荐

  1. 导出excel的两种方式

    引言 导出excel就是将后台的数据在数据库中查找出来,然后再将数据存放进excel表格中,这种操作多用于一些统计表中,将table中的数据导出来,存放进excel表格中.(最近在将手机中的短信往电脑 ...

  2. java 桥 word_java导出word的6种方式(转发)

    最近做的项目,需要将一些信息导出到word中.在网上找了好多解决方案,现在将这几天的总结分享一下. 目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的 ...

  3. java导出word的几种方式

    目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过J ...

  4. java导出word纸张方向_java导出word的几种方式

    目前来看,java导出word大致有6种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Java与微软的COM组件之间构建一座桥梁.使用Jacob自带的DLL动态链接库,并通过J ...

  5. java_导出_word_[转载]java导出word的5种方式

    在网上找了好多天将数据库中信息导出到word中的解决方案,现在将这几天的总结分享一下.总的来说,java导出word大致有5种解决方案: 1:Jacob是Java-COM Bridge的缩写,它在Ja ...

  6. java导出excel的两种方式

    博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏. ...

  7. asp.net 生成下载word的两种方式

    第一种 通过网页直接生成word下载 Response.AddHeader("Content-Disposition", "p_w_upload;filename=&qu ...

  8. Java 导入导出Excle表格 两种方式

    参考1:http://www.cnblogs.com/hanfeihanfei/p/7079210.html 参考2:http://blog.csdn.net/jerehedu/article/det ...

  9. DLL中导出函数的声明有两种方式

    本文引用自:VC编程时DLL中导出函数的声明有两种方式 一种方式是:在函数声明中加上__declspec(dllexport): 另外一种方式是:采用模块定义(.def)文件声明,(.def)文件为链 ...

最新文章

  1. JavaScript 工作原理之五-深入理解 WebSockets 和带有 SSE 机制的HTTP/2 以及正确的使用姿势(译)...
  2. boost::spirit模块实现演示逗号分隔的数字列表的解析器的测试程序
  3. admin客户管理系统html5模板
  4. python-Generalization of Hops
  5. [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法
  6. 基于P2P终结者的ARP欺骗攻击实验
  7. SWUST OJ【972】
  8. ASUS ROG G20 刷新BIOS
  9. 【数学分析】集合 ① ( 集合概念 | 集合表示 | 常用的数集合 | 集合的表示 )
  10. aspose.words复制插入同一word文档中的某个页面
  11. 立创eda学习笔记三十:布局传递
  12. 用python在excel中做批量计算(包括单元格为空值时的处理情况)
  13. 5G+AI+大数据+IoT如何改变一切?
  14. 解密淘宝优惠群泛滥的原因
  15. 昂达b450s 内存超频3200,xmp设置教程
  16. 期货如何展期(期货合约展期)
  17. 机器学习常见问题 - 类别变量处理
  18. 大数据架构师之路-性能评估
  19. 嵌入式 - 固件防复制系列【3】GD32读保护解除
  20. 【数据可视化】案例一:美国人口与种族变迁史

热门文章

  1. 网鼎杯青龙组 web题-AreUSerialz
  2. git clone的时候直接加上用户名和密码
  3. 闲谈swi与ucos-终结
  4. HTML 定位(position)
  5. PAT_乙级1016
  6. 【免费分享】2020-2021年广告营销类行业报告集合(149份)
  7. ZOJ 3898 Stean 矩形法求积分
  8. Tailwind Border
  9. python混淆ios代码_iOS 代码混淆的简单使用
  10. python datetime 格式化_[已解决]Python中用strftime格式化datetime出错