JavaScript È°¿ëÆÁ
2020.09.21 / 11:20

HTML5 + sheet.js ¸¦ ÀÌ¿ëÇÑ Å¬¶óÀ̾ðÆ® Excel parse

XMaLL°ü¸®ÀÚ
Ãßõ ¼ö 273


   HTML5 + sheet.js ¸¦ ÀÌ¿ëÇÑ Å¬¶óÀ̾ðÆ® Excel parse


¹Ù¾ßÈå·Î 2017.05.31 ±âÁØ. 


Ȥ½Ã³ª ½Í¾î¼­ °Ë»öÇÑ °á°ú ÁøÀÛ¿¡ Ŭ¶óÀ̾ðÆ®¿¡¼­µµ ¿¢¼¿ ÆĽÌ󸮰¡ °¡´ÉÇØÁ³´Ù.


ÀÏÀü¿¡ ½è´ø±ÛÀÎ "HTML TableÀ» ¿¢¼¿·Î ³»º¸³»±â : Export to excel sheet on client side" ¿¡¼­´Â 


¿¢¼¿ ÀúÀåÇϱ⸦ ´Ù·ç¾ú´Âµ¥ a ű×ÀÇ HTML5 ¼Ó¼ºÀÎ datatype°ú download¸¦ ÀÌ¿ëÇϸé Çü½Ä°ú ÆÄÀϸíÀ» 


Á÷Á¢ ¸¸µé°í ÀúÀåÇϱⰡ °¡´ÉÇØÁ®¼­ ¾à°£ÀÇ ±ÔÄ¢¸¸ ÁöŲ´Ù¸é ¶óÀ̺귯¸® µûÀ§¾ø¾îµµ ¿¢¼¿Çü½ÄÀ» °®Ãá ÆÄÀÏÀ» 


¸¸µé ¼ö ÀÖ¾ú°í Å×ÀÌºí ¼¿ÀÇ ¼Ó¼ºÀ» ÀüºÎ ÀçÇöÇØ ³»°í ½ÍÀº °æ¿ì ¶óÀ̺귯¸®¸¦ »ç¿ëÇϸé (¾Æ¸¶) ¿¢¼¿À» 


Ãâ·ÂÅ°À§ÇÑ Á¤È®ÇÑ Çì´õÆÄÀÏÀ» ÁöĪÇÏ°í ±× ½ºÅ¸ÀÏ(ȤÀº ű×)À» ¿Â°ÇÈ÷ ¹Ý¿µÇÑ Á¤µµ°¡ ºÐ¸íÇÒ °ÍÀ̱⿡ 


±×´ÙÁö »õ·Î¿î ³»¿ëÀ» Á¢ÇÑ ´À³¦Àº ¾Æ´Ï¾ú´Ù.


±×·¯³ª.


¿¢¼¿À» Àд´ٴ°ÍÀº binary ȤÀº Blob °°Àº raw data ¹öÆÛ󸮰¡ °¡´ÉÇÏ´Ù´Â ¾ê±âÀε¥.. 


óÀ½ ³» ¿¹»óÀº node.js¸¦ ÅëÇؼ­ »ç¿ëÇÑ ¹ÙÀ̳ʸ®Àбâ Á¤µµ·Î ¿¹»óÇßÀ¸³ª ( ¿ª½Ã npm¿¡ ÀÖÀ»ÁÙ ¾Ë¾Ò´Ù )1


ÆÄÀÏÀº HTML5ÀÇ °´Ã¼·Î Àаí, ÀÌÈÄÀÇ ³»¿ë Ãâ·ÂÀº ´É·ÂÀÚ°¡ ¿ÀǼҽº·Î ¸¸µç sheet.js ¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇÏ¿©


binary ȤÀº base64 Çü½Ä¿¡ ´ëÇÑ ÆĽÌÀÌ °¡´ÉÇÏ´Ù.


ÀÚ¼¼ÇÑ ³»¿ëÀº °è¼Ó À̾°Ú´Ù.




   HTML5 ÀÇ FileReader °´Ã¼



¸ÕÀú HTML5ÀÇ FileReader °´Ã¼´Â Ŭ¶óÀ̾ðÆ® File°´Ã¼ÀÇ ³»¿ëÀаí ÄÄÇ»ÅÍ¿¡ ÀúÀåÇϴ°ÍÀ» °¡´ÉÇÏ°Ô ÇØÁØ´Ù.


           ÀÌ File°´Ã¼¸¦ ¾ò±â À§ÇÑ ¹æ¹ýÀº ¾Æ·¡¿Í °°Àº 3°¡Áö ¼Ö·ç¼ÇÀÌ ÀÖ´Ù. 


           1. ÈçÈ÷ »ç¿ëÇϴ <input> Å±׸¦ ÀÌ¿ëÇÏ¿© À¯Àú°¡ ¼±ÅÃÇÑ ÆÄÀϵéÀÇ °á°úÀÎ FileList °´Ã¼


           2. µå·¡±× ¾Ø µå¶øÀ¸·Î ¹ÝȯµÈ DataTransfer °´Ã¼


           3. HTML CanvasElementÀÇ mozGetAsFile() API ·Î ¾òÀ» ¼ö ÀÖ´Ù.



¼Ó¼ºEDIT

FileReader.error Read only
DOMError  ÆÄÀÏÀ» Àд µµÁß¿¡ ¹ß»ýÇÑ ¿¡·¯¸¦ ³ªÅ¸³À´Ï´Ù.
FileReader.readyState Read only
FileReaderÀÇ »óŸ¦ ³ªÅ¸³»´Â ¼ýÀÚÀÔ´Ï´Ù

»óÅ °ªµé

EMPTY   : 0 : ¾ÆÁ÷ µ¥ÀÌÅÍ°¡ ·Îµå µÇÁö ¾Ê¾ÒÀ½.
LOADING : 1 : µ¥ÀÌÅÍ°¡ ·Îµù Áß.
DONE    : 2 : ¸ðµç Àб⠿äûÀÌ ¿Ï·áµÊ.
 
FileReader.result Read only
ÆÄÀÏÀÇ ÄÁÅÙÃ÷ÀÔ´Ï´Ù. ÀÌ ¼Ó¼ºÀº Àбâ ÀÛ¾÷ÀÌ ¿Ï·áµÇ°í Àбâ ÀÛ¾÷ÀÇ ÃʱâÈ­¿¡ »ç¿ëÇÑ ¹æ½ÄÀ¸·Î °áÁ¤µÈ µ¥ÀÌÅÍÀÇ Æ÷¸ËÀÌ Á¤ÇØÁø ÈÄ¿¡ À¯È¿ÇÕ´Ï´Ù.

À̺¥Æ® Çڵ鷯

FileReader.onabort
abort À̺¥Æ®ÀÇ Çڵ鷯. ÀÌ À̺¥Æ®´Â Àб⠵¿ÀÛÀÌ Áß´Ü µÉ ¶§¸¶´Ù ¹ß»ýÇÕ´Ï´Ù.
FileReader.onerror
error À̺¥Æ®ÀÇ Çڵ鷯. ÀÌ À̺¥Æ®´Â Àб⠵¿ÀÛ¿¡ ¿¡·¯°¡ »ý±æ ¶§¸¶´Ù ¹ß»ýÇÕ´Ï´Ù.
FileReader.onload
load À̺¥Æ®ÀÇ Çڵ鷯. ÀÌ À̺¥Æ®´Â Àб⠵¿ÀÛÀÌ ¼º°øÀûÀ¸·Î ¿Ï·á µÇ¾úÀ» ¶§¸¶´Ù ¹ß»ýÇÕ´Ï´Ù.
FileReader.onloadstart
loadstart À̺¥Æ® Çڵ鷯. ÀÌ À̺¥Æ®´Â Àб⠵¿ÀÛÀÌ ½ÇÇà µÉ ¶§¸¶´Ù ¹ß»ýÇÕ´Ï´Ù.
FileReader.onloadend
loadend À̺¥Æ® Çڵ鷯. ÀÌ À̺¥Æ®´Â Àб⠵¿ÀÛÀÌ ³¡³µÀ» ¶§¸¶´Ù ¹ß»ýÇÕ´Ï´Ù. (ÀбâÀÇ ¼º°øÀ̳ª ½ÇÆÐ ¿©ºÎ´Â »ó°ü ¾Ê½À´Ï´Ù.)
FileReader.onprogress
progress À̺¥Æ® Çڵ鷯. ÀÌ À̺¥Æ®´Â Blob ÄÁÅÙÆ®¸¦ Àд µ¿¾È È£ÃâµË´Ï´Ù.


