导出execl

  1 <template>
  2   <div class="app-container company form-style">
  3     <div style="overflow:hidden">
  4       <div style="float:left;28%" class="left-area">
  5         <el-input v-model="filterText" placeholder="输入关键字进行过滤" />
  6         <el-tree
  7           ref="tree"
  8           v-loading="loading"
  9           accordion
 10           render-after-expand
 11           node-key="value"
 12           style="height:350px;overflow:auto;margin-top:10px"
 13           :props="props"
 14           :data="deptTreeList"
 15           :filter-node-method="filterNode"
 16           :default-expanded-keys="defaultShowNodes"
 17           @node-click="handleNodeClick"
 18         >
 19           <span slot-scope="{ node }" class="span-ellipsis">
 20             <span :title="node.label">{{ node.label }}</span>
 21           </span>
 22         </el-tree>
 23       </div>
 24       <!-- 右侧搜索+table -->
 25       <div style="float:right;70%" class="right-area">
 26         <ct-form ref="form" :inline="true" :model="form">
 27           <el-form-item label="利润中心编码">
 28             <ct-input v-model="queryItem.profitcenter_code" />
 29           </el-form-item>
 30           <el-form-item label="利润中心名称">
 31             <ct-input v-model="queryItem.profitcenter_name" />
 32           </el-form-item>
 33           <ct-select
 34             label="状态"
 35             select-prop="status"
 36             placeholder="请选择"
 37             :select-value="queryItem.status"
 38             :select-data-list="form.statusOptions"
 39             @selectChange="statusChange"
 40           />
 41           <ct-button style="margin-left:5px" @click="getTable">查询</ct-button>
 42           <ct-button @click="handleDownload(table.list)">导出当前</ct-button>
 43           <ct-button @click="exportAll">导出全部</ct-button>
 44           <ct-button v-if="false" @click="add">新增</ct-button>
 45         </ct-form>
 46         <div class="table-style">
 47           <ct-tables
 48             v-loading="loading"
 49             element-loading-text="数据加载中"
 50             :list="table.list"
 51             :options="table.options"
 52             class="table"
 53           >
 54             <el-table-column
 55               label="利润中心编码"
 56               width="120"
 57               prop="profitcenter_code"
 58               align="center"
 59             />
 60             <el-table-column
 61               label="利润中心名称"
 62               :show-overflow-tooltip="isShowText"
 63               prop="profitcenter_name"
 64               align="center"
 65             />
 66             <el-table-column
 67               label="利润中心组编码"
 68               width="130"
 69               prop="profitcenter_group_code"
 70               align="center"
 71             />
 72             <el-table-column
 73               label="利润中心组名称"
 74               width="130"
 75               :show-overflow-tooltip="isShowText"
 76               prop="profitcenter_group_name"
 77               align="center"
 78             />
 79             <el-table-column label="账套编码" width="90" prop="account_code" align="center" />
 80             <el-table-column label="账套名称" width="90" prop="account_name" align="center" />
 81             <el-table-column label="启用状态" width="90" prop="status_name" align="center" />
 82             <el-table-column
 83               v-if="false"
 84               label="操作"
 85               prop="profitcenter_code"
 86               align="center"
 87             >
 88               <template slot-scope="scope">
 89                 <ct-button type="save" @click="edit(scope.row)">修改</ct-button>
 90               </template>
 91             </el-table-column>
 92           </ct-tables>
 93           <ct-pagination :child-msg="table.page" @callFather="getPagination" />
 94         </div>
 95       </div>
 96     </div>
 97   </div>
 98 </template>
 99 <script>
