123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- <template>
- <div class="ExportExcel">
- <el-row style="margin-bottom: 15px;padding-bottom: 15px;border-bottom: 2px solid #EEE8D5;">
- <el-col :span="12">
- <button class="btn" :class="templateId == 1?'green':''" @click="typeClick(1)">单机数据模板</button>
- <button class="btn" :class="templateId == 2?'green':''" @click="typeClick(2)">上网电量及功率、测风塔数据模板</button>
- </el-col>
- <el-col :span="12">
- <el-row justify="end">
- <button class="btn green" @click="allExport()">一键导出</button>
- </el-row>
- </el-col>
- </el-row>
- <table class="com-table">
- <thead>
- <tr>
- <th>
- 风电场
- </th>
- <th>
- <input class='t2' type='checkbox' @click="rqCheck"/>
- 日期间隔
- </th>
- <th>
- <input class='t2' type='checkbox' @click="sjCheck"/>
- 时间间隔
- </th>
- <th width="120px">
- 操作
- </th>
- </tr>
- </thead>
- <el-scrollbar>
- <tbody>
- <tr v-for="(row, index) of tableData" :key="index">
- <td>
- {{row.fdc}}
- </td>
- <td class="excelPickerTd">
- <el-date-picker v-model="value1[index]" type="daterange" @change='value1Change(index)' range-separator="至"
- start-placeholder="开始日期" end-placeholder="结束日期" class="mr15">
- </el-date-picker>
- </td>
- <td>
- <el-input placeholder="请输入时间间隔" type='number' v-model="inputVal[index]" @change='inputValChange(index)'></el-input>
- </td>
- <td width="120px">
- <el-button type='text' style='cursor: pointer;' @click="thisExport(index)">导出
- </el-button>
- </td>
- </tr>
- </tbody>
- </el-scrollbar>
- </table>
- </div>
- </template>
- <script>
- import JsZip from 'jszip';
- import {
- export_blob,
- export_more_blob
- } from "@tools/excel/Export2Excel.js";
- import BASE from "@tools/basicTool.js";
- export default {
- components: {
- JsZip
- },
- data() {
- const that = this;
- return {
- single:false,
- rqChecked:false,
- sjChecked:false,
- checkList: [],
- tableIdArr: [], //放checkbox的id数组
- tableData: [],
- value1: [],
- inputVal: [],
- inputInterval: 1800,
- options: [],
- value2: [],
- startTs: [],
- endTs: [],
- muBan: {
- type1: ['数据时间', 'scada风速(m/s)', 'scada功率(kW)', '是否故障(故障=1,不故障=0)', '是否限电(限电=1,不限电=0)'],
- type2: [
- ['数据时间', '日报上网电量(mWh)'],
- ['数据时间', '上网功率(kW)'],
- ['数据时间', '轮毂高度平均风速(m/s)', '轮毂高度平均风向(°)', '温度(℃)', '压强(hPa)', '湿度(%)']
- ],
- },
- templateId: 1,
- stations: [],
- paths: [],
- pathName: [],
- zipNames: [],
- tempArrayS: [],
- }
- },
- created() {
- this.tableVal();
- },
- methods: {
- value1Change(index){
- if(this.rqChecked){
- var date = this.value1[index];
- this.value1 = [];
- this.tableData.forEach((ele, index) => {
- this.value1.push(date);
- this.time(index, date);
- })
- }
- },
- inputValChange(index){
- if(this.sjChecked){
- var sj = this.inputVal[index];
- this.inputVal = [];
- this.tableData.forEach((ele, index) => {
- this.inputVal.push(sj);
- })
- }
- },
- rqCheck(){
- this.rqChecked=event.target.checked
- },
- sjCheck(){
- this.sjChecked=event.target.checked
- },
- typeClick(a){
- this.templateId = a;
- },
- thisExport(index) {
- let that = this;
- that.single = true;
- that.time(index, that.value1[index]);
- that.stations[index] = that.tableData[index].value;
- that.allExportF(0, index);
- },
- tableVal() {
- let that = this;
- that.API.requestData({
- method: "GET",
- subUrl: "export/databases",
- success(res) {
- if (res.code === 200) {
- const arr = [];
- const arr2 = [];
- const arr3 = [];
- const arr4 = [];
- var data = []; //项目列表
- res.data.forEach((item,index) => {
- const value = Object.keys(item)[0];
- arr.push({
- value: value,
- label: item[value]
- })
- arr2.push(value + '/' + item[value]);
- arr3.push(value);
- arr4.push(item[value]);
- data.push({
- fdc: item[value],
- value: value,
- });
- that.inputVal.push(1800);
- that.checkList.push(index);
- })
- that.options = arr;
- that.value2 = arr2;
- that.stations = arr3;
- that.zipNames = arr4;
- that.tableData = data;
- that.defaultValue1();
- }
- },
- });
- },
- defaultValue1() { //默认时间区间
- const end = new Date();
- const start = new Date();
- start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
- /////////////
- var nowDate = new Date();
- var year = nowDate.getFullYear();
- var month = nowDate.getMonth();
- var day = nowDate.getDate();
- this.tableData.forEach((ele, index) => {
- this.value1.push([start, end]);
- this.time(index, [start, end]);
- })
- },
- handleCommand(command) {
- this.templateId = command;
- },
- formatJson(filterVal, jsonData) {
- return jsonData.map(v => filterVal.map(j => v[j]));
- },
- allExport() {
- this.allExportF(0);
- },
- allExportF(_index, thisIndex) {
- BASE.showLoading({text:'正在导出,请耐心等待...'});
- const that = this;
- if (that.stations[_index]) {
- that.API.requestData({
- method: "GET",
- subUrl: "export/history/all",
- data: {
- templateId: that.templateId,
- startTs: thisIndex!=undefined ? that.startTs[thisIndex] : that.startTs[_index],
- endTs: thisIndex!=undefined ? that.endTs[thisIndex] : that.endTs[_index],
- interval: thisIndex!=undefined ? that.inputVal[thisIndex] : that.inputVal[_index],
- station: thisIndex!=undefined ? that.stations[thisIndex] : that.stations[_index]
- },
- success(res) {
- if (res.code == 200) {
- if (thisIndex!=undefined) {
- if (that.templateId == 1) {
- that.export(res.data, 0, that.zipNames[thisIndex]);
- } else if (that.templateId == 2) {
- that.exportMuban2(res.data, 0, that.zipNames[thisIndex]);
- }
- } else {
- if (that.templateId == 1) {
- that.export(res.data, 0, that.zipNames[_index], ++_index);
- } else if (that.templateId == 2) {
- that.exportMuban2(res.data, 0, that.zipNames[_index], ++_index);
- }
- }
- }
- }
- });
- }
- },
- export (data, _index, zipName, deepIndex) {
- const that = this;
- let tHeader = that.muBan['type' + that.templateId];
- var dataKey = Object.keys(data);
- var key = dataKey[_index];
- if (key) {
- let tempObject = {};
- let tempArray = [];
- const dataLength = data[key].length;
- let filterVal = [];
- data[key][0].forEach((pEle, pIndex) => {
- for (let i = 0; i < dataLength; i++) {
- tempObject[String(i)] = data[key][i][pIndex];
- }
- tempArray.push(tempObject)
- tempObject = {};
- })
- // 上面的index、nickName、name是tableData里对象的属性key值
- data[key][0].forEach((ele, index) => {
- filterVal.push(index);
- });
- that.paths.push(export_blob(tHeader, that.formatJson(filterVal, tempArray))); //传blob
- var str = key.split('_');
- that.pathName.push(str[0].substring(0,2)+str[1]); //excel的名字
- _index++;
-
- if (deepIndex!=undefined) {
- setTimeout(() => {
- that.export(data, _index, zipName, deepIndex);
- }, 500);
- if (dataKey.length == _index) { //当长度一致时,向zip塞值
- var thisPath = that.paths,
- thisPathName = that.pathName;
- that.paths = [];
- that.pathName = [];
- that.zipOut(thisPath, thisPathName, zipName, deepIndex)
- }
- } else {
- setTimeout(() => {
- that.export(data, _index, zipName);
- }, 500);
- if (dataKey.length == _index) { //当长度一致时,向zip塞值
- var thisPath = that.paths,
- thisPathName = that.pathName;
- that.paths = [];
- that.pathName = [];
- that.zipOut(thisPath, thisPathName, zipName)
- }
- }
- }
- },
- exportMuban2(data, _index, excelName, deepIndex) {
- const that = this;
- var dataKey = Object.keys(data);
- let tHeader = that.muBan['type' + that.templateId];
- var key = dataKey[_index];
- if (key) {
- let tempObject = {};
- let tempArray = [];
- const dataLength = data[key].length;
- data[key][0].forEach((pEle, pIndex) => {
- for (let i = 0; i < dataLength; i++) {
- tempObject[String(i)] = data[key][i][pIndex];
- }
- tempArray.push(tempObject)
- tempObject = {};
- })
- // 上面的index、nickName、name是tableData里对象的属性key值
- that.tempArrayS.push(tempArray);
- _index++;
- if (dataKey.length == that.tempArrayS.length) {
- let obj = [];
- that.tempArrayS.forEach((ele, index) => {
- obj[index] = [];
- ele.forEach((ele2, index2) => {
- var key = Object.keys(ele2)
- var arr = [];
- key.forEach((ele3, index3) => {
- arr.push(ele2[ele3])
- })
- obj[index][index2] = arr;
- arr = [];
- })
- })
- if (deepIndex!=undefined) {
- that.paths.push(export_more_blob(tHeader, obj)); //传blob
- that.pathName.push(excelName); //excel的名字
- that.tempArrayS = [];
- that.allExportF(deepIndex);
- } else {
- that.paths.push(export_more_blob(tHeader, obj, excelName)); //只渲染一个excel
- BASE.closeLoading();
- }
- }
- if (deepIndex!=undefined) {
- that.exportMuban2(data, _index, excelName, deepIndex);
- if (that.stations.length == deepIndex && _index == 1) { //当长度一致时,向zip塞值,_index只让执行第一次
- var thisPath = that.paths,
- thisPathName = that.pathName;
- that.tempArrayS = [];
- that.paths = [];
- that.pathName = [];
- that.zipOut(thisPath, thisPathName, '风电场_上网电量&功率&测风塔数据')
- BASE.closeLoading();
- }
- }else{
- that.exportMuban2(data, _index, excelName);
- if (that.stations.length == deepIndex && _index == 1) { //当长度一致时,向zip塞值,_index只让执行第一次
- var thisPath = that.paths,
- thisPathName = that.pathName;
- that.tempArrayS = [];
- that.paths = [];
- that.pathName = [];
- BASE.closeLoading();
- }
- }
- }
- },
- zipOut(paths, pathName, zipName, deepIndex) {
- // paths 所有blob
- // pathName 所有excel文件名
- // zipName zip的包名
- // deepIndex 执行ajax下标,当zipOut方法执行完后,再执行allExportF
- const that = this;
- var zip = new JsZip();
- paths.forEach((item, index) => {
- const arr_name = item // 下载文件, 并存成ArrayBuffer对象
- const file_name = pathName[index] + '.xlsx' // 获取文件名
- zip.file(file_name, arr_name, {
- binary: true
- }) // 逐个添加文件
- })
- zip.generateAsync({
- type: 'blob',
- })
- .then(function(content) {
- // 下载的文件名
- var filename = zipName + '.zip'
- // 创建隐藏的可下载链接
- var eleLink = document.createElement('a')
- eleLink.download = filename
- eleLink.style.display = 'none'
- // 下载内容转变成blob地址
- eleLink.href = URL.createObjectURL(content)
- // 触发点击
- document.body.appendChild(eleLink)
- eleLink.click()
- // 然后移除
- document.body.removeChild(eleLink)
- if (deepIndex) {
- that.allExportF(deepIndex); //递归,去执行ajax
- if(that.stations.length == deepIndex){
- BASE.closeLoading();
- }
- }else if(that.single){
- BASE.closeLoading();
- that.single = false;
- }
- })
- },
- time(index, val) {
- this.startTs[index] = Date.parse(new Date(val[0]));
- this.endTs[index] = Date.parse(new Date(val[1]) + 86400000);
- },
- changeSelect(val) {
- this.stations = [];
- this.zipNames = [];
- val.forEach(ele => {
- var key = ele.split('/');
- this.stations.push(key[0]);
- this.zipNames.push(key[1]);
- })
- },
- },
- }
- </script>
- <style lang="less">
- .excelPickerTd input {
- flex: 1;
- }
- .el-date-editor--daterange.mr15{
- border: 1px solid rgba(96, 103, 105, 0.2);
- height: 33px;
- padding: 0 8px;
- width: 369px;
- input{
- background-color: transparent;
- color: white;
- }
- .el-range-separator{
- color: white;
- }
- }
- .com-table td{
- color: white !important;
- }
- .t2{top: 2px;position: relative !important;}
- </style>
|