¸Þ¼ÒµåEDIT

FileReader.abort()
Àб⠿äûÀ» ÁߴܽÃŵ´Ï´Ù.  ¸®ÅÏÀÌ µÇ¸é readyState ´Â DONEÀÌ µË´Ï´Ù.
FileReader.readAsArrayBuffer()
Starts reading the contents of the specified Blob, once finished, the result attribute contains an ArrayBuffer representing the file's data.
FileReader.readAsBinaryString()
Starts reading the contents of the specified Blob, once finished, the result attribute contains the raw binary data from the file as a string.
FileReader.readAsDataURL()
Starts reading the contents of the specified Blob, once finished, the result attribute contains a data: URL representing the file's data.
FileReader.readAsText()
Starts reading the contents of the specified Blob, once finished, the result attribute contains the contents of the file as a text string.

Browser compatibilityEDIT

FeatureFirefox (Gecko)ChromeInternet Explorer*Opera*Safari
Basic support3.6 (1.9.2)71012.026.0.2


Ãâó : https://developer.mozilla.org/ko/docs/Web/API/FileReader




TIP ) 


²À FileReader¸¦ »ç¿ëÇؾßÇϳª? ±×°Ç ¾Æ´Ï´Ù. Uint8Array¸Þ¼­µå¸¦ »ç¿ëÇÏ¸é ¹öÆÛÀбⰡ °¡´ÉÇÏ°í 


¹öÆÛ¸¦ Àд´ٴ°ÍÀº ÀÐÀº ¹öÆÛ¸¦ ¸ðµÎ join½ÃÄѼ­ ¹ÙÀ̳ʸ®µ¥ÀÌÅÍ·Î °¡°øÇϴ°ÍÀÌ °¡´ÉÇÔÀ» À̾߱âÇÑ´Ù.


1
2
3
4
5
  /* convert data to binary string */
  var data = new Uint8Array(arraybuffer);
  var arr = new Array();
  for(var i = 0; i != data.length++i) arr[i] = String.fromCharCode(data[i]);
  var bstr = arr.join("");
cs


¶ÇÇÑ array buffer Àΰæ¿ì base64 ·Î ÀÎÄÚµùµµ °¡´ÉÇÏ´Ù.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 /* processing array buffers, only required for readAsArrayBuffer */
function fixdata(data) {
  var o = "", l = 0, w = 10240;
  for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
  o+=String.fromCharCode.apply(nullnew Uint8Array(data.slice(l*w)));
  return o;
}
 
 
var files = e.dataTransfer.files;
var i,f;
for (i = 0; i != files.length++i) {
    f = files[i];
    var reader = new FileReader();
    var name = f.name;
    reader.onload = function(e) {
        var data = e.target.result;
 
        /* if array buffer, convert to base64 */
        var arr = fixdata(data);
    }
}
cs


³»¿ëÁ¤¸® : serpiko


Ãâó : https://sheetjs.gitbooks.io/docs/#ecmascript-5-compatibility




   Javasscript Library Sheet.js



