{"id":20144178,"url":"https://github.com/quansitech/qscmf-topbutton-export","last_synced_at":"2025-04-09T18:53:48.584Z","repository":{"id":45135156,"uuid":"237466143","full_name":"quansitech/qscmf-topbutton-export","owner":"quansitech","description":"xlsx导出excel","archived":false,"fork":false,"pushed_at":"2023-12-04T08:12:35.000Z","size":333,"stargazers_count":0,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-23T20:51:18.262Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/quansitech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-01-31T16:08:35.000Z","updated_at":"2022-01-06T03:01:51.000Z","dependencies_parsed_at":"2023-12-04T08:47:13.991Z","dependency_job_id":null,"html_url":"https://github.com/quansitech/qscmf-topbutton-export","commit_stats":{"total_commits":15,"total_committers":4,"mean_commits":3.75,"dds":0.6,"last_synced_commit":"bee8d56785257d7ce36c10f3f1754c0ce1c00a29"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quansitech%2Fqscmf-topbutton-export","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quansitech%2Fqscmf-topbutton-export/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quansitech%2Fqscmf-topbutton-export/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/quansitech%2Fqscmf-topbutton-export/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/quansitech","download_url":"https://codeload.github.com/quansitech/qscmf-topbutton-export/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248093699,"owners_count":21046730,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T22:09:04.999Z","updated_at":"2025-04-09T18:53:48.561Z","avatar_url":"https://github.com/quansitech.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## xlsx导出excel\n由后端完成excel导出操作会极大占用服务器资源，同时数据太多时往往会需要处理很长时间，页面长时间处于卡死状态用户体验也极差，因此采用前端分批导出excel数据才是更合理的做法。\n\n+ 安装\n```php\ncomposer require quansitech/qscmf-topbutton-export\n```\n\n+ 使用样例\n```php\n.\n.\n.\n\nclass PostController extends GyListController{\n    //继承ExportExcelByXlsx\n    use ExportExcelByXlsx;\n.\n.\n.\n    \n        $builder = new \\Common\\Builder\\ListBuilder();\n        //第一个参数指定export类型，第二个参数是指定需要覆盖的html组件属性\n        //title为按钮名称，默认导出excel\n        //data-url为点击导出按钮后ajax请求的地址,必填\n        //data-filename 为生成的excel文件名,默认为浏览器的默认生成文件名\n        //data-streamrownum 为每次请求获取的数据数\n        $builder-\u003eaddTopButton('export', array('title' =\u003e '样例导出', 'data-url' =\u003e U('/admin/post/export'), 'data-filename' =\u003e '文章列表', 'data-streamrownum' =\u003e '10'));\n    \n.\n.\n.\n    //导出excel请求的action\n    public function export(){\n    \n        //exportExcelByXlsx为 Qscmf\\Builder\\ExportExcelByXlsx trait提供的方法\n        //参数为一个闭包函数，接收两个参数， page为请求的页数， rownnum为请求的数据行数\n        $this-\u003eexportExcelByXlsx(function($page, $rownum){\n             //闭包函数必须返回如下数据格式\n             //[\n             //    [  'excel表头1' =\u003e  行1数据1, 'excel表头2' =\u003e 行1数据2 ..... ]\n             //    [  'excel表头1' =\u003e  行2数据1, 'excel表头2' =\u003e 行2数据2 ..... ]\n             //    ...\n             //]\n            return [\n                 [  '姓名' =\u003e  'tt', '性别' =\u003e 'male', '年龄' =\u003e 23 ]\n                 [  '姓名' =\u003e  'ff', '性别' =\u003e 'female', '年龄' =\u003e 19 ]\n            ];\n        });\n\n    }\n\n```\n\n#### 筛选导出列\n```php\n//列配置，default为true表示默认选中状态, required为true表示必选\n$cols_options = [\n    [\n        'key' =\u003e 'name',\n        'title' =\u003e '商家名称',\n        'default' =\u003e true,\n        'required' =\u003e true\n    ],\n    [\n        'key' =\u003e 'account',\n        'title' =\u003e '账号',\n        'default' =\u003e true\n    ],\n    [\n        'key' =\u003e 'address',\n        'title' =\u003e '商家地址'\n    ],\n    [\n        'key' =\u003e 'num',\n        'title' =\u003e '核销次数'\n    ],\n    [\n        'key' =\u003e 'status',\n        'title' =\u003e '状态'\n    ],\n    [\n        'key' =\u003e 'explain',\n        'title' =\u003e '优惠券使用说明'\n    ]\n];\n\n//将列配置复制给第二个参数的键值 export_cols\n//控件会将选择的列数据post至url,可通过I('post.exportCol')获取，再进行数据筛选逻辑处理。\n$builder-\u003eaddTopButton('export', array('export_cols' =\u003e $cols_options, 'title' =\u003e '样例导出', 'data-url' =\u003e U('/admin/post/export'), 'data-filename' =\u003e '文章列表', 'data-streamrownum' =\u003e '10'));\n\n\n```\n\n\n#### 导出数据为多张工作表  \n```php\n $export_arr = [\n    ['sheetName' =\u003e 'Sheet1', 'url' =\u003e U('/admin/post/export'), 'rownum' =\u003e '15'],\n    ['sheetName' =\u003e 'Sheet2', 'url' =\u003e U('/admin/post/export'), 'rownum' =\u003e '15'],\n ];\n \n $builder-\u003eaddTopButton('export', ['data-url' =\u003e json_encode($export_arr), 'data-filename' =\u003e '导出列表', 'data-streamrownum' =\u003e intval($export_arr[0]['rownum'])]);\n```\n\n#### 业务层错误提示\n```php\n可在导出数据处理的action位置进行错误验证，使用$this-\u003eerrro(\"test\")\n插件可自动获取错误信息并alert提示用户\n```\n\n#### 导出辅助类\n\n[ExportExcelByXlsx使用说明](https://github.com/quansitech/qscmf-topbutton-export/blob/master/ExportExcelByXlsx.md)\n\n\n#### 导出有合并单元格的表格\n```text\n每一行数据添加字段 _cellProperties 来配置对应的单元格需要合并的范围。\n\n_cellProperties 包括 rowSpan colSpan值，为0表示被合并的单元格\n```\n\n+ 用法\n  ```php\n  // 原始数据为\n  $source_data = [\n    ['name' =\u003e 'name1','nick_name' =\u003e 'nick_name1','phone' =\u003e 'phone1','tel' =\u003e 'tel1'],\n    ['name' =\u003e 'name2','nick_name' =\u003e 'nick_name2','phone' =\u003e 'phone2','tel' =\u003e 'tel2'],\n    ['name' =\u003e 'name3','nick_name' =\u003e 'nick_name3','phone' =\u003e 'phone3','tel' =\u003e 'tel3'],\n  ];\n  \n  // 想要实现的效果\n  // 将第二行的 name 和 第三行的 name 行合并，并展示 第二行 的值； \n  // 将第二行的 phone 和 tel 列合并，并展示 phone； \n  \n  // 设置每一行的 _cellProperties \n  $source_data = [\n    ['name' =\u003e 'name1','nick_name' =\u003e 'nick_name1','phone' =\u003e 'phone1','tel' =\u003e 'tel1', \n     '_cellProperties' =\u003e ['name' =\u003e '','nick_name' =\u003e '','phone' =\u003e '','tel' =\u003e '']],\n    ['name' =\u003e 'name2','nick_name' =\u003e 'nick_name2','phone' =\u003e 'phone2','tel' =\u003e 'tel2',\n     '_cellProperties' =\u003e ['name' =\u003e ['rowSpan' =\u003e 2],'nick_name' =\u003e '','phone' =\u003e ['colSpan' =\u003e 2],'tel' =\u003e ['colSpan' =\u003e 0]]],\n    ['name' =\u003e 'name3','nick_name' =\u003e 'nick_name3','phone' =\u003e 'phone3','tel' =\u003e 'tel3', \n     '_cellProperties' =\u003e ['name' =\u003e ['rowSpan' =\u003e 0],'nick_name' =\u003e '','phone' =\u003e '','tel' =\u003e '']],\n  ];\n  \n  // 导出的数据格式为 \n  $export_data = [\n    ['表头字段1' =\u003e 'name1','表头字段2' =\u003e 'nick_name1','表头字段3' =\u003e 'phone1','表头字段4' =\u003e 'tel1', \n     '_cellProperties' =\u003e ['表头字段1' =\u003e '','表头字段2' =\u003e '','表头字段3' =\u003e '','表头字段4' =\u003e '']],\n    ['表头字段1' =\u003e 'name2','表头字段2' =\u003e 'nick_name2','表头字段3' =\u003e 'phone2','表头字段4' =\u003e 'tel2', \n     '_cellProperties' =\u003e ['表头字段1' =\u003e ['rowSpan' =\u003e 2],'表头字段2' =\u003e '','表头字段3' =\u003e ['colSpan' =\u003e 2],'表头字段4' =\u003e ['colSpan' =\u003e 0]]],\n    ['表头字段1' =\u003e 'name3','表头字段2' =\u003e 'nick_name3','表头字段3' =\u003e 'phone3','表头字段4' =\u003e 'tel3', \n     '_cellProperties' =\u003e ['表头字段1' =\u003e ['rowSpan' =\u003e 0],'表头字段2' =\u003e '','表头字段3' =\u003e '','表头字段4' =\u003e '']],\n  ];\n \n  // 原始数据与导出数据的差异为 每一行数据的键名不同\n  // 可以使用辅助函数 combineListWithNameMapping 将 $source_data 转为 $export_data\n  \n  $header_mapping = [\n    'name' =\u003e '表头字段1',\n    'nick_name' =\u003e '表头字段2',\n    'phone' =\u003e '表头字段3',\n    'tel' =\u003e '表头字段4',\n  ];\n  \n  $export_data = $this-\u003ecombineListWithNameMapping($source_data, $header_mapping);\n  \n  ```\n  导出效果如图所示 \n  \n  ![合并表格效果](https://user-images.githubusercontent.com/35066497/192722889-16e62813-7ca8-4f10-89aa-1efd8768f23e.png)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquansitech%2Fqscmf-topbutton-export","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fquansitech%2Fqscmf-topbutton-export","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fquansitech%2Fqscmf-topbutton-export/lists"}