123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- <?php
- use app\common\model\Category;
- use fast\Form;
- use fast\Tree;
- use think\Db;
- if (!function_exists('build_select')) {
- /**
- * 生成下拉列表
- * @param string $name
- * @param mixed $options
- * @param mixed $selected
- * @param mixed $attr
- * @return string
- */
- function build_select($name, $options, $selected = [], $attr = [])
- {
- $options = is_array($options) ? $options : explode(',', $options);
- $selected = is_array($selected) ? $selected : explode(',', $selected);
- return Form::select($name, $options, $selected, $attr);
- }
- }
- if (!function_exists('build_radios')) {
- /**
- * 生成单选按钮组
- * @param string $name
- * @param array $list
- * @param mixed $selected
- * @return string
- */
- function build_radios($name, $list = [], $selected = null)
- {
- $html = [];
- $selected = is_null($selected) ? key($list) : $selected;
- $selected = is_array($selected) ? $selected : explode(',', $selected);
- foreach ($list as $k => $v) {
- $html[] = sprintf(Form::label("{$name}-{$k}", "%s {$v}"), Form::radio($name, $k, in_array($k, $selected), ['id' => "{$name}-{$k}"]));
- }
- return '<div class="radio">' . implode(' ', $html) . '</div>';
- }
- }
- if (!function_exists('build_checkboxs')) {
- /**
- * 生成复选按钮组
- * @param string $name
- * @param array $list
- * @param mixed $selected
- * @return string
- */
- function build_checkboxs($name, $list = [], $selected = null)
- {
- $html = [];
- $selected = is_null($selected) ? [] : $selected;
- $selected = is_array($selected) ? $selected : explode(',', $selected);
- foreach ($list as $k => $v) {
- $html[] = sprintf(Form::label("{$name}-{$k}", "%s {$v}"), Form::checkbox($name, $k, in_array($k, $selected), ['id' => "{$name}-{$k}"]));
- }
- return '<div class="checkbox">' . implode(' ', $html) . '</div>';
- }
- }
- if (!function_exists('build_category_select')) {
- /**
- * 生成分类下拉列表框
- * @param string $name
- * @param string $type
- * @param mixed $selected
- * @param array $attr
- * @param array $header
- * @return string
- */
- function build_category_select($name, $type, $selected = null, $attr = [], $header = [])
- {
- $tree = Tree::instance();
- $tree->init(Category::getCategoryArray($type), 'pid');
- $categorylist = $tree->getTreeList($tree->getTreeArray(0), 'name');
- $categorydata = $header ? $header : [];
- foreach ($categorylist as $k => $v) {
- $categorydata[$v['id']] = $v['name'];
- }
- $attr = array_merge(['id' => "c-{$name}", 'class' => 'form-control selectpicker'], $attr);
- return build_select($name, $categorydata, $selected, $attr);
- }
- }
- if (!function_exists('build_toolbar')) {
- /**
- * 生成表格操作按钮栏
- * @param array $btns 按钮组
- * @param array $attr 按钮属性值
- * @return string
- */
- function build_toolbar($btns = null, $attr = [])
- {
- $auth = \app\admin\library\Auth::instance();
- $controller = str_replace('.', '/', strtolower(think\Request::instance()->controller()));
- $btns = $btns ? $btns : ['refresh', 'add', 'edit', 'del', 'import'];
- $btns = is_array($btns) ? $btns : explode(',', $btns);
- $index = array_search('delete', $btns);
- if ($index !== false) {
- $btns[$index] = 'del';
- }
- $btnAttr = [
- 'refresh' => ['javascript:;', 'btn btn-primary btn-refresh', 'fa fa-refresh', '', __('Refresh')],
- 'add' => ['javascript:;', 'btn btn-success btn-add', 'fa fa-plus', __('Add'), __('Add')],
- 'edit' => ['javascript:;', 'btn btn-success btn-edit btn-disabled disabled', 'fa fa-pencil', __('Edit'), __('Edit')],
- 'del' => ['javascript:;', 'btn btn-danger btn-del btn-disabled disabled', 'fa fa-trash', __('Delete'), __('Delete')],
- 'import' => ['javascript:;', 'btn btn-info btn-import', 'fa fa-upload', __('Import'), __('Import')],
- ];
- $btnAttr = array_merge($btnAttr, $attr);
- $html = [];
- foreach ($btns as $k => $v) {
- //如果未定义或没有权限
- if (!isset($btnAttr[$v]) || ($v !== 'refresh' && !$auth->check("{$controller}/{$v}"))) {
- continue;
- }
- list($href, $class, $icon, $text, $title) = $btnAttr[$v];
- //$extend = $v == 'import' ? 'id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"' : '';
- //$html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '" ' . $extend . '><i class="' . $icon . '"></i> ' . $text . '</a>';
- if ($v == 'import') {
- $template = str_replace('/', '_', $controller);
- $download = '';
- if (file_exists("./template/{$template}.xlsx")) {
- $download .= "<li><a href=\"/template/{$template}.xlsx\" target=\"_blank\">XLSX模版</a></li>";
- }
- if (file_exists("./template/{$template}.xls")) {
- $download .= "<li><a href=\"/template/{$template}.xls\" target=\"_blank\">XLS模版</a></li>";
- }
- if (file_exists("./template/{$template}.csv")) {
- $download .= empty($download) ? '' : "<li class=\"divider\"></li>";
- $download .= "<li><a href=\"/template/{$template}.csv\" target=\"_blank\">CSV模版</a></li>";
- }
- $download .= empty($download) ? '' : "\n ";
- if (!empty($download)) {
- $html[] = <<<EOT
- <div class="btn-group">
- <button type="button" href="{$href}" class="btn btn-info btn-import" title="{$title}" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="{$icon}"></i> {$text}</button>
- <button type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" title="下载批量导入模版">
- <span class="caret"></span>
- <span class="sr-only">Toggle Dropdown</span>
- </button>
- <ul class="dropdown-menu" role="menu">{$download}</ul>
- </div>
- EOT;
- } else {
- $html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '" id="btn-import-file" data-url="ajax/upload" data-mimetype="csv,xls,xlsx" data-multiple="false"><i class="' . $icon . '"></i> ' . $text . '</a>';
- }
- } else {
- $html[] = '<a href="' . $href . '" class="' . $class . '" title="' . $title . '"><i class="' . $icon . '"></i> ' . $text . '</a>';
- }
- }
- return implode(' ', $html);
- }
- }
- if (!function_exists('build_heading')) {
- /**
- * 生成页面Heading
- *
- * @param string $path 指定的path
- * @return string
- */
- function build_heading($path = null, $container = true)
- {
- $title = $content = '';
- if (is_null($path)) {
- $action = request()->action();
- $controller = str_replace('.', '/', request()->controller());
- $path = strtolower($controller . ($action && $action != 'index' ? '/' . $action : ''));
- }
- // 根据当前的URI自动匹配父节点的标题和备注
- $data = Db::name('auth_rule')->where('name', $path)->field('title,remark')->find();
- if ($data) {
- $title = __($data['title']);
- $content = __($data['remark']);
- }
- if (!$content) {
- return '';
- }
- $result = '<div class="panel-lead"><em>' . $title . '</em>' . $content . '</div>';
- if ($container) {
- $result = '<div class="panel-heading">' . $result . '</div>';
- }
- return $result;
- }
- }
- if (!function_exists('dd')) {
- function dd($data)
- {
- echo '<pre>';
- var_dump($data);
- die;
- }
- }
- if (!function_exists('getNewRand'))
- {
- /**
- * 获取字母数字随机数
- * @param int $len
- * @return string
- * @author matielong
- */
- function getNewRand($len = 4)
- {
- $chars_array = array(
- "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
- "A", "B", "C", "D", "E", "F", "G",
- "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
- "S", "T", "U", "V", "W", "X", "Y", "Z",
- );
- $charsLen = count($chars_array) - 1;
- $outputstr = "";
- for ($i=0; $i<$len; $i++)
- {
- $outputstr .= $chars_array[mt_rand(0, $charsLen)];
- }
- return $outputstr;
- }
- }
- if (!function_exists('ch2arr'))
- {
- /**
- * 字符串转换数组
- * @param $str
- * @return array
- */
- function ch2arr($str)
- {
- $length = mb_strlen($str, 'utf-8');
- $array = [];
- for ($i=0; $i<$length; $i++)
- $array[] = mb_substr($str, $i, 1, 'utf-8');
- return $array;
- }
- }
- if (!function_exists('exportOrderExcel')) {
- /**
- * execl数据导出
- * 应用场景:订单导出
- * @param string $title 模型名(如Member),用于导出生成文件名的前缀
- * @param array $cellName 表头及字段名
- * @param array $data 导出的表数据
- * 特殊处理:合并单元格需要先对数据进行处理
- * @throws PHPExcel_Exception
- * @throws PHPExcel_Reader_Exception
- * @throws PHPExcel_Writer_Exception
- */
- function exportOrderExcel($title,$cellName,$data)
- {
- //引入核心文件
- include EXTEND_PATH.'PHPExcel/PHPExcel.php';
- $objPHPExcel = new \PHPExcel();
- //定义配置
- $topNumber = 1;//表头有几行占用
- $xlsTitle = iconv('utf-8', 'gb2312', $title);//文件名称
- // $fileName = $title.date('_YmdHis');//文件名称
- $fileName = $title;//文件名称
- $cellKey = array(
- 'A','B','C','D','E','F','G','H','I','J','K','L','M',
- 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
- 'AA','AB','AC','AD','AE','AF','AG','AH','AI','AJ','AK','AL','AM',
- 'AN','AO','AP','AQ','AR','AS','AT','AU','AV','AW','AX','AY','AZ'
- );
- //写在处理的前面(了解表格基本知识,已测试)
- // $objPHPExcel->getActiveSheet()->getDefaultRowDimension()->setRowHeight(20);//所有单元格(行)默认高度
- // $objPHPExcel->getActiveSheet()->getDefaultColumnDimension()->setWidth(20);//所有单元格(列)默认宽度
- // $objPHPExcel->getActiveSheet()->getRowDimension('1')->setRowHeight(30);//设置行高度
- // $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(30);//设置列宽度
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(18);//设置文字大小
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);//设置是否加粗
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_WHITE);// 设置文字颜色
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);//设置文字居左(HORIZONTAL_LEFT,默认值)中(HORIZONTAL_CENTER)右(HORIZONTAL_RIGHT)
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID);//设置填充颜色
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFill()->getStartColor()->setARGB('FF7F24');//设置填充颜色
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_TEXT);
- //处理表头标题
- // $objPHPExcel->getActiveSheet()->mergeCells('A1:'.$cellKey[count($cellName)-1].'1');//合并单元格(如果要拆分单元格是需要先合并再拆分的,否则程序会报错)
- // $objPHPExcel->setActiveSheetIndex(0)->setCellValue('A1','订单信息');
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getFont()->setSize(18);
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
- // $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
- //处理表头
- foreach ($cellName as $k=>$v)
- {
- $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellKey[$k].$topNumber, $v[1]);//设置表头数据
- // $objPHPExcel->getActiveSheet()->freezePane($cellKey[$k].($topNumber+1));//冻结窗口
- $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k].$topNumber)->getFont()->setBold(true);//设置是否加粗
- $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k].$topNumber)->getFont()->getColor()->setARGB(PHPExcel_Style_Color::COLOR_RED);// 设置文字颜色
- $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k].$topNumber)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);//垂直居中
- if($v[3] > 0)//大于0表示需要设置宽度
- {
- $objPHPExcel->getActiveSheet()->getColumnDimension($cellKey[$k])->setWidth($v[3]);//设置列宽度
- }
- }
- //处理数据
- foreach ($data as $k=>$v)
- {
- foreach ($cellName as $k1=>$v1)
- {
- $objPHPExcel->getActiveSheet()->setCellValue($cellKey[$k1].($k+1+$topNumber), $v[$v1[0]]);
- if(isset($v['end']) && $v['end'] > 0)
- {
- if($v1[2] == 1)//这里表示合并单元格
- {
- $objPHPExcel->getActiveSheet()->mergeCells($cellKey[$k1].$v['start'].':'.$cellKey[$k1].$v['end']);
- $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k1].$v['start'])->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);
- }
- }
- if($v1[4] != "" && in_array($v1[4], array("LEFT","CENTER","RIGHT")))
- {
- $v1[4] = eval('return PHPExcel_Style_Alignment::HORIZONTAL_'.$v1[4].';');
- //这里也可以直接传常量定义的值,即left,center,right;小写的strtolower
- $objPHPExcel->getActiveSheet()->getStyle($cellKey[$k1].($k+1+$topNumber))->getAlignment()->setHorizontal($v1[4]);
- }
- }
- }
- ob_end_clean();//解决乱码核心 就在此处添加此函数
- //导出execl
- header('pragma:public');
- header('Content-type:application/vnd.ms-excel;charset=utf-8;name="'.$xlsTitle.'.xlsx"');
- header("Content-Disposition:attachment;filename=$fileName.xlsx");//attachment新窗口打印inline本窗口打印
- $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
- $objWriter->save('php://output');
- exit;
- }
- }
|