¿ÀǼҽº·Î Á¦ÀÛµÈ Sheet.js ( http://sheetjs.com/ ) ¿¡ ´ëÇÑ °£·«ÇÑ ¼Ò°³¸¦ ÇÏÀÚ¸é


½ºÇÁ·¹µå ½ÃÆ®ÀÇ º¹À⼺À» Ãß»óȭŲÈÄ ºê¶ó¿ìÀú¿¡¼­ Àç»ýÇØÁØ´Ù.


ÀÌ ½ºÇÁ·¹µå½ÃÆ®¶ó´Â°ÍÀÌ ´ë·« 20°¡Áö°¡ Àִµ¥ ¾Æ·¡¿Í °°´Ù°í ÇÑ´Ù. ( ³­ ±×³É Excel ¾ê±âÇÏ´ÂÁÙ ¾Ë¾Ò´Âµ¥... )



¾î·µç »ç¿ëÇÏ°íÀÖ´Â ÁÖ¿äÇÑ ½ºÇÁ·¹µå ½ÃÆ® Çü½ÄÀ» Áö¿øÇÑ´Ù°í Çϸç


Free your Data! ´ç½ÅÀÇ µ¥ÀÌÅ͸¦ ¹«·á·Î! ... Á¦ÀÏ ¸¶À½¿¡ ¿Í´ê´Â ¸»À̾ú´Ù.


±âº»»ç¿ë ¹æ¹ýÀº : https://github.com/SheetJS/js-xlsx  

                 

                      ( Àß ¸ð¸£°Ú´õ¶óµµ ´ë·«¸¸ ÈȾ¸é Å« µµ¿òÀÌ µÈ´Ù. ´ÙÀ½ éÅÍ¿¡ »ùÇà Äڵ带 ¸¸µé¾îº¸¾Ò´Ù )


API ¹®¼­´Â : https://sheetjs.gitbooks.io/docs/#installation


À» Âü°íÇÏ¸é µÈ´Ù.


¸¶Áö¸·À¸·Î Áö¿øÇÏ´Â ºê¶ó¿ìÀú´Â






   SAMPLE CODE


°ø½ÄȨ¿¡¼­ ¼Ò°³ÇÑ ÄÚµå¿Í utils ¸Þ¼­µå¸¦ ÂüÁ¶ÇÑ µ¥ÀÌÅÍ ¾ò±â¸¦ Á¶ÇÕÀ» »ç¿ëÇؼ­ »ùÇà Äڵ带 ¸¸µé¾úÀ¸¸ç, 


È£ÃâÇÒ ÆÄÀÏÀÎ ¿¢¼¿ÆÄÀϵµ ÁغñÇغ¸¾Ò´Ù.



( 2020. 03. 26 »ùÇà ÄÚµå ¼öÁ¤ )



 sample.zip


ÆÄÀÏ ¾÷·Îµå => ¿¢¼¿ Çؼ® => °á°ú




HTML


<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <form id='form'>
    <input type="file" id="upload_here" accept=".xls, .xlsx, .csv" />
    <div id='my_file_output'></div>
  </form>

  <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
  <script src="xlsx-0.14.3.full.min.js"></script>
  <script src='ExcelParse.js'></script>

  <script>
    var exp = new ExcelParse();

    input_dom_element = document.getElementById('upload_here');
    if(input_dom_element.addEventListener) {
        input_dom_element.addEventListener('change'exp.handleFilefalse);
    }

  </script>
</body>
</html>


JS


/* --------------------------------------------------------
*
* ExcelParse
*
-----------------------------------------------------------*/
var ExcelParse = function($Control$obj){
 
  //private
  var name = "ExcelParse";
  var author = "ÇãÁ¤Áø";
  var ver = "2017.06.01";
  
  this.handleFile = this.handleFile.bind(this);
  
  //extend
  this.defaultObj = {
      validFileExtensions : [".xlsx"".xls""csv"],
      rABS : true// T : ¹ÙÀ̳ʸ®, F : ¾î·¹ÀÌ ¹öÆÛ
  };
 
 for(var key in $objif$obj.hasOwnProperty(key) ) this.defaultObj[key] = $obj[key];
 
}//end. ExcelParse

ExcelParse.prototype = (function(){
 
  return{
    constructor: ExcelParse,

    //
    inherit: functionParentChild ){
      Child = function(){
          Parent.callthis );
      }

      try{
        if (!Object.create) {
          Object.create = (function(){
            function F(){}
              return function(o){
              if (arguments.length != 1) {
                throw new Error('Object.create implementation only accepts one parameter.');
              }
              F.prototype = o;
              return new F();
            }
          })();
        }
        Child.prototype = Object.createParent.prototype );
          Child.prototype.constructor = Child;
          //override
          //Child.prototype.build = function(){ alert('hi, I am a Child'); };
          var child = new Child();
          if(child instanceof Parent === truereturn child;
          else return new Parent();
      }catch(e){
          throw new Error"[ inherit Error ] : "Parent.name +"°´Ã¼¸¦ »ó¼Ó¹ÞÁö ¸øÇß½À´Ï´Ù. "Parent.name +" °´Ã¼¸¦ 'È®ÀÎ'ÇØ ÁÖ¼¼¿ä." );
      }
    },
    
    // ¾î·¹ÀÌ ¹öÆÛ¸¦ Ã³¸®ÇÑ´Ù ( ¿ÀÁ÷ readAsArrayBuffer µ¥ÀÌÅ͸¸ °¡´ÉÇÏ´Ù )
    fixdata : function(){
        var o = ""l = 0w = 10240;
        for(; l<data.byteLength/w; ++lo+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
        o+=String.fromCharCode.apply(nullnew Uint8Array(data.slice(l*w)));
        return o;
    },

    // µ¥ÀÌÅ͸¦ ¹ÙÀ̳ʸ® ½ºÆ®¸µÀ¸·Î ¾ò´Â´Ù.
    getConvertDataToBin : function(){
        var arraybuffer = $data;
        var data = new Uint8Array(arraybuffer);
        var arr = new Array();
        for(var i = 0i != data.length; ++iarr[i] = String.fromCharCode(data[i]);
        var bstr = arr.join("");
        return bstr;
    },

    handleFile : function(e$callback){
      
      //¾÷·Îµå µÉ ÆÄÀÏ È®ÀåÀÚ °Ë»ç
      var form = $("form");
      var _this = this;
      
      if( !this.validateform ) ) return false;
  
      var files = e.target.files;
      var i,f;
      for (i = 0i != files.length; ++i) {
        f = files[i];
        var reader = new FileReader();
        var name = f.name;

        reader.onload = function(e) {
          var data = e.target.result;
          var workbook;

          if(_this.defaultObj.rABS) {
              /* if binary string, read with type 'binary' */
              workbook = XLSX.read(data, {type: 'binary'});
          } else {
              /* if array buffer, convert to base64 */
              var arr = fixdata(data);
              workbook = XLSX.read(btoa(arr), {type: 'base64'});
          }//end. if

            /* ¿öÅ©ºÏ Ã³¸® */
          var htmlTablecsvToFSRS;
          workbook.SheetNames.forEach(function(itemindexarray) {
            
            // CSV
            //var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[item]); // default : ","

            //console.log(csv);
            //var csvToFS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:"\t"} ); // "Field Separator" delimiter between fields
            //var csvToFSRS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); // "\n" "Record Separator" delimiter between rows

            // html
            //var html = XLSX.utils.sheet_to_html(workbook.Sheets[item]);
            //var htmlHF = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<html><title='custom'><body><table>", footer:"</table><body></html>"});
            //var htmlTable = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<table border='1'>", footer:"</table>"});

            // json
            var json = XLSX.utils.sheet_to_json(workbook.Sheets[item]);
            console.log(json);

            //formulae
            //var formulae = XLSX.utils.sheet_to_formulae(workbook.Sheets[item]);
            
            //htmlTable = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<table border='1'>", footer:"</table>"});
            //csvToFSRS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); // "\n" "Record Separator" delimiter between rows
            //getCsvToJson( csvToFSRS );
                
          });//end. forEach
        }; //end onload

        if(this.defaultObj.rABSreader.readAsBinaryString(f);
        else reader.readAsArrayBuffer(f);
      }//end. for
    },

    getCsvToJson : function$csv ){
      // TODO...
    },


    /******************************************************************************************************************
    *
    *    validate
    *
    ******************************************************************************************************************/
    validate: function(oForm){

      var _validFileExtensions = this.defaultObj.validFileExtensions || [".jpg"".jpeg"".bmp"".gif"".png"];
      var arrInputs = oForm.find("input");

      for (var i = 0i < arrInputs.lengthi++) {
        var oInput = arrInputs[i];
        if (oInput.type == "file") {
          var sFileName = oInput.value;
          if (sFileName.length > 0) {
            var blnValid = false;
            for (var j = 0j < _validFileExtensions.lengthj++) {
              var sCurExtension = _validFileExtensions[j];
              if (sFileName.substr(sFileName.length - sCurExtension.lengthsCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                blnValid = true;
                break;
              }
            }

            if (!blnValid) {
              alert("°æ°í, " + sFileName + " ´Â À¯È¿ÇÏÁö¾ÊÀº ÆÄÀÏÀÔ´Ï´Ù.\n\n¾÷·Îµå´Â ´ÙÀ½Çü½ÄÀ» Áö¿øÇÕ´Ï´Ù : " + _validFileExtensions.join(", "));
              return false;
            }
          }
        }
      }

      return true;
    },
  }
})();







=============================================



 sample.xls


( Ȥ½Ã³ª ¶óÀ̺귯¸®¸¦ ´Ù¿î¹Þ¾Æ »ç¿ëÇØ¾ß ÇÑ´Ù¸é ¾Æ·¡ÀÇ js¸¦ ´Ù¿î¹Þ¾Æ¼­ script src='' ¿¡ ÁöÁ¤.. )

 jquery-1.11.2.min.js

 xlsx.full.min.js


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="file" id="my_file_input" />
    <div id='my_file_output'></div>
 
 
 
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.10.3/xlsx.full.min.js"></script>
<!-- <script lang="javascript" src="dist/xlsx.full.min.js"></script> -->
<script>
 
var rABS = true// T : ¹ÙÀ̳ʸ®, F : ¾î·¹ÀÌ ¹öÆÛ
 
// ¾î·¹ÀÌ ¹öÆÛ¸¦ Ã³¸®ÇÑ´Ù ( ¿ÀÁ÷ readAsArrayBuffer µ¥ÀÌÅ͸¸ °¡´ÉÇÏ´Ù )
function fixdata(data) {
    var o = "", l = 0, w = 10240;
    for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
    o+=String.fromCharCode.apply(nullnew Uint8Array(data.slice(l*w)));
    return o;
}
 
// µ¥ÀÌÅ͸¦ ¹ÙÀ̳ʸ® ½ºÆ®¸µÀ¸·Î ¾ò´Â´Ù.
function getConvertDataToBin($data){
    var arraybuffer = $data;
    var data = new Uint8Array(arraybuffer);
    var arr = new Array();
    for(var i = 0; i != data.length++i) arr[i] = String.fromCharCode(data[i]);
    var bstr = arr.join("");
 
    return bstr;
}
function handleFile(e) {
    var files = e.target.files;
    var i,f;
    for (i = 0; i != files.length++i) {
        f = files[i];
        var reader = new FileReader();
        var name = f.name;
 
        reader.onload = function(e) {
            var data = e.target.result;
 
            var workbook;
 
            if(rABS) {
                /* if binary string, read with type 'binary' */
                workbook = XLSX.read(data, {type: 'binary'});
            } else {
                /* if array buffer, convert to base64 */
                var arr = fixdata(data);
                workbook = XLSX.read(btoa(arr), {type: 'base64'});
            }//end. if
 
            /* ¿öÅ©ºÏ Ã³¸® */
            workbook.SheetNames.forEach(function(item, index, array) {
 
                var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[item]);
                var html = XLSX.utils.sheet_to_html(workbook.Sheets[item]);
                var json = XLSX.utils.sheet_to_json(workbook.Sheets[item]);
                var formulae = XLSX.utils.sheet_to_formulae(workbook.Sheets[item]);
 
                console.log(csv);
                console.log(html);
                console.log(json);
                console.log(formulae);
 
                $("#my_file_output").html(csv);
            });//end. forEach
        }; //end onload
 
        if(rABS) reader.readAsBinaryString(f);
        else reader.readAsArrayBuffer(f);
 
    }//end. for
}
 
