sunyanqiang před 3 roky
rodič
revize
dd1de1e41f
1 změnil soubory, kde provedl 231 přidání a 0 odebrání
  1. 231 0
      src/utils/exportWord.js

+ 231 - 0
src/utils/exportWord.js

@@ -0,0 +1,231 @@
+function _initData(exPortData) {
+  exPortData.fileName =
+    typeof exPortData.fileName !== "undefined"
+      ? exPortData.fileName
+      : "jQuery-Word-Export";
+  exPortData.fileType =
+    typeof exPortData.fileType !== "undefined" ? exPortData.fileType : ".doc";
+}
+
+function getModelHtml(mhtml, mhtmlBottom, exPortData) {
+  var styles,
+    updateStyles,
+    header,
+    Brow = '',
+    direction = 
+        typeof exPortData.direction !== "undefined"
+        ? exPortData.direction
+        : "Vertical",
+    footer = "";
+  if (exPortData.styles) {
+    styles = exPortData.styles.html();
+  }
+  if (exPortData.updateExportCss) {
+    updateStyles = exPortData.updateExportCss.html();
+  }
+  if (exPortData.direction == "Horizontal") {
+    // 横向
+    direction = `
+                    @page Section1{
+                        size:841.95pt 595.35pt;
+                        mso-page-orientation:landscape;
+                        margin:90.0pt 72.0pt 90.0pt 72.0pt;
+                        mso-header-margin:42.55pt;
+                        mso-footer-margin:49.6pt;
+                        mso-gutter-margin:0.0pt;
+                        mso-paper-source:0;
+                        padding:24.0pt 24.0pt 24.0pt 24.0pt;
+                        layout-grid:16.3pt;
+                    }
+
+                    div.Section1{
+                        page:Section1;
+                    }
+        `;
+  } else {
+    // 纵向
+        direction = `
+                        @page Section1{
+                            size:595.35pt 841.95pt;
+                            mso-page-orientation:luprightness;
+                            margin:72.0pt 90.0pt 72.0pt 90.0pt;
+                            mso-header-margin:42.55pt;
+                            mso-footer-margin:49.6pt;
+                            mso-gutter-margin:0.0pt;
+                            mso-paper-source:0;
+                            padding:24.0pt 24.0pt 24.0pt 24.0pt;
+                            layout-grid:16.3pt;
+                        }
+                                    
+                        div.Section1{
+                            page:Section1;
+                        }
+        `;
+  }
+  if (typeof exPortData.header !== 'undefined') {
+    header =
+      '<div style="mso-element:header;padding-bottom:20px;" id="h1">\n' +
+      '<p class="MsoHeader">' +
+      exPortData.header +
+      "</p>\n" +
+      "</div>";
+  }
+  if (typeof exPortData.footer !== 'undefined') {
+    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>";
+  }
+  if (typeof exPortData.header !== 'undefined' && typeof exPortData.footer !== 'undefined'){
+    Brow = `
+            <table id="hrdftrtbl" border="0" cellspacing="0" cellpadding="0">
+                <tbody>
+                    <tr>
+                        <td>
+                            ${header}
+                        </td>
+                        <td>
+                            ${footer}
+                        </td>
+                    </tr>
+                </tbody>
+        </table>
+    `
+  }
+  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 Section1 {
+							mso-title-page:yes; //首页不显示页眉页脚
+							mso-page-numbers:0; //起始页码从0开始
+                            mso-header-margin: 20px;
+                            mso-footer-margin: 20px;
+                            mso-header: h1;
+                            mso-footer: f1;
+                        }
+                
+                        div.Section1 {
+                            page: WordSection;
+                        }
+
+                        ${direction}
+                        ${styles}
+                        ${updateStyles}
+                    </style>
+                </head>
+                <body lang=ZH-CN style="tab-interval:21.0pt">
+                    <div class="Section1">
+                        ${mhtml}
+                        ${Brow}
+                    </div>
+                </body>
+            </html>
+            ${mhtmlBottom}
+        `;
+}
+
+const exportWord = function (exPortData) {
+  // 文档类型 fileType 可以doc xls html 其他的自己去试
+  if (typeof jQuery !== "undefined" && typeof saveAs !== "undefined") {
+    _initData(exPortData);
+    var options = {
+      maxWidth: 624,
+    };
+    // Clone selected element before manipulating it
+    
+    var markup = $(exPortData.dom).clone();
+    // Remove hidden elements from the output
+    markup.each(function () {
+      var self = $(exPortData.dom);
+      if (self.is(":hidden")) self.remove();
+    });
+
+    // 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";
+    }
+    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);
+  } else {
+    if (typeof jQuery === "undefined") {
+      console.error("Please make sure your (jQuery) exists --faith");
+    }
+    if (typeof saveAs === "undefined") {
+      console.error("Please make sure your (FileSaver.js) exists --faith");
+    }
+  }
+};
+
+export default exportWord;