100 import { getCompany, getSelect } from '@/api/base/company'
101 export default {
102   data() {
103     return {
104       defaultShowNodes: [], // 默认展开的节点
105       organs: this.$store.state.user.organs,
106       isShowText: true,
107       form: {
108         statusOptions: [
109           {
110             label: '全部',
111             value: ''
112           },
113           {
114             label: '启用',
115             value: '10'
116           },
117           {
118             label: '停用',
119             value: '20'
120           }
121         ],
122         accountOptions: []
123       },
124       queryItem: {
125         account_code: '',
126         profitcenter_code: '',
127         profitcenter_name: '',
128         status: '',
129         profitcenter_group_code: ''
130       },
131       // td模拟数据 业务中以下字段前台与后台须商定好
132       table: {
133         list: [],
134         options: {
135           stripe: true, // 是否为斑马纹 table
136           highlightCurrentRow: true, // 是否支持当前行高亮显示
137           mutiSelect: true // 是否支持列表项选中功能
138         },
139         page: {
140           size: 10,
141           pages: 0,
142           current: 1,
143           total: 0
144         }
145       },
146       loading: true,
147       filterText: '',
148       deptTreeList: [],
149       list: [],
150       props: {
151         label: 'label',
152         children: 'children',
153         isLeaf: 'isLeaf'
154       }
155     }
156   },
157   watch: {
158     filterText(val) {
159       this.$refs.tree.filter(val)
160     },
161     deptTreeList: {
162       handler() {
163         // 默认展开2级
164         this.deptTreeList.forEach(item => {
165           // item.children.forEach(items => {
166           //   this.defaultShowNodes.push(items.value)
167           // })
168           // 改为默认展开1级
169           this.defaultShowNodes.push(item.value)
170         })
171       },
172       deep: true
173     }
174   },
175   mounted() {
176     // 初始化部门树
177     this.getAccountCompanySelect()
178     this.$nextTick(() => {
179       this.TreeChangeStyle()
180     })
181     this.loading = false
182   },
183   methods: {
184     // 新增start
185     filterNode(value, data) {
186       if (!value) return true
187       return data.label.indexOf(value) !== -1
188     },
189     handleNodeClick(data, node) {
190       if (data.children !== null && data.children !== undefined) {
191         this.queryItem.profitcenter_code = ''
192         this.queryItem.profitcenter_group_code = data.value
193       } else {
194         this.queryItem.profitcenter_group_code = ''
195         this.queryItem.profitcenter_code = data.value
196       }
197       this.getTable()
198       this.$nextTick(() => {
199         this.TreeChangeStyle()
200       })
201     },
202     // 获取公司树
203     getAccountCompanySelect() {
204       getSelect().then(res => {
205         res.data.forEach(item => {
206           this.deleteNullChildren(item)
207         })
208         this.deptTreeList = res.data
209         this.queryItem.profitcenter_group_code = this.deptTreeList[0].value
210         const query = { profitcenter_group_code: this.queryItem.profitcenter_group_code, size: 10, current: 1 }
211         getCompany(query).then(res => {
212           this.table.list = res.data.records
213           this.table.page.size = res.data.size
214           this.table.page.current = res.data.current
215           this.table.page.pages = res.data.pages
216           this.table.page.total = res.data.total
217         })
218       })
219     },
220     deleteNullChildren(obj) {
221       if (obj.children instanceof Array && obj.children.length > 0) {
222         obj.children.forEach(item => {
223           this.deleteNullChildren(item)
224         })
225       } else {
226         delete obj.children
227       }
228     },
229     // 新增end
230     edit(row) {
231       const profitcenter_code = row.profitcenter_code
232       this.$router.push({
233         path: '/base/company/edit',
234         query: { profitcenter_code: profitcenter_code }
235       })
236     },
237     getTable() {
238       this.table.page.current = 1
239       const query = { ...this.queryItem, ...this.table.page }
240       this.loading = true
241       getCompany(query).then(res => {
242         this.table.list = res.data.records
243         this.table.page.size = res.data.size
244         this.table.page.current = res.data.current
245         this.table.page.pages = res.data.pages
246         this.table.page.total = res.data.total
247         this.loading = false
248       })
249     },
250     getPagination(page) {
251       const query = { ...this.queryItem, ...page }
252       getCompany(query).then(res => {
253         this.table.list = res.data.records
254         this.table.page.size = res.data.size
255         this.table.page.current = res.data.current
256         this.table.page.pages = res.data.pages
257         this.table.page.total = res.data.total
258         this.loading = false
259       })
260     },
261     exportAll() {
262       const page = JSON.parse(JSON.stringify(this.table.page))
263       page.size = page.total
264       getCompany(page).then(res => {
265         const list = res.data.records
266         this.handleDownload(list)
267       })
268     },
269     handleDownload(list) {
270       import('@/vendor/Export2Excel').then(excel => {
271         const tHeader = [
272           '利润中心编码',
273           '利润中心名称',
274           '利润中心组编码',
275           '利润中心组名称',
276           '账套编码',
277           '账套名称',
278           '启用状态'
279         ]
280         const filterVal = [
281           'profitcenter_code',
282           'profitcenter_name',
283           'profitcenter_group_code',
284           'profitcenter_group_name',
285           'account_code',
286           'account_name',
287           'status_name'
288         ] // 过滤表格输出的数据
289         const data = this.formatJson(filterVal, list)
290         excel.export_json_to_excel({
291           header: tHeader,
292           data,
293           filename: '公司信息',
294           autoWidth: true
295         })
296       })
297     },
298     formatJson(filterVal, jsonData) {
299       return jsonData.map(v => filterVal.map(j => v[j]))
300     },
301     add() {
302       this.$router.push({
303         path: '/base/company/add'
304       })
305     },
306     statusChange(val) {
307       this.queryItem.status = val
308     },
309     TreeChangeStyle() {
310       // eslint-disable-next-line no-empty-character-class
311       if (navigator.appName === 'Microsoft Internet Explorer' && parseInt(navigator.appVersion.split(';')[1].replace(/[]/g, '').replace('MSIE', '')) < 10) {
312         // console.log("您的浏览器版本过低,请使用IE10及以上版本")
313         var change = document.getElementsByClassName('el-tree-node__expand-icon')
314         change.forEach((item) => {
315           item.style.display = 'none'
316         })
317       }
318     }
319   }
320 }
321 </script>
322 <style lang="scss" scoped>
323 .company{
324   .left-area{
325     .el-input {
326        100%;
327     }
328   }
329   .right-area{
330     .el-form--inline .el-form-item {
331       margin-right: 0px;
332       vertical-align: inherit;
333     }
334   }
335 }
336 </style>
原文地址:https://www.cnblogs.com/guwufeiyang/p/15307163.html