var input_dom_element;
$(function() {
    input_dom_element = document.getElementById('my_file_input');
    if(input_dom_element.addEventListener) {
        input_dom_element.addEventListener('change', handleFile, false);
    }
});
 
//http://sheetjs.com/
//https://github.com/SheetJS/js-xls
</script>
 
 
</body>
</html>
 
cs



   °á°ú






   ³»¿ëÃß°¡ ( 2017.06.01 ) : sheet ³»¿ë ¾ò´Â 4°¡Áö ¹æ¹ý



À§ÀÇ SAMPLE_CODE Ç׸ñÀÇ workbook.SheetNames.forEach ºÎºÐ¿¡¼­ XLSX °´Ã¼¸¦ ¼øȸÇϸç 


sheets Á¤º¸¸¦ °¡Á®¿À´Â ºÎºÐÀΠ43¹ø ¶óÀο¡¼­ Àû¿ëÇß¾ú´ø ºÎºÐ Áß,


Export µ¥ÀÌÅÍŸÀÔÀ» ÀüºÎ ¾Ë¾Æº¸°í, ÀÌ Áß ÁÖ¿äÇÑ ¿É¼ÇÀ» Àû¿ëÇØ º¸¾Ò´Ù.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// CSV
var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[item]); // default : ","
var csvToFS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:"\t"} ); // "Field Separator" delimiter between fields
var csvToFSRS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); // "\n" "Record Separator" delimiter between rows
 
// html
var html = XLSX.utils.sheet_to_html(workbook.Sheets[item]);
var htmlHF = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<html><title='custom'><body><table>", footer:"</table><body></html>"});
var htmlTable = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<table border='1'>", footer:"</table>"});
 
// json
var json = XLSX.utils.sheet_to_json(workbook.Sheets[item]);
 
//formulae
var formulae = XLSX.utils.sheet_to_formulae(workbook.Sheets[item]);
formulae.filter(function(v,i){return i%13 === 0;});
 
console.group("CSV");
    console.log(csv);
    console.log(csvToFS);
    console.log(csvToFSRS);
console.groupEnd();
 
console.group("html");
    console.log(html);
    console.log(htmlHF);
    console.log(htmlTable);
console.groupEnd();
 
console.group("json");
    console.log(json);
console.groupEnd();
 
console.group("formulae");
    console.log(formulae);
console.groupEnd();
cs


CSV


2¹ø ¶óÀÎ : csv·Î °¡Á®¿À±â¿¡¼­ ±âº»°ªÀº , (ÄÞ¸¶) ÀÌ´Ù.

    

              ex) A, B, C, 

                  A1_vaule, B1_value, C1_value ....


3¹ø ¶óÀÎ : csv·Î °¡Á®¿À±â¿¡¼­ FS ¿É¼ÇÀº Field Separator·Î½á ÇÊµå »çÀÌÀÇ ±¸ºÐ ±âÈ£¸¦ ÁöÁ¤ÇØ ÁÙ¼öÀÖ´Ù. 


             ¿©±â¼­ \t ÀÇ °æ¿ì ¼öÆòÅÇÀÌ´Ù. ( log ·Î Ç¥ÇöµÇ´Â ÅÇ °ø¹éÀº ½ºÆäÀ̽º¹Ù Å°·Î 3Ä­ Á¤µµµÈ´Ù )

    

            ex)  A    B    C

                  A1_vaule    B1_vaule    C1_vaule.....



4¹ø ¶óÀΠ: csv·Î °¡Á®¿À±â¿¡¼­ RS ¿É¼ÇÀº Record Separator ·Î½á Çà°£ÀÇ ±¸ºÐ ±âÈ£¸¦ ÁöÁ¤ÇØ ÁÙ¼öÀÖ´Ù.


             FS ·Î : ¿É¼ÇÀ», RS ·Î | ¿É¼ÇÀ» »ç¿ëÇÏ¿´±â ¶§¹®¿¡ ¾Æ·¡¿Í °°ÀÌ Ç¥ÇöµÈ´Ù.


            ex) A1:B1:C1|A1_value:B1_value:C1_value|A2_value:B2_value:C2_value|....


½Ç¹«¿¡¼­´Â 4¹ø ¶óÀÎó·³ Çʵ忡 : (COLON) À¸·Î °ªÀ» ºÐÇÒÇÏ°í, ·¹ÄÚµåÀÇ Çà(ROW)¿¡´Â  | (PIPE) ·Î ¸íÈ®ÇÏ°Ô


±¸ºÐÁö¾îÁÖ¸é : ¿Í | ¸¦ TockenÀ¸·Î »ç¿ëÇÏ¿© º¸´Ù ¸íÈ®ÇÏ°í ½±°Ô »ç¿ëÇÒ ¼ö ÀÖÀ»°ÍÀÌ´Ù. 



HTML


7¹ø ¶óÀÎ : html·Î °¡Á®¿À±â¿¡¼­ ¿É¼ÇÀÌ ¾ø´Â °æ¿ì 


             <html><head><title> ~~ <table> ½ÇÁ¦ ÆĽ̺»ºÐ ~~ </html> ±îÁö ¿ÏÀüÇÑ html ¹®¼­¸¦ ¹ÝȯÇÑ´Ù.


             ¹°·Ð typeof ¸¦ Âï¾îº¸¸é String ÀÌÁö¸¸ º¸Åë ¹Ù·Î »ç¿ëÇÒ¼ö ¾ø´Â ÇüÅÂÀ̱⠶§¹®¿¡ 


8¹ø ¶óÀÎ : ¿É¼ÇÀ¸·Î header, footer ¸¦ ÁÖ¸é °¢°¢ ¿É¼ÇÀ» Á÷Á¢ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.


9¹ø ¶óÀÎ : ½Ç¹«¿¡¼­ ¹Ù·Î »ç¿ëÇϱ⿡ Á¦ÀÏ ÀûÇÕÇÑ ¿É¼ÇÀÌ´Ù. header:"<table>", footer:"</table>" ¸¦ ÁÖ¸é

    

              ºñ·Î¼Ò ¿ÏÀüÇÑ Å×À̺í·Î ¿¤¸®¸ÕÆ®¸¦ ¾òÀ» ¼ö ÀÖ°ÔµÇ¸ç ¿©±â¿¡ ¾à°£ÀÇ css¸¸ Ãß°¡ÇÑ´Ù¸é

 

              ±ò²ûÇÑ Å×ÀÌºí °á°ú¹°ÀÌ Ãâ·ÂµÉ °ÍÀÌ´Ù.


Export ÀÇ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº https://github.com/SheetJS/js-xlsx#formulae-output ºÎÅÍ Âü°íÇÏ¸é µÈ´Ù.




   °á°ú


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <input type="file" id="my_file_input" />
    <div id='my_file_output'></div>
 
 
 
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.10.3/xlsx.full.min.js"></script>
<!-- <script lang="javascript" src="dist/xlsx.full.min.js"></script> -->
<script>
 
var rABS = true// T : ¹ÙÀ̳ʸ®, F : ¾î·¹ÀÌ ¹öÆÛ
 
// ¾î·¹ÀÌ ¹öÆÛ¸¦ Ã³¸®ÇÑ´Ù ( ¿ÀÁ÷ readAsArrayBuffer µ¥ÀÌÅ͸¸ °¡´ÉÇÏ´Ù )
function fixdata(data) {
    var o = "", l = 0, w = 10240;
    for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
    o+=String.fromCharCode.apply(nullnew Uint8Array(data.slice(l*w)));
    return o;
}
 
