sunyanqiang 3 éve
szülő
commit
c7446c4dfa
2 módosított fájl, 173 hozzáadás és 81 törlés
  1. 11 0
      src/main.js
  2. 162 81
      src/utils/jquery.wordexport.js

+ 11 - 0
src/main.js

@@ -98,6 +98,17 @@ Vue.filter('dataFormaty', originVal => {
     return `${y}年${m}月${d}日`
   }
 
+})
+// originVal 后台返回的中国标准时间
+Vue.filter('dataFormatys', originVal => {
+  const dt = new Date(originVal)
+  if (originVal) {
+    const y = dt.getFullYear()
+    const m = (dt.getMonth() + 1 + '').padStart(2, '0')
+    const d = (dt.getDate() + '').padStart(2, '0')
+    return `${y}.${m}.${d}`
+  }
+
 })
 
 import dataV from '@jiaminghi/data-view'

+ 162 - 81
src/utils/jquery.wordexport.js

@@ -1,88 +1,169 @@
-// eslint-disable-next-line no-unused-vars
-const jquery_word = function (className, fileName, style) {
-    if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") {
-                fileName = typeof fileName !== 'undefined' ? fileName : "jQuery-Word-Export";
-                let faith = {
-                    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 xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">\n_html_</html>',
-                        head:
-                            '<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n<style>\n_styles_\n</style>\n<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val="Cambria Math"/><m:brkBin m:val="before"/><m:brkBinSub m:val="--"/><m:smallFrac m:val="off"/><m:dispDef/><m:lMargin m:val="0"/> <m:rMargin m:val="0"/><m:defJc m:val="centerGroup"/><m:wrapIndent m:val="1440"/><m:intLim m:val="subSup"/><m:naryLim m:val="undOvr"/></m:mathPr></w:WordDocument></xml><![endif]--></head>\n',
-                        body: "<body>_body_</body>",
-                    },
-                };
-                var options = {
-                    maxWidth: 624,//最大宽度
-                };
-                // Clone selected element before manipulating it
-                var markup = $(className).clone();
-
-                // Remove hidden elements from the output
-                markup.each(function () {
-                    var self = $(this);
-                    if (self.is(':hidden'))
-                        self.remove();
-                });
-
-                // Embed all images using Data URLs
-                var images = Array();
-                var img = markup.find('img');
-                // var img = new Image(); 用这一行的话,WPS不显示图片,用上面的——只兼容office Word。
-                var mhtmlBottom = "\n";
-                for (var i = 0; i < img.length; i++) {
-                    // Calculate dimensions of output image
-                    var w = Math.min(img[i].width == 0 ? options.maxWidth : img[i].width, options.maxWidth);
-                    var h = (img[i].height == 0 ? options.defaultLength : img[i].height) * (w / (img[i].width == 0 ? options.maxWidth : img[i].width));
-
-                    // Create canvas for converting image to data URL
-                    var canvas = document.createElement("CANVAS");
-                    canvas.width = w;
-                    canvas.height = h;
-                    // Draw image to canvas
-                    var context = canvas.getContext('2d');
-                    context.drawImage(img[i], 0, 0, w, h);
-                    // Get data URL encoding of image
-                    var uri = canvas.toDataURL("image/png");
-                    // console.log(i+":"+uri);
-                    $(img[i]).attr("src", img[i].src);
-                    img[i].width = w;
-                    img[i].height = h;
+import jQuery from "jquery"
+if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") {
+    (function ($) {
+        $.fn.wordExport = function (exPortData) {
 
-                    mhtmlBottom += "--NEXT.ITEM-BOUNDARY\n";
-                    mhtmlBottom += "Content-Location: " + uri + "\n";
-                    mhtmlBottom += "Content-Type: " + uri.substring(uri.indexOf(":") + 1, uri.indexOf(";")) + "\n";
-                    mhtmlBottom += "Content-Transfer-Encoding: " + uri.substring(uri.indexOf(";") + 1, uri.indexOf(",")) + "\n\n";
-                    mhtmlBottom += uri.substring(uri.indexOf(",") + 1) + "\n\n";
-                }
+            _initData(exPortData);
+            var options = {
+                maxWidth: 624
+            };
+            // Clone selected element before manipulating it
+            var markup = $(this).clone();
 
-                mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";
+            // Remove hidden elements from the output
+            markup.each(function () {
+                var self = $(this);
+                if (self.is(':hidden'))
+                    self.remove();
+            });
 
-                //TODO: load css from included stylesheet
-                var styles = style;
-
-                // Aggregate parts of the file together
-                var fileContent = faith.mhtml.top.replace("_html_", faith.mhtml.head.replace("_styles_", styles) + faith.mhtml.body.replace("_body_", markup.html())) + mhtmlBottom;
-
-                // Create a Blob with the file contents
-                var blob = new Blob([fileContent], {
-                    type: "application/msword;charset=utf-8"
-                });
-                saveAs(blob, fileName + ".doc");
+            // Embed all images using Data URLs
+            var images = Array();
+            var img = markup.find('img');
+            for (var i = 0; i < img.length; i++) {
+                // Calculate dimensions of output image
+                var w = Math.min(img[i].width, options.maxWidth);
+                var h = img[i].height * (w / img[i].width);
+                // Create canvas for converting image to data URL
+                var canvas = document.createElement("CANVAS");
+                canvas.width = w;
+                canvas.height = h;
+                // Draw image to canvas
+                var context = canvas.getContext('2d');
+                context.drawImage(img[i], 0, 0, w, h);
+                // Get data URL encoding of image
+                var uri = canvas.toDataURL("image/png");
+                $(img[i]).attr("src", img[i].src);
+                img[i].width = w;
+                img[i].height = h;
+                // Save encoded image to array
+                images[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 data
+            var 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";
             }
-    else {
-        if (typeof jQuery === "undefined") {
-            console.error("jQuery Word Export: missing dependency (jQuery)");
+            mhtmlBottom += "--NEXT.ITEM-BOUNDARY--";
+            var fileContent = getModelHtml(markup.html(), mhtmlBottom, exPortData);
+            var blob = new Blob([fileContent], {
+                type: "application/msword;charset=utf-8"
+            });
+            saveAs(blob, exPortData.fileName + exPortData.fileType);
+        };
+        function _initData(exPortData) {
+            exPortData.fileName = typeof (exPortData.fileName) !== 'undefined' ? exPortData.fileName : "jQuery-Word-Export";
+            exPortData.fileType = typeof (exPortData.fileType) !== "undefined" ? exPortData.fileType : ".doc";
         }
-        if (typeof saveAs === "undefined") {
-            console.error("jQuery Word Export: missing dependency (FileSaver.js)");
-        }
-    }
-}
+        function getModelHtml(mhtml, mhtmlBottom, exPortData) {
+            var styles, updateStyles, header, footer = "";
+            if (exPortData.styles) {
+                styles = exPortData.styles.html();
+            }
+            if (exPortData.updateExportCss) {
+                updateStyles = exPortData.updateExportCss.html();
+            }
+            if (exPortData.isHeader) {
+                header = "<div style=\"mso-element:header;padding-bottom:20px;\" id=\"h1\">\n" +
+                    "<p class=\"MsoHeader\">" + exPortData.header + "</p>\n" +
+                    "</div>";
+            }
+            if (exPortData.isFooter) {
+                footer = "<div style=\"mso-element:footer;text-align: center;\" id=\"f1\">\n" +
+                    "<p class=\"MsoHeader\">" + exPortData.footer + "</p>\n" +
+                    "<p class=\"MsoNum\"><span class=\"num\" style=\"mso-field-code: PAGE \"></span>/<span style=\"mso-field-code:NUMPAGES\"></span>\n</p>\n" +
+                    "</div>";
+            }
 
-export default jquery_word
+            /*
+                html标签中,和meta标签下面的判断,用来默认显示页面视图模式
+             */
+            return `
+                <!DOCTYPE html>
+                <html xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"http://schemas.microsoft.com/office/2004/12/omml\" xmlns=\"http://www.w3.org/TR/REC-html40\">
+                <head>
+                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+					<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val=\"Cambria Math\"/><m:brkBin m:val=\"before\"/><m:brkBinSub m:val=\"--\"/><m:smallFrac m:val=\"off\"/><m:dispDef/><m:lMargin m:val=\"0\"/> <m:rMargin m:val=\"0\"/><m:defJc m:val=\"centerGroup\"/><m:wrapIndent m:val=\"1440\"/><m:intLim m:val=\"subSup\"/><m:naryLim m:val=\"undOvr\"/></m:mathPr></w:WordDocument></xml><![endif]-->
+                    <style type="text/css">
+                        table#hrdftrtbl {
+                            width: 1px;
+                            height: 1px;
+                            overflow: hidden;
+                        }
+                
+                        p.MsoHeader {
+                            font-size: 20px;
+                            font-weight: bold;
+                            text-align: center;
+                        }
+                
+                        p.MsoFooter, li.MsoFooter, div.MsoFooter {
+                            margin: 0in;
+                            mso-pagination: widow-orphan;
+                            tab-stops: center 3.0in right 6.0in;
+                            font-size: 20pt;
+                            font-weight: bold
+                        }
+						
+						p.MsoNum{
+							text-align: center;
+						}
+                
+                        <!-- /*FontDefinitions*/
+                        @page WordSection {
+							mso-title-page:yes; //首页不显示页眉页脚
+							mso-page-numbers:0; //起始页码从0开始
+                            mso-header-margin: 20px;
+                            mso-footer-margin: 20px;
+                            mso-header: h1;
+                            mso-footer: f1;
+                        }
+                
+                        div.WordSection {
+                            page: WordSection;
+                        }
+                
+                        -->
+                        ${styles}
+                        ${updateStyles}
+                    </style>
+                </head>
+                <body lang=ZH-CN style="tab-interval:21.0pt">
+                <div class="WordSection">
+                    ${mhtml}
+                    
+                    <table id="hrdftrtbl" border="0" cellspacing="0" cellpadding="0">
+                        <tbody>
+                        <tr>
+							<td>
+								${header}
+							</td>
+							<td>
+								${footer}
+							</td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+                </body>
+                </html>
+    `}
+    })(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)");
+    }
+}