找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 264|回复: 1

[基础] excel画表头时超过Z列(26列)时计算方法

  [复制链接]
发表于 2023-2-23 09:09 | 显示全部楼层 |阅读模式
现在有这样一些要写入到excel表头的信息:

$title = [
    '序号',   '订单编号',  'SKU',  '商品名称',  '供应商ID',
    '规格',   '型号',  '进货单价',  '数量',  '金额',
    '运费',  '下单日期', '付款时间', '一级分类', '二级分类',
    '三级分类',  '供应商类型', '订单类型', '订单状态', '店铺名称',
    '店铺编码',  '进货总价', '销售单价', '销售总价', '品牌编码',
    '品牌',  '商品链接',  '市场价', '销售价/会员价', '非会员价',
    '让利金',  '市场提成比例', '毛利率', '审核状态', '上架状态',
    '支付状态',   '结算时间',  '完结时间',  '库存',  '是否含税',
    '是否包邮',   'SPU/平台货号',  '订单来源版块',
];
共有43个字段,也就是43列,远远超过Z列,会出现AA,AB,AC……等,要达到这样的效果:


$title = [
    'A' => 序号',  'B'=>'订单编号', 'C'=>'SKU', 'D' => '商品名称', 'E'=> '供应商ID',
    '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' => 'SPU/平台货号', 'AQ' => '订单来源版块',
];

请写出算法???????????

参考答案:
/**
 * 数字转字母 (类似于Excel列标)
 * @param Int $num 数字
 * @param Int $start 字母起始值
 * @return String 返回字母
 */
function intToChr($num, $start = 65) {
    $str = '';
    if (floor($num / 26) > 0) {
        $str .= intToChr(floor($num / 26)-1);
    }
    return $str . chr($num % 26 + $start);
}

当然,答案不止这一种,也有其它方法。

 楼主| 发表于 2023-2-23 11:00 | 显示全部楼层

PHPExcel计算列算法示例:

最近要做一个导出excel的习题,包括选项,由于习题的选项不定,每次试卷的习题个数不定,所以导出的excel的列要动态计算。

于是有了下面的函数:

 

     $length     = 52;//表示多少习题的选项
   $begin     = ord('A');
   $end       = $begin + $length;
   $middle     = ord('Z');
   $n        = 0;
   for($i = $begin; $i <= $end; $i++){
       $div    = intval(($i - 65) / 26);
       $pre    = chr($div+64);
       $suf    = chr($i - 26 * $div);
       $letter = ($i <= $middle) ? chr($i) : strval($pre.$suf);

       $n += 1;
       $br     = '';
       if($n == 26){
           $br = "<br>";
           $n  = 0;
       }
        echo ($div < 1 ? "<font color=white>0</font>" : '').$letter." -".$br;
   }
   exit;

 

如图:

excel-colum.jpg

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-5-18 15:41 , Processed in 0.019197 second(s), 14 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表