// µ¥ÀÌÅ͸¦ ¹ÙÀ̳ʸ® ½ºÆ®¸µÀ¸·Î ¾ò´Â´Ù.
function getConvertDataToBin($data){
    var arraybuffer = $data;
    var data = new Uint8Array(arraybuffer);
    var arr = new Array();
    for(var i = 0; i != data.length++i) arr[i] = String.fromCharCode(data[i]);
    var bstr = arr.join("");
 
    return bstr;
}
function handleFile(e) {
    var files = e.target.files;
    var i,f;
    for (i = 0; i != files.length++i) {
        f = files[i];
        var reader = new FileReader();
        var name = f.name;
 
        reader.onload = function(e) {
            var data = e.target.result;
 
            var workbook;
 
            if(rABS) {
                /* if binary string, read with type 'binary' */
                workbook = XLSX.read(data, {type: 'binary'});
            } else {
                /* if array buffer, convert to base64 */
                var arr = fixdata(data);
                workbook = XLSX.read(btoa(arr), {type: 'base64'});
            }//end. if
 
            /* ¿öÅ©ºÏ Ã³¸® */
            workbook.SheetNames.forEach(function(item, index, array) {
 
                // CSV
                var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[item]); // default : ","
                var csvToFS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:"\t"} ); // "Field Separator" delimiter between fields
                var csvToFSRS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); // "\n" "Record Separator" delimiter between rows
 
                // html
                var html = XLSX.utils.sheet_to_html(workbook.Sheets[item]);
                var htmlHF = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<html><title='custom'><body><table>", footer:"</table><body></html>"});
                var htmlTable = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<table border='1'>", footer:"</table>"});
 
                // json
                var json = XLSX.utils.sheet_to_json(workbook.Sheets[item]);
 
                //formulae
                var formulae = XLSX.utils.sheet_to_formulae(workbook.Sheets[item]);
                formulae.filter(function(v,i){return i%13 === 0;});
 
                console.group("CSV");
                    console.log(csv);
                    console.log(csvToFS);
                    console.log(csvToFSRS);
                console.groupEnd();
 
                console.group("html");
                    console.log(html);
                    console.log(htmlHF);
                    console.log(htmlTable);
                console.groupEnd();
 
                console.group("json");
                    console.log(json);
                console.groupEnd();
 
                console.group("formulae");
                    console.log(formulae);
                console.groupEnd();
 
                $("#my_file_output").html(htmlTable);
            });//end. forEach
        }; //end onload
 
        if(rABS) reader.readAsBinaryString(f);
        else reader.readAsArrayBuffer(f);
 
    }//end. for
}
 
var input_dom_element;
$(function() {
    input_dom_element = document.getElementById('my_file_input');
    if(input_dom_element.addEventListener) {
        input_dom_element.addEventListener('change', handleFile, false);
    }
});
 
//http://sheetjs.com/
//https://github.com/SheetJS/js-xls
</script>
 
 
</body>
</html>
 
cs



Ãâó: https://serpiko.tistory.com/636 [»ðSAP(Study And Programming) Áú ºí·Î±×. byÇãÁ¤Áø]




html )


Å©·Ò °³¹ßÀÚ µµ±¸ Developer Tools )






   ³»¿ëÃß°¡ ( 2017.06.08 ) : ½Ç¹«¿¡¼­ »ç¿ëÇÏ´Â ÄÚµå



¸ÕÀú À§ÀÇ XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); ºÎºÐÀ» Á¶±Ý ´õ 


»ç¿ëÇϱ⠽¬¿î json À¸·Î º¯°æÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù.


À§¿¡¼­ »ç¿ëÇß´ø XLSX.utils.sheet_to_json(workbook.Sheets[item]); ±¸¹®Àº ÀÌÄ÷(=)°ú ¾ËÆĺªµµ Á¦°øÇϱä Çϴµ¥ ¸íÈ®ÇÏ°Ô ³»°¡ ÁöÁ¤ÇÑ ÅäÅ«À¸·Î ºÐ¸®Çϴ°ÍÀÌ 


³ªÀ»°Í °°¾Æ¼­ ÇÔ¼ö¸¦ Ãß°¡ÇÏ¿© »ç¿ë.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// XLSX.utils.sheet_to_json °¡ ¿ØÁö ¾²±â ´õ ºÒÆíÇÏ´Ù. ±×³É csv¿¡ FS, RS ÅäÅ«À» ³Ö°í ºÐ¸®Çس»´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù.
getCsvToJson : function( $csv ){
 
    //var row = $obj.filter(function(v,i){return i%5 === 0;});
    var startRow = this.defaultObj.startRow || 4;
    var csvSP = $csv.split"|" );
    var csvRow = [], csvCell = [];
    //var cellName = ["No", "W_FROM", "TAGNAME", "VAL_V ¾ÆÁ÷¾Ë¼ö¾øÀ½", "L_TYPE", "L_S_SIZE", "L_S_CNT", "L_CALC", "VL_V", "VL_PCNT", "MC_PCNT", "MC_AF", "MC_AT"];
    var cellName = ["W_FROM""TAGNAME""L_TYPE""L_S_SIZE""L_S_CNT""L_CALC""VL_V""VL_PCNT""MC_PCNT""MC_AF""MC_AT"];
    csvSP.forEach(function(item, index, array){
 
        var patt = new RegExp(":"); // Ãà¾àÇüpatt = /:/ ´ë½Å...
        var isExistTocken = patt.test( item );
 
        if( isExistTocken && ( startRow - 1 ) <= index ){
            csvRow.push( item );
        }
    });
 
    csvRow.forEach(function(item, index, array){
        var row = item.split(":");
        var obj = {};
        row.forEach(function(item, index, array){
            obj[ cellName[index] ] = item;
        });
 
        csvCell[index] = obj;
    });
 
    return csvCell;
 
    //console.log( csvCell );
},
cs




½Ç¹«¿¡¼­ »ç¿ëÇÑ ÀϺΠÄÚµå. 


´ÙÀ½°ú °°ÀÌ Excel Ŭ·¡½º¿Í È£Ãâ Ŭ·¡½º ºÐ¸®ÇÏ°í µ¥ÀÌÅÍ´Â ÄݹéÀ¸·Î ¾ò¾î¼­ »ç¿ëÇÏ¸é µÉµíÇÏ´Ù.



ExcelParse.js : Excel ÆĽ̶óÀ̺귯¸®¸¦ »ç¿ëÇϱâÀ§ÇÑ Ã³¸®¿Í µ¥ÀÌÅÍ °¡°ø´ã´ç


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
/* --------------------------------------------------------
*
* ExcelParse
*
-----------------------------------------------------------*/
var ExcelParse = function($Control, $obj){
 
    //private
    var name = "ExcelParse";
    var author = "ÇãÁ¤Áø";
    var ver = "2017.06.01";
 
    //public
    this.name = name;
    this.control = $Control;
    this.elementDefined = this.inherit( ElementDefined, this.elementDefined ); //¿¤¸®¸ÕÆ®¸¸ »ç¿ëÇϱâÀ§Çؼ­ °´Ã¼ »ó¼Ó
    this.model = $Control.model;
 
    //extend
    this.defaultObj = {
        validFileExtensions : [".xlsx"".xls"],
        rABS : true// T : ¹ÙÀ̳ʸ®, F : ¾î·¹ÀÌ ¹öÆÛ
        startRow : 4
    };
    for(var key in $obj) if( $obj.hasOwnProperty(key) ) this.defaultObj[key] = $obj[key];
 
    //build
    this.build();
}//end. ExcelParse
 
