• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

PHP使用PhpSpreadsheet实现导出Excel时带下拉框列表 (可支持三级联动)

武飞扬头像
树下水月
帮助1

因项目需要导出Excel表   需要支持下拉   且 还需要支持三级联动功能 

目前应为PHPExcel 不在维护,固采用 PhpSpreadsheet

效果如图:

学新通

 第一步:首先 使用composer 获取PhpSpreadsheet

我这里PHP 版本 7.4  命令如下:

composer require phpoffice/phpspreadsheet

 第二步:新建php 文件 代码如下   可根据实际情况 自己改动:

  1.  
    <?php
  2.  
     
  3.  
    require './vendor/autoload.php';
  4.  
    use PhpOffice\PhpSpreadsheet\Cell\DataValidation;
  5.  
    use PhpOffice\PhpSpreadsheet\IOFactory;
  6.  
    use PhpOffice\PhpSpreadsheet\NamedRange;
  7.  
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
  8.  
    use PhpOffice\PhpSpreadsheet\Style\Alignment;
  9.  
    use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
  10.  
    use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
  11.  
    use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
  12.  
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  13.  
     
  14.  
     
  15.  
    // 定义表头
  16.  
    $header = [
  17.  
    ['col' => 'A', 'title' => '姓名', 'field' => 'name', 'width' => 20, 'id_down_type' => 0, 'is_text' => 1],
  18.  
    ['col' => 'B', 'title' => '证件号', 'field' => 'id_card', 'width' => 30, 'id_down_type' => 0, 'is_text' => 1],
  19.  
    ['col' => 'C', 'title' => '性别', 'field' => 'gender', 'width' => 20, 'id_down_type' => 1, 'is_text' => 1, 'count' => 2, 'sub_table_name' => 'sex'],
  20.  
    ['col' => 'D', 'title' => '联系方式', 'field' => 'phone', 'width' => 20, 'id_down_type' => 0, 'is_text' => 1],
  21.  
    ['col' => 'E', 'title' => '门店', 'field' => 'mendiao', 'width' => 30, 'id_down_type' => 2, 'is_text' => 0],
  22.  
    ['col' => 'F', 'title' => '公寓', 'field' => 'gongyu', 'width' => 30, 'id_down_type' => 2, 'is_text' => 0],
  23.  
    ['col' => 'G', 'title' => '门牌号', 'field' => 'menpai', 'width' => 30, 'id_down_type' => 2, 'is_text' => 0],
  24.  
    ];
  25.  
     
  26.  
    // 下拉数据[这里模拟出来数据格式,实际情况从数据库获取数据并整理成下列数据格式]
  27.  
    $oneData = [
  28.  
    [
  29.  
    'id' => 1,
  30.  
    'title' => '我是A',
  31.  
    'text'=>'我是A_1',
  32.  
    'children' =>
  33.  
    [
  34.  
    [
  35.  
    'id' => 2,
  36.  
    'title' => '我是A的下级A1',
  37.  
    'text'=>'我是A的下级A1_2',
  38.  
    'children' =>
  39.  
    [
  40.  
    [
  41.  
    'id' => 3,
  42.  
    'title' => '我是A1的下级A11',
  43.  
    'text'=>'我是A1的下级A11_3',
  44.  
    ],
  45.  
    [
  46.  
    'id' => 4,
  47.  
    'title' => '我是A1的下级A12',
  48.  
    'text'=>'我是A1的下级A12_4',
  49.  
    ]
  50.  
    ]
  51.  
    ],
  52.  
    [
  53.  
    'id' => 5,
  54.  
    'title' => '我是A的下级A2',
  55.  
    'text'=>'我是A的下级A2_5',
  56.  
    'children' =>
  57.  
    [
  58.  
    [
  59.  
    'id' => 6,
  60.  
    'title' => '我是A2的下级A21',
  61.  
    'text'=>'我是A2的下级A21_6',
  62.  
    ],
  63.  
    [
  64.  
    'id' => 7,
  65.  
    'title' => '我是A2的下级A22',
  66.  
    'text'=>'我是A2的下级A22_7',
  67.  
    ]
  68.  
    ]
  69.  
    ]
  70.  
    ]
  71.  
    ],
  72.  
    [
  73.  
    'id' => 8,
  74.  
    'title' => '我是B',
  75.  
    'text'=>'我是B_8',
  76.  
    'children' =>
  77.  
    [
  78.  
    [
  79.  
    'id' => 9,
  80.  
    'title' => '我是B的下级B1',
  81.  
    'text'=>'我是B的下级B1_9',
  82.  
    'children' =>
  83.  
    [
  84.  
    [
  85.  
    'id' => 10,
  86.  
    'title' => '我是B1的下级B11',
  87.  
    'text'=>'我是B1的下级B11_10',
  88.  
    ],
  89.  
    [
  90.  
    'id' => 11,
  91.  
    'title' => '我是B1的下级B12',
  92.  
    'text'=>'我是B1的下级B12_11',
  93.  
    ]
  94.  
    ]
  95.  
    ],
  96.  
    [
  97.  
    'id' => 12,
  98.  
    'title' => '我是B的下级B2',
  99.  
    'text' => '我是B的下级B2_12',
  100.  
    'children' =>
  101.  
    [
  102.  
    [
  103.  
    'id' => 13,
  104.  
    'title' => '我是B2的下级B21',
  105.  
    'text' => '我是B2的下级B21_13',
  106.  
    ],
  107.  
    [
  108.  
    'id' => 14,
  109.  
    'title' => '我是B2的下级B22',
  110.  
    'text' => '我是B2的下级B22_14'
  111.  
    ]
  112.  
    ]
  113.  
    ]
  114.  
    ]
  115.  
    ],
  116.  
    ];
  117.  
     
  118.  
    //实例化Spreadsheet对象
  119.  
    $spreadsheet = new Spreadsheet();
  120.  
     
  121.  
    $sex_list = [
  122.  
    ['id' => 1, 'text' => '男'],
  123.  
    ['id' => 2, 'text' => '女'],
  124.  
    ];
  125.  
    $sub_table_num = 1; //子表顺序 默认1
  126.  
    //创建子表下拉定义 用于下拉
  127.  
    $sub_table_info_arr = [
  128.  
    ['title' => 'sex', 'index' => $sub_table_num, 'data' => $sex_list],
  129.  
    ];
  130.  
    $sub_table_num ;
  131.  
     
  132.  
    //创建下拉分表数据
  133.  
    create_excel_sub_table($spreadsheet, $sub_table_info_arr);
  134.  
     
  135.  
     
  136.  
    //创建下拉联动分表数据
  137.  
    $liandong_name = 'region'; // 这里的region为分表名称
  138.  
    create_excel_drop_down($spreadsheet, $sub_table_num, $liandong_name, $oneData); //无限极oneData 里面结构为[['text'=>'部门1_00001','children'=>[['text'=>'部门1子集1_00001']]]
  139.  
     
  140.  
     
  141.  
    // 初始化表头
  142.  
    $spreadsheet->setActiveSheetIndex(0);
  143.  
    $spreadsheet->getActiveSheet()->setTitle('导入模板');
  144.  
     
  145.  
    foreach ($header as $key => $value) {
  146.  
     
  147.  
    //$spreadsheet->getActiveSheet()->setCellValueByColumnAndRow($key, 1, $value['title']);
  148.  
    $spreadsheet->setActiveSheetIndex(0)->setCellValue($value['col'] . "1", $value['title']);
  149.  
    $spreadsheet->getActiveSheet()->getStyle($value['col'] . "1", $value['title'])->getFont()->getColor()->setARGB(\PhpOffice\PhpSpreadsheet\Style\Color::COLOR_RED); //设置红色文字
  150.  
     
  151.  
    // 设置每列宽度
  152.  
    $spreadsheet->getActiveSheet()->getColumnDimension($value['col'])->setWidth($value['width']);
  153.  
    //设置单元格格式为文本
  154.  
    if ($value['is_text'] == 1) {
  155.  
    $spreadsheet->getActiveSheet()->getStyle($value['col'])->getNumberFormat()->setFormatCode(NumberFormat::FORMAT_TEXT);
  156.  
    }
  157.  
    }
  158.  
    $objActSheet = $spreadsheet->getActiveSheet();
  159.  
     
  160.  
    // 输出下拉菜单
  161.  
    for ($i = 2; $i < 2000; $i ) {
  162.  
     
  163.  
    foreach ($header as $key1 => $value1) {
  164.  
    //$this->set_select_cell($objActSheet,'A','id_type',$key,$i);
  165.  
    if ($value1['id_down_type'] == 1) {
  166.  
    //单纯下拉
  167.  
    set_select_cell($objActSheet, $value1['col'], $value1['sub_table_name'], $value1['count'], $value1['title'], $i);
  168.  
    } elseif ($value1['id_down_type'] == 2) {
  169.  
    //联动下拉
  170.  
    if ($value1['col'] == 'A' || $value1['col'] == 'E' || $value1['col'] == 'AC') {
  171.  
    switch ($value1['col']) {
  172.  
    case 'E':
  173.  
    $fit_col = ['F','G'];
  174.  
    break;
  175.  
    case 'AC':
  176.  
    //这里为关联 如AC 列 关联AD AE 这个
  177.  
    $fit_col = ['AD', 'AE'];
  178.  
    break;
  179.  
    }
  180.  
    $mian_col = $value1['col'];
  181.  
    //处理联动下拉
  182.  
    set_drop_down_select_cell($objActSheet, $mian_col, $fit_col, $value1['title'], $i,$liandong_name);
  183.  
    }
  184.  
    }
  185.  
    }
  186.  
    }
  187.  
    $path = "./";
  188.  
    $subject = "导出模板".date('YmdHis');
  189.  
    $ext = ".xlsx"; //后缀
  190.  
    $export = $path . $subject . $ext;
  191.  
    $writer = new Xlsx($spreadsheet);
  192.  
    //保存文件
  193.  
    $writer->save($export);
  194.  
    //关闭连接,销毁变量
  195.  
    $spreadsheet->disconnectWorksheets();
  196.  
     
  197.  
    unset($spreadsheet);
  198.  
    var_dump($export);
  199.  
    die;
  200.  
     
  201.  
     
  202.  
    /**
  203.  
    * 创建Excel 分表
  204.  
    * @param obpe Excel 对象
  205.  
    * @param sub_table_info_arr 需要需要创建的分表二维数组 key title_name 分表表名标题 key index 分表顺序 key data 数据源 且数据源必须为 id text 键值对
  206.  
    * @param write_data 写入的数据 二维 包含 id text 两个键值
  207.  
    */
  208.  
    function create_excel_sub_table($obpe, $sub_table_info_arr)
  209.  
    {
  210.  
    if (!empty($sub_table_info_arr)) {
  211.  
    foreach ($sub_table_info_arr as $key => $value) {
  212.  
    $obpe->createSheet();
  213.  
     
  214.  
    $obpe->setActiveSheetIndex($value['index']); //设置序号
  215.  
    $obpe->getActiveSheet()->setTitle($value['title']); //设置表名
  216.  
    $obpe->getActiveSheet()->setSheetState(Worksheet::SHEETSTATE_HIDDEN); //隐藏
  217.  
     
  218.  
     
  219.  
    //密码
  220.  
    $obpe->getActiveSheet()->getProtection()->setPassword('PHPExcel');
  221.  
    $obpe->getActiveSheet()->getProtection()->setSheet(true);// This should be enabled inorder to enable any of thefollowing!
  222.  
    $obpe->getActiveSheet()->getProtection()->setSort(true);
  223.  
    $obpe->getActiveSheet()->getProtection()->setInsertRows(true);
  224.  
    $obpe->getActiveSheet()->getProtection()->setFormatCells(true);
  225.  
     
  226.  
     
  227.  
    $key = 1;
  228.  
    if (!empty($value['data'])) {
  229.  
    foreach ($value['data'] as $k => $v) {
  230.  
    $str = $v['text'] . '_' . $v['id'];
  231.  
    $obpe->getActiveSheet()->setCellValue('A' . $key, $str);
  232.  
    $key ;
  233.  
    }
  234.  
    }
  235.  
    }
  236.  
    }
  237.  
    }
  238.  
     
  239.  
    /**
  240.  
    * 生成Excel 列
  241.  
    * @param int $num 需要的列数
  242.  
    * @return array
  243.  
    */
  244.  
    function getExcelIndexRow($num=1){
  245.  
    $r = [];
  246.  
    $idx = ['idx' => 0];
  247.  
    for ($i = 0; $i < $num; $i ) {
  248.  
    $r[] = getNextIdx($idx);
  249.  
    }
  250.  
    unset($idx);
  251.  
    return $r;
  252.  
    }
  253.  
     
  254.  
     
  255.  
    function getNextIdx(&$idx) {
  256.  
    // 先转换26进制
  257.  
    $num26 = base_convert($idx['idx'], 10, 26);
  258.  
     
  259.  
    $result = '';
  260.  
    // 对每一位进行字符转换
  261.  
    for ($i = 0; $i < strlen(strval($num26)); $i ) {
  262.  
    if ($i == 0 && strlen(strval($num26)) != 1) {
  263.  
    if (is_numeric($num26[$i])) {
  264.  
    $result.= chr(ord($num26[$i]) 16);
  265.  
    } else {
  266.  
    $result.= chr(ord($num26[$i]) - 23);
  267.  
    }
  268.  
    } else {
  269.  
    if (is_numeric($num26[$i])) {
  270.  
    $result.= chr(ord($num26[$i]) 17);
  271.  
    } else {
  272.  
    $result.= chr(ord($num26[$i]) - 22);
  273.  
    }
  274.  
    }
  275.  
    }
  276.  
    $idx['idx'] = $idx['idx'] 1;
  277.  
    return $result;
  278.  
    }
  279.  
     
  280.  
    /**
  281.  
    *生成Excel 联动下拉
  282.  
    * @param obpe Excel对象句柄
  283.  
    * @param sub_table_num 分表序号
  284.  
    * @param table_name 分表名称
  285.  
    * @param data_source 需要处理的数据源
  286.  
    */
  287.  
    function create_excel_drop_down($obpe, $sub_table_num, $table_name, $data_source)
  288.  
    {
  289.  
    //***********************
  290.  
    $obpe->createSheet();
  291.  
    $obpe->setActiveSheetIndex($sub_table_num);
  292.  
    $obpe->getActiveSheet()->setTitle($table_name);
  293.  
    $obpe->getActiveSheet()->setSheetState(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet::SHEETSTATE_HIDDEN); //隐藏
  294.  
     
  295.  
    //密码
  296.  
    $obpe->getActiveSheet()->getProtection()->setPassword('PHPExcel');
  297.  
    $obpe->getActiveSheet()->getProtection()->setSheet(true);// This should be enabled inorder to enable any of thefollowing!
  298.  
    $obpe->getActiveSheet()->getProtection()->setSort(true);
  299.  
    $obpe->getActiveSheet()->getProtection()->setInsertRows(true);
  300.  
    $obpe->getActiveSheet()->getProtection()->setFormatCells(true);
  301.  
     
  302.  
    $key = 1;
  303.  
    //$col = ['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', 'BA'];
  304.  
    //这里定义1000个下拉 若超过 1000个下拉 异常输出
  305.  
    $col = getExcelIndexRow(1000);
  306.  
    $high = 0;
  307.  
     
  308.  
    //数据源格式必须按照以下格式规整 要不然数据处理出错
  309.  
    /*$re = [['name'=>'湖北省','children'=>[['name'=>"武汉市",'children' =>['江夏区','洪山区','青山区','武昌区']],['name'=>"宜昌市",'children' =>['江夏区1','洪山区1','青山区1','武昌区1']],['name'=>"荆州市",'children' =>['江夏区2','洪山区2','青山区2','武昌区2']]]],
  310.  
    ['name'=>'湖南省','children'=>[['name'=>"长沙市",'children' =>['长沙市','长沙市1','长沙市3','长沙市6']],['name'=>"岳阳市",'children' =>['岳阳市4','岳阳市3','岳阳市2','岳阳市1']],[ 'name'=>"常德市",'children' =>['常德市1','常德市2','常德市3','常德市4']]]],];*/
  311.  
    foreach ($data_source as $k => $v) {
  312.  
    $str = $v['text'];
  313.  
    $obpe->getActiveSheet()->setCellValue($col[0] . ($key $high), $str);
  314.  
    $max = 0; // 重置max
  315.  
    $secondNum = count($v['children']);
  316.  
    if (!empty($v['children'])) {
  317.  
    foreach ($v['children'] as $index => $sendcond) {
  318.  
    $obpe->getActiveSheet()->setCellValue($col[$index 1] . ($key $high), $sendcond['text']);
  319.  
    //这里需要处理 若没有
  320.  
    if (isset($sendcond['children']) && $sendcond['children']) {
  321.  
    $thirdNum = count($sendcond['children']);
  322.  
    } else {
  323.  
    $thirdNum = 0;
  324.  
    }
  325.  
     
  326.  
    if ($thirdNum > $max) {
  327.  
    $max = $thirdNum;
  328.  
    }
  329.  
    if (!empty($sendcond['children'])) {
  330.  
    foreach ($sendcond['children'] as $id => $third) {
  331.  
    //$obpe->getActiveSheet()->setCellValue($col[$index 1].($key $high $id 1),$third);
  332.  
    $obpe->getActiveSheet()->setCellValue($col[$index 1] . ($key $high $id 1), $third['text']);
  333.  
    }
  334.  
    //定义三级名称
  335.  
    $obpe->addNamedRange(
  336.  
    new NamedRange(
  337.  
    $sendcond['text'],
  338.  
    $obpe->getSheetByName($table_name),
  339.  
    $col[$index 1] . ($key $high 1) . ':' . $col[$index 1] . ($key $high 1 $thirdNum - 1)
  340.  
    )
  341.  
    );
  342.  
    }
  343.  
    }
  344.  
    //定义二级
  345.  
    $obpe->addNamedRange(
  346.  
    new NamedRange(
  347.  
    $v['text'],
  348.  
    $obpe->getSheetByName($table_name),
  349.  
    $col[1] . ($key $high) . ':' . $col[$secondNum] . ($key $high)
  350.  
    )
  351.  
    );
  352.  
    }
  353.  
     
  354.  
    $high = $max;
  355.  
    $key ;
  356.  
     
  357.  
    }
  358.  
     
  359.  
    //移花
  360.  
    foreach ($data_source as $var => $cont) {
  361.  
    $obpe->getSheetByName($table_name)->setCellValue('UI' . ($var 1), $cont['text']);
  362.  
    }
  363.  
    $total = count($data_source);
  364.  
    $n = 1;
  365.  
    $obpe->addNamedRange(
  366.  
    new NamedRange(
  367.  
    $table_name,
  368.  
    $obpe->getSheetByName($table_name),
  369.  
    "=\$UI\${$n}:\$UI\${$total}"
  370.  
    )
  371.  
    );
  372.  
    }
  373.  
     
  374.  
     
  375.  
    /**
  376.  
    *设置Excel 下拉 2020年8月4日16:02:09
  377.  
    * @param objActSheet Excel对象句柄
  378.  
    * @param col 操作的列
  379.  
    * @param table_name Excel电子薄分表下拉名称
  380.  
    */
  381.  
    function set_select_cell($objActSheet, $col = '', $table_name, $key = '', $setPromptTitle, $i = '', $setErrorTitle = '输入的值有误', $setError = '您输入的值不在下拉列表内')
  382.  
    {
  383.  
    $objValidation = $objActSheet->getCell("{$col}" . $i)->getDataValidation();
  384.  
    $objValidation->setType(DataValidation::TYPE_LIST)
  385.  
    // ->setErrorStyle(DataValidation::STYLE_INFORMATION)
  386.  
    ->setErrorStyle(DataValidation::STYLE_STOP)
  387.  
    ->setAllowBlank(true)
  388.  
    ->setShowInputMessage(true)
  389.  
    ->setShowErrorMessage(true)
  390.  
    ->setShowDropDown(true)
  391.  
    ->setErrorTitle('输入的值有误')
  392.  
    ->setError('您输入的值不在下拉列表内')
  393.  
    ->setPromptTitle("{$setPromptTitle}(在列表内选择)")
  394.  
    ->setPrompt('请从列表中选择一个值')
  395.  
    ->setFormula1($table_name . '!$A$1:$A$' . $key);
  396.  
    }
  397.  
     
  398.  
    /**
  399.  
    * 设置联动下拉的Excel 渲染 2020年8月8日20:23:39
  400.  
    * @param objActSheet Excel对象句柄
  401.  
    * @param mian_col 联动下拉第一列
  402.  
    * @param fit_col 数组 子下拉节点 setFormula1 依次为下拉第一列名 后续依次关联
  403.  
    * @param setPromptTitle 中文字段映射名称
  404.  
    */
  405.  
    function set_drop_down_select_cell($objActSheet, $main_col, $fit_col, $setPromptTitle, $i,$main_table_name='region')
  406.  
    {
  407.  
    $indirect_list_arr = $fit_col; //从主下拉节点开始计算
  408.  
    array_unshift($indirect_list_arr, $main_col);
  409.  
    //定义主表名
  410.  
     
  411.  
    //处理主下拉
  412.  
    $objValidation = $objActSheet->getCell($main_col . $i)->getDataValidation();
  413.  
    $objValidation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
  414.  
    ->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_STOP)
  415.  
    ->setAllowBlank(false)
  416.  
    ->setShowInputMessage(true)
  417.  
    ->setShowErrorMessage(true)
  418.  
    ->setShowDropDown(true)
  419.  
    ->setErrorTitle('输入的值有误')
  420.  
    ->setError('您输入的值不在下拉列表内')
  421.  
    ->setPromptTitle("{$setPromptTitle}(在列表内选择)")
  422.  
    //->setPromptTitle("type_list(在列表内选择)")
  423.  
    ->setPrompt('请从列表中选择一个值')
  424.  
    ->setFormula1("={$main_table_name}");
  425.  
    //处理分节点下拉
  426.  
    if (!empty($fit_col)) {
  427.  
    foreach ($fit_col as $key => $value) {
  428.  
    $objValidation = $objActSheet->getCell($value . $i)->getDataValidation();
  429.  
    $objValidation->setType(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::TYPE_LIST)
  430.  
    ->setErrorStyle(\PhpOffice\PhpSpreadsheet\Cell\DataValidation::STYLE_STOP)
  431.  
    ->setAllowBlank(false)
  432.  
    ->setShowInputMessage(true)
  433.  
    ->setShowErrorMessage(true)
  434.  
    ->setShowDropDown(true)
  435.  
    ->setErrorTitle('输入的值有误')
  436.  
    ->setError('您输入的值不在下拉列表内')
  437.  
    ->setPromptTitle('请选择')
  438.  
    ->setPrompt('请从列表中选择一个值')
  439.  
    ->setFormula1('=INDIRECT($' . $indirect_list_arr[$key] . $i . ')');
  440.  
    }
  441.  
    }
  442.  
    return true;
  443.  
    }
学新通

步骤三: 运行php   我这里使用命令行 

php index.php

学新通

 查看即可

就是如此简单

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfeggb
系列文章
更多 icon
同类精品
更多 icon
继续加载