2016-12-03 8 views
0

私は、任意の場所からExcelファイルを読み込み、次のHTMLページでExcelのデータをレンダリングする必要があります。 Excelのデータを同じページの複数のシートでレンダリングできましたが、最初のページでファイルを選択し、次のhtmlページでデータをレンダリングする必要があります。このよう : enter image description hereJSONをディレクティブから次のHTMLページに使用する方法

そして、次の画面では、Excelデータを表示する必要があります。 enter image description here

ここで私はExcelからシート名を提供する必要がシート名で、任意のシート名シートのデータを選択する上グリッドにロードする必要があります。 2つのdivを使用してページを縦に2列に分割しています。

この機能を1ページで実現できましたが、このコードを複数のページに分割する必要があります。 これは、行われる作業のplunkerです: http://plnkr.co/edit/xHEtxtzKrEiKDTrqlafC?p=preview

これは私のjsのコードです:

angular.module('app', ['ui.grid']) 

.controller('MainCtrl', ['$scope', function($scope) { 
    var vm = this; 

    vm.gridOptions = {}; 

    vm.reset = reset; 
    vm.selectedSheet = ''; 
    vm.sheetIndex = 0; 


    function reset() { 
    vm.gridOptions.data = []; 
    vm.gridOptions.columnDefs = []; 
    vm.selectedSheet = ''; 
    vm.sheetIndex = 0; 
    } 

    vm.readSheet = function() { 
    var workbook = XLSX.read(vm.data, { 
     type: 'binary' 
    }); 


    var headerNames = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[vm.sheetIndex]], { 
     header: 1 
    })[0]; 

    vm.sheetNames = workbook.SheetNames; 
    var data = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[vm.sheetIndex]]); 

    vm.gridOptions.columnDefs = []; 
    headerNames.forEach(function(h) { 
     vm.gridOptions.columnDefs.push({ 
     field: h 
     }); 
    }); 

    vm.gridOptions.data = data; 
    }; 

    vm.onLoadData = function(data) { 
    vm.data = vm.data || data; 
    vm.readSheet(); 
    }; 

    vm.sheetChange = function() { 
    vm.sheetIndex = vm.sheetNames.indexOf(vm.selectedSheet); 
    vm.readSheet(); 
    }; 

}]) 

.directive("fileread", [function() { 
    return { 
    scope: { 
     onLoadData: '&' 

    }, 
    link: function($scope, $elm, $attrs) { 
     $elm.on('change', function(changeEvent) { 
     var reader = new FileReader(); 

     reader.onload = function(evt) { 
      $scope.$apply(function() { 


      $scope.onLoadData({ 
       data: evt.target.result 
      }); 

      $elm.val(null); 
      }); 
     }; 

     reader.readAsBinaryString(changeEvent.target.files[0]); 
     }); 
    } 
    } 
}]); 

HTMLコード:

<!DOCTYPE html> 
<html ng-app="app"> 

    <head> 
    <link data-require="[email protected]*" data-semver="3.3.1" rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css" /> 
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.16/angular.js"></script> 
    <script src="https://cdn.rawgit.com/SheetJS/js-xlsx/v0.8.0/dist/xlsx.full.min.js"></script> 
    <script src="https://cdn.rawgit.com/SheetJS/js-xlsx/v0.8.0/dist/ods.js"></script> 
    <script src="http://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/release/3.0.0-rc.22/ui-grid.min.js"></script> 
    <link rel="stylesheet" href="http://cdn.rawgit.com/angular-ui/ui-grid.info/gh-pages/release/3.0.0-rc.22/ui-grid.min.css" /> 
    <link rel="stylesheet" href="main.css" type="text/css" /> 
    </head> 

    <body> 
    <div ng-controller="MainCtrl as vm"> 
     <button type="button" class="btn btn-success" ng-click="vm.reset()">Reset Grid</button> 
     <br /> 
     <br /> 
     <div id="grid1" ui-grid="vm.gridOptions" class="grid"> 
     <div class="grid-msg-overlay" ng-show="!vm.gridOptions.data.length"> 
      <div class="msg"> 
      <div class="center"> 
       <span class="muted">Select Spreadsheet File</span> 
       <br /> 
       <input type="file" accept=".xls,.xlsx,.ods" multiple="true" fileread="" on-load-data="vm.onLoadData(data)"/> 
      </div> 
      </div> 
     </div> 
     <div> 
     <select ng-model="vm.selectedSheet" ng-options="names as names for names in vm.sheetNames" 
     ng-change="vm.sheetChange()"></select> 
     {{vm.selectedSheet}} 
    </div> 
     </div> 
    </div> 

    <script src="app.js"></script> 
    </body> 

</html> 

私はそう、私はどこかにこのJSONを保管する必要があると思います後で別のページで使用できることを示します。 この機能を実現するためにサービスを使用する必要がありますか、他の方法を使用する必要があります。

答えて

0

こちらがお役に立てば幸いです。 他のコントローラで使用するためにJsonデータを任意のrootScope変数に格納することができます。

例:

次のコードがあります。ここ

vm.gridOptions.data = data; 

あなたはJSON配列として、後で使用するためにデータを設定して保存することができますで

vm.readSheet = function() { 
var workbook = XLSX.read(vm.data, { 
    type: 'binary' 
}); 


var headerNames = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[vm.sheetIndex]], { 
    header: 1 
})[0]; 

vm.sheetNames = workbook.SheetNames; 
var data = XLSX.utils.sheet_to_json(workbook.Sheets[workbook.SheetNames[vm.sheetIndex]]); 

vm.gridOptions.columnDefs = []; 
headerNames.forEach(function(h) { 
    vm.gridOptions.columnDefs.push({ 
    field: h 
    }); 
}); 

vm.gridOptions.data = data; 
}; 

$rootScope.gridOptionsData = data; 
関連する問題