ExcelParse.prototype = (function(){
 
    return{
 
        constructor: ExcelParse,
 
        //
        build: function(){
//            if( typeof this.control == "undefined" || this.control.name != "Control"  ){
//                throw new Error( "["+this.name+"] : Control °´Ã¼¸¦ »ó¼Ó¹ÞÁö ¸øÇß½À´Ï´Ù. Control °´Ã¼¸¦ ¸ÕÀú '»ý¼º'ÇØ ÁÖ¼¼¿ä." );
//                return false;
//            }
 
            var $this = this;
 
        },
 
        inherit: function( Parent, Child ){
            Child = function(){
                Parent.call( this );
            }
 
            try{
                if (!Object.create) {
                    Object.create = (function(){
                        function F(){}
                            return function(o){
                            if (arguments.length != 1) {
                                throw new Error('Object.create implementation only accepts one parameter.');
                            }
                            F.prototype = o;
                            return new F();
                        }
                    })();
                }
 
                Child.prototype = Object.create( Parent.prototype );
 
                Child.prototype.constructor = Child;
 
                //override
                //Child.prototype.build = function(){ alert('hi, I am a Child'); };
 
                var child = new Child();
                if(child instanceof Parent === true)
                    return child;
                else
                    return new Parent();
 
            }catch(e){
                throw new Error( "[ inherit Error ] : "+ Parent.name +"°´Ã¼¸¦ »ó¼Ó¹ÞÁö ¸øÇß½À´Ï´Ù. "+ Parent.name +" °´Ã¼¸¦ 'È®ÀÎ'ÇØ ÁÖ¼¼¿ä." );
            }
        },
 
        init:function(){
 
        },
 
        destroy: function(){
            //$(document).off("click", "");
 
            //ÁÖÀÇ!!. dispose´Â ¸Ç ¸¶Áö¸·À¸·Î ½ÇÇàÇÑ´Ù. ¼Ò°Å.
            this.dispose();
        },
 
        dispose: function(){
 
            var object = this;
            var objectPrototype = object.__proto__;
 
            forvar key in object ){
                if( object.hasOwnProperty(key) ){
                    delete object[key];
                }
            }
            delete this.prototype;
 
            return;
 
            forvar key in objectPrototype ){
                if( objectPrototype.hasOwnProperty(key) ){
                    delete objectPrototype[key];
                }
            }
        }, //end. dispose
 
        addEventListenerfunction(){
            $this = this;
        },
 
        // ¾î·¹ÀÌ ¹öÆÛ¸¦ Ã³¸®ÇÑ´Ù ( ¿ÀÁ÷ readAsArrayBuffer µ¥ÀÌÅ͸¸ °¡´ÉÇÏ´Ù )
        fixdata : function(){
            var o = "", l = 0, w = 10240;
            for(; l<data.byteLength/w; ++l) o+=String.fromCharCode.apply(null,new Uint8Array(data.slice(l*w,l*w+w)));
            o+=String.fromCharCode.apply(nullnew Uint8Array(data.slice(l*w)));
            return o;
        },
 
        // µ¥ÀÌÅ͸¦ ¹ÙÀ̳ʸ® ½ºÆ®¸µÀ¸·Î ¾ò´Â´Ù.
        getConvertDataToBin : function(){
            var arraybuffer = $data;
            var data = new Uint8Array(arraybuffer);
            var arr = new Array();
            for(var i = 0; i != data.length++i) arr[i] = String.fromCharCode(data[i]);
            var bstr = arr.join("");
 
            return bstr;
        },
 
        handleFile : function(e, $callback){
 
            var $this = this;
 
            //¾÷·Îµå µÉ ÆÄÀÏ Á¸ÀçÀ¯¹« °Ë»ç
            var excel_file_input = $this.control.elementDefined.excel_file_input;
            if0 == excel_file_input[0].files.length ){
                alert("ÆÄÀÏÀ» ¾÷·ÎµåÇØÁÖ¼¼¿ä");
                excel_file_input.focus();
                return false;
            }
 
            //¾÷·Îµå µÉ ÆÄÀÏ È®ÀåÀÚ °Ë»ç
            var SearchForm = $this.control.elementDefined.SearchForm;
            if!$this.validate( SearchForm ) ) return false;
 
 
            //ÀÌÇÏ ·ÎÁ÷½ÇÇà
            var files = excel_file_input[0].files;
            //var files = e.target.files;
            var i,f;
            for (i = 0; i != files.length++i) {
                f = files[i];
                var reader = new FileReader();
                var name = f.name;
 
                reader.onload = function(e) {
                    var data = e.target.result;
 
                    var workbook, htmlTable = null, csvToFSRS = null;
 
                    if( $this.defaultObj.rABS ) {
                        /* if binary string, read with type 'binary' */
                        workbook = XLSX.read(data, {type: 'binary'});
                    } else {
                        /* if array buffer, convert to base64 */
                        var arr = fixdata(data);
                        workbook = XLSX.read(btoa(arr), {type: 'base64'});
                    }//end. if
 
                    /* ¿öÅ©ºÏ Ã³¸® */
                    workbook.SheetNames.forEach(function(item, index, array) {
 
                        /*
                        // CSV
                        var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[item]); // default : ","
                        var csvToFS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:"\t"} ); // "Field Separator" delimiter between fields
                        var csvToFSRS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); // "\n" "Record Separator" delimiter between rows
                        // html
                        var html = XLSX.utils.sheet_to_html(workbook.Sheets[item]);
                        var htmlHF = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<html><title='custom'><body><table>", footer:"</table><body></html>"});
                        var htmlTable = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<table border='1'>", footer:"</table>"});
                        // json
                        var json = XLSX.utils.sheet_to_json(workbook.Sheets[item]);
                        //formulae
                        var formulae = XLSX.utils.sheet_to_formulae(workbook.Sheets[item]);
                        */
 
                        htmlTable = XLSX.utils.sheet_to_html(workbook.Sheets[item], {header:"<table class='table table-striped table-hover table-borderd table-excel-parse'>", footer:"</table>"});
                        csvToFSRS = XLSX.utils.sheet_to_csv(workbook.Sheets[item], {FS:":",RS:"|"} ); // "\n" "Record Separator" delimiter between rows
 
                    });//end. forEach
 
                    var obj = {};
                    obj.json = $this.getCsvToJson( csvToFSRS );
                    obj.table = htmlTable;
                    $callback( obj ); // ºñµ¿±âÇÔ¼ö
 
                }; //end onload
 
                if($this.defaultObj.rABS) reader.readAsBinaryString(f);
                else reader.readAsArrayBuffer(f);
 
                return true;
 
            }//end. for
        },
 
        // XLSX.utils.sheet_to_json °¡ ¿ØÁö ¾²±â ´õ ºÒÆíÇÏ´Ù. ±×³É csv¿¡ FS, RS ÅäÅ«À» ³Ö°í ºÐ¸®Çس»´Â ÇÔ¼ö¸¦ ¸¸µé¾ú´Ù.
        getCsvToJson : function( $csv ){
 
            //var row = $obj.filter(function(v,i){return i%5 === 0;});
            var startRow = this.defaultObj.startRow || 4;
            var csvSP = $csv.split"|" );
            var csvRow = [], csvCell = [];
            //var cellName = ["No", "W_FROM", "TAGNAME", "VAL_V ¾ÆÁ÷¾Ë¼ö¾øÀ½", "L_TYPE", "L_S_SIZE", "L_S_CNT", "L_CALC", "VL_V", "VL_PCNT", "MC_PCNT", "MC_AF", "MC_AT"];
            var cellName = ["W_FROM""TAGNAME""L_TYPE""L_S_SIZE""L_S_CNT""L_CALC""VL_V""VL_PCNT""MC_PCNT""MC_AF""MC_AT"];
            csvSP.forEach(function(item, index, array){
 
                var patt = new RegExp(":"); // Ãà¾àÇüpatt = /:/ ´ë½Å...
                var isExistTocken = patt.test( item );
 
                if( isExistTocken && ( startRow - 1 ) <= index ){
                    csvRow.push( item );
                }
            });
 
            csvRow.forEach(function(item, index, array){
                var row = item.split(":");
                var obj = {};
                row.forEach(function(item, index, array){
                    obj[ cellName[index] ] = item;
                });
 
                csvCell[index] = obj;
            });
 
            return csvCell;
 
            //console.log( csvCell );
        },
 
        /******************************************************************************************************************
        *
        *    validate
        *
        ******************************************************************************************************************/
        validate: function(oForm){
 
            var _validFileExtensions = this.defaultObj.validFileExtensions || [".jpg"".jpeg"".bmp"".gif"".png"];
            var arrInputs = oForm.find("input");
 
            for (var i = 0; i < arrInputs.length; i++) {
                var oInput = arrInputs[i];
                if (oInput.type == "file") {
                    var sFileName = oInput.value;
                    if (sFileName.length > 0) {
                        var blnValid = false;
                        for (var j = 0; j < _validFileExtensions.length; j++) {
                            var sCurExtension = _validFileExtensions[j];
                            if (sFileName.substr(sFileName.length - sCurExtension.length, sCurExtension.length).toLowerCase() == sCurExtension.toLowerCase()) {
                                blnValid = true;
                                break;
                            }
                        }
 
                        if (!blnValid) {
                            alert("°æ°í, " + sFileName + " ´Â À¯È¿ÇÏÁö¾ÊÀº ÆÄÀÏÀÔ´Ï´Ù.\n\n¾÷·Îµå´Â ´ÙÀ½Çü½ÄÀ» Áö¿øÇÕ´Ï´Ù : " + _validFileExtensions.join(", "));
                            return false;
                        }
                    }
                }
            }
 
            return true;
        },
 
    };
})();
 
cs



BuildList.js : ExcelParse ¸¦ Cotrol °´Ã¼¸¦ ÅëÇÏ »ç¿ë


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
/* --------------------------------------------------------
*
* BuildList
*
-----------------------------------------------------------*/
var BuildList = function($Control, $obj){
 
    //private
    var name = "BuildList";
    var author = "ÇãÁ¤Áø";
    var ver = "2017.06.07";
 
    //public
    this.name = name;
    this.control = $Control;
    this.elementDefined = this.inherit( ElementDefined, this.elementDefined ); //¿¤¸®¸ÕÆ®¸¸ »ç¿ëÇϱâÀ§Çؼ­ °´Ã¼ »ó¼Ó
    this.model = $Control.model;
    this.excelJson = {};
    this.OBJID = null;
 
    //extend
    this.defaultObj = {
        autoGrid : null// ÁÖÀÇ. menu_2_2.js ¿¡¼­ autogrid ´Â ÇϳªÀÇ °´Ã¼¸¸ »ý¼ºÈÄ¿¡ ÂüÁ¶ÇÏ¿© °øÀ¯ÇÑ´Ù.
        sampleExcelFilePath : this.model.sampleExcelFilePath || $Config['Template']+"/download/fems_sample.xlsx",
        sampleExcelImgPath : this.model.sampleExcelImgPath || $Config['Template']+"/images/1_SYMBOL.png",
        sampleExcelICONID : this.model.sampleExcelICONID || "ICONID_1",
        sampleExcelImgW : this.model.sampleExcelImgW || 51,
        sampleExcelImgH : this.model.sampleExcelImgH || 51
    };
    for(var key in $obj) if( $obj.hasOwnProperty(key) ) this.defaultObj[key] = $obj[key];
 
    //build
    this.build();
}//end. BuildList
 
BuildList.prototype = (function(){
 
    return{
 
        constructor: BuildList,
 
        //
        build: function(){
//            if( typeof this.control == "undefined" || this.control.name != "Control"  ){
//                throw new Error( "["+this.name+"] : Control °´Ã¼¸¦ »ó¼Ó¹ÞÁö ¸øÇß½À´Ï´Ù. Control °´Ã¼¸¦ ¸ÕÀú '»ý¼º'ÇØ ÁÖ¼¼¿ä." );
//                return false;
//            }
 
            var $this = this;
 
            $this.elementDefined.display_build_list.show();
 
            $this.sendRequestSearch();
            $this.responseHeight();
            $this.addEventListener();
        },
 
        inherit: function( Parent, Child ){
            Child = function(){
                Parent.call( this );
            }
 
            try{
                if (!Object.create) {
                    Object.create = (function(){
                        function F(){}
                            return function(o){
                            if (arguments.length != 1) {
                                throw new Error('Object.create implementation only accepts one parameter.');
                            }
                            F.prototype = o;
                            return new F();
                        }
                    })();
                }
 
                Child.prototype = Object.create( Parent.prototype );
 
                Child.prototype.constructor = Child;
 
                //override
                //Child.prototype.build = function(){ alert('hi, I am a Child'); };
 
                var child = new Child();
                if(child instanceof Parent === true)
                    return child;
                else
                    return new Parent();
 
            }catch(e){
                throw new Error( "[ inherit Error ] : "+ Parent.name +"°´Ã¼¸¦ »ó¼Ó¹ÞÁö ¸øÇß½À´Ï´Ù. "+ Parent.name +" °´Ã¼¸¦ 'È®ÀÎ'ÇØ ÁÖ¼¼¿ä." );
            }
        },
 
        init:function(){
            var $this = this;
 
            if( $this.defaultObj.autoGrid != null ) $this.defaultObj.autoGrid.init(); //¿ÀÅä±×¸®µåÀÇ x,y¸¦ ´Ù½Ã 0,0À¸·Î µÇµ¹¸³´Ï´Ù
        },
 
        destroy: function(){
            //$(document).off("click", "");
 
            //ÁÖÀÇ!!. dispose´Â ¸Ç ¸¶Áö¸·À¸·Î ½ÇÇàÇÑ´Ù. ¼Ò°Å.
            this.dispose();
        },
 
        dispose: function(){
 
            var object = this;
            var objectPrototype = object.__proto__;
 
            forvar key in object ){
                if( object.hasOwnProperty(key) ){
                    delete object[key];
                }
            }
            delete this.prototype;
 
            return;
 
            forvar key in objectPrototype ){
                if( objectPrototype.hasOwnProperty(key) ){
                    delete objectPrototype[key];
                }
            }
        }, //end. dispose
 
        addEventListenerfunction(){
            var $this = this;
            var el = $this.elementDefined;
            var excelParse = $this.control.excelParse;
 
            // ¸®»çÀÌÁîµÇ¸é ¿¤¸®¸ÕÆ® Àç¹èÄ¡
            $(window).on('resize'function(){
                $this.responseHeight();
            });
 
            // Á¶È¸¹öÆ°
            $(document).on("click touchstart""#search_btn"function(e){
                $this.sendRequestSearch();
            });
 
            //ÀúÀå
            $(document).on("click touchstart""#export_btn"function(e){
                excelParse.handleFile(e, $this.excelParseCallback);
            });
 
            // »ùÇôٿî
            $(document).on("click touchstart""#excelDownload_btn"function(e){
                $(this).attr("href", $this.defaultObj.sampleExcelFilePath);
            });
 
            // ¸ð´Þ => ÀúÀå
            $(document).on("click touchstart""#excelParseSave_btn"function(e){
                $this.excelSaveHandler();
            });
        },
 
        excelParseCallback : function( $resObj ){
            // this = window
            var $this = this.control.buildList;
            var el = this.control.buildList.elementDefined;
 
            el.excelParseArea.html( $resObj.table );
            el.excelParseModal.modal('show');
 
            $this.excelJson = $resObj.json;
        },
 
        excelSaveHandler: function(){
            var $this = this;
            var ed = $this.elementDefined;
            var model = $this.model;
            var MAPID = $this.model.MAPID;
 
            /************************************************************************************************
            * ¸Ê¾ÆÀ̵ð Ã¼Å©
            ************************************************************************************************/
            if0 > MAPID || null === MAPID ){
                alert("¸ÊÀÌ »ý¼ºµÇÁö ¾Ê¾Ò½À´Ï´Ù!\n\n[ ¸ÞÀΠ> ¼öº¯¼³ºñ Singleline > ¸Ê Ãß°¡ ] ¸¦ ÅëÇÏ¿©\n\n¸ÊÀ» ¸ÕÀú »ý¼ºÇØ ÁÖ¼¼¿ä!");
            }
 
            /************************************************************************************************
            * ¼Ó¼º ÃʱâÈ­
            ************************************************************************************************/
            $this.init();
 
            /************************************************************************************************
            * ¿¢¼¿ json ÆĶó¸ÞÅÍ °¡°øÇϱâ
            ************************************************************************************************/
            var src = $this.defaultObj.sampleExcelImgPath,
                ICONID = $this.defaultObj.sampleExcelICONID,
                w = $this.defaultObj.sampleExcelImgW,
                h = $this.defaultObj.sampleExcelImgH;
 
            var point = {};
            var div = "";
 
            //params
            var json = {};
            json.Record = [];
            var sendToObj = {};
 
            //console.log( $this.excelJson);
 
            $this.excelJson.forEach(function(item, index, array){
 
                point = $this.defaultObj.autoGrid.getPoint(6020); //w, h
 
                var DESCR = item.TAGNAME;
 
                sendToObj = {};
                sendToObj.MAPID = MAPID;
                sendToObj.POBJID = 0;
                sendToObj.TYPE = 1// TYPE Á¾·ù : 0:unknown, 1:ICON, 2:TEXT, 3:HTML, 4:LINE
                sendToObj.DESCR = DESCR;
                sendToObj.TEXT = '';
                sendToObj.ICONID = ICONID.substr( ICONID.indexOf("_"+ 1 );
                sendToObj.ICONX = point.x;
                sendToObj.ICONY = point.y;
                sendToObj.ICONSCALE = 1;
                sendToObj.ICONWAY = 0;
                sendToObj.ICONW = w;
                sendToObj.ICONH = h;
                sendToObj.ICONW2 = w;
                sendToObj.ICONH2 = h;
                sendToObj.ICONDEPTH = ""// for by UNIQUE - API ¿¬»êÇÑ´Ù
 
                json.Record.push( sendToObj ); //json ¿ÀºêÁ§Æ®ÀÇ Record ¹è¿­¿¡ sendToObj °´Ã¼¸¦ ³Ö´Â´Ù
            });
 
            var xhrClass = new XhrClass();
            var param = "mapapi=1&func=InsertMapObject&rqJobData=";
            param += JSON.stringify(json); // value to JSON
 
            xhrClass.sendRequest(model.JsonURL, param, complete, 'json''get');
            function complete(xhr, res)
            {
                // ÀúÀå¿¡ ¼º°øÇϸé => $this.excelJson ¿¡ OBJID ³Ö¾îÁÖ°í => È­¸é¿¡ Ãâ·ÂÇÑ´Ù.
                if0 == res.ErrCode && 0 < res.Record.length ){
 
                    //console.log( res.Record );
                    res.Record.forEach(function(item, index, array){
                        $this.excelJson[index].OBJID = item.OBJID;
                        $this.excelJson[index].COMPANY_ID = model.COMPANYID;
                    });
 
                    // ¸Ê´Ù½Ã Àбâ
                    model.MAPID = MAPID;
                    model.init(); // szCurrentMode = view ¸ðµå µÈ´Ù
 
                    $this.control.clickHandler.init( ed.dataView_btn ); //view ¹öÆ°ÀÌ ¾×ƼºêµÈ´Ù (ÃʱâÈ­)
                    $this.control.dataObjectDisplay_FEMS.start();
 
 
                    //INFO_FLAT_LIST ¿¡ ÀúÀå
                    $this.insertINFO_FLAT_LIST();
 
                }else{
                    alert("¿¡·¯ ["+res.ErrMsg+"] ¿¡·¯ÄÚµå ["+res.ErrCode+"]");
                }
 
                //console.log( $this.excelJson );
            }
        },
 
        insertINFO_FLAT_LIST: function(){
 
            var $this = this;
            var model = $this.model;
 
            //params
            var json = {};
            json.Record = [];
            var sendToObj = {};
 
            $this.excelJson.forEach(function(item, index, array){
 
                sendToObj = {};
                for(var key in item) {
                    if( item.hasOwnProperty(key) ) sendToObj[key] = item[key];
                }
 
                json.Record.push( sendToObj ); //json ¿ÀºêÁ§Æ®ÀÇ Record ¹è¿­¿¡ sendToObj °´Ã¼¸¦ ³Ö´Â´Ù
            });
 
            var xhrClass = new XhrClass();
            var param = "Act=InsertINFO_FLAT_LIST&rqJobData=";
            param += JSON.stringify(json); // value to JSON
 
            xhrClass.sendRequest(model.jjheo_api, param, complete, 'json''get');
            function complete(xhr, res)
            {
                // ÀúÀå¿¡ ¼º°øÇϸé => Å×ÀÌºí ´Ù½Ã Á¶È¸¿äûÇÑ´Ù.
                if0 == res.ErrCode ){
                    $this.elementDefined.excel_file_input.val(''); // ÆÄÀÏÀÇ ³»¿ëÀ» ¾÷·Îµå ¿Ï·á ÇßÀ¸¹Ç·Î ÃʱâÈ­
                    $this.sendRequestSearch();
                }else{
                    console.warn( "[ "+$this.name+" ] ¿¡·¯ÄÚµå:" + res.ErrCode + " / ¿¡·¯¸Þ¼¼Áö:"+res.ErrMsg );
                }
            }
        },
 
        sendRequestSearch: function(){
 
            var target_form = document.getElementById('SearchForm');
 
            target_form.Export.value = '0';
            target_form.json.value = '1';
            target_form.id.value = $Config['Template']; // => api/FEMS.php ÆÄÀÏÀ» È£ÃâÇϱâ À§Çؼ­
            target_form.mode.value = TableID;  // menu_2_2.html ÀÇ php TableID (¿©±â¼­´Â FLAT_MAP )
 
            var url = this.model.JsonURL;
            var COMPANY_ID = this.model.COMPANYID;
            var _nGID = target_form.GID.value;
            var _nNODEID = target_form.NODEID.value;
            var SEARCH_FROM = "";
            var SEARCH_TO = "";
            var SEARCH_FROM = "";
 
            var SrchWord = target_form.SrchWord.value;
 
            var _json_refresh_url = url+'?json=1&id=FEMS&mode='+TableID+'&GID='+_nGID+'&COMPANY_ID='+COMPANY_ID+'&NODEID='+_nNODEID+'&search_from='+SEARCH_FROM+'&search_to='+SEARCH_TO+'&SrchWord='+SrchWord+'&Export=0';
 
            //console.log(_json_refresh_url);
            $('#'+TableID).load(_json_refresh_url);
 
            this.responseHeight();
        },
 
        responseHeight: function(){
            var ed = this.elementDefined;
            var display_build_list = ed.display_build_list;
 
            var screenW=$(window).width();
            var screenH=$(window).height();
 
            var gap = screenH - $("#display_build_list").offset().top - 83;
            //$(".bDiv").css('height', gap + 'px');
            //console.log(gap);
 
            //display_build_list.css('height', gap + 'px');
 
        }
 
    };
})();
 
cs



* °í¿ë·®ÀÇ ¿¢¼¿ÆÄÀÏ - 6.6MB °¡ ÇÊ¿äÇÏ´Ù¸é ¾Æ·¡ÀÇ ¿¢¼¿À» ´Ù¿î·Îµå


 nature08489-s3.xls


  1. excel-parser : https://www.npmjs.com/package/excel-parser [º»¹®À¸·Î]



Ãâó: https://serpiko.tistory.com/636 [»ðSAP(Study And Programming) Áú ºí·Î±×. byÇãÁ¤Áø]