如何在Laravel中实现类似Excel列的sire code增量(A-Z后续AA、AB)
Laravel实现Excel式列名增量(A→Z→AA→AB...)的修改方案
原有代码仅支持单个字母的增量(A-Z),要实现类似Excel列名的多字符增量,需要替换字符与数字的转换逻辑——本质是实现无0的26进制转换(A对应1,Z对应26,AA对应27)。
第一步:添加核心转换函数
在你的控制器中添加两个私有辅助函数,用于处理字母串和数字的互转:
/** * 将Excel式字母串转换为数字(A=1, Z=26, AA=27) */ private function stringToNumber(string $str): int { $number = 0; $length = strlen($str); for ($i = 0; $i < $length; $i++) { $number = $number * 26 + (ord(strtoupper($str[$i])) - 64); } return $number; } /** * 将数字转换为Excel式字母串(1=A, 26=Z, 27=AA) */ private function numberToString(int $number): string { $str = ''; while ($number > 0) { $remainder = $number % 26; if ($remainder == 0) { $remainder = 26; $number = ($number / 26) - 1; } else { $number = intval($number / 26); } $str = chr($remainder + 64) . $str; } return $str; }
第二步:替换原有增量逻辑
把原来代码中处理sire_code增量的部分替换成以下逻辑:
// Retrieve the list of all breeders in descending order based on their breeder codes $breeder_sires = BreederSire::orderBy('sire_code', 'desc')->get(); if ($breeder_sires->count() > 0) { // Extract the last sire code from the list $last_sire_code = $breeder_sires->first()->sire_code; // 转换为数字并增量 $last_sire_code_numeric = $this->stringToNumber($last_sire_code); $new_sire_code_numeric = $last_sire_code_numeric + 1; // 转换回Excel式字母串 $new_sire_code = $this->numberToString($new_sire_code_numeric); $breeder_sire->sire_code = $new_sire_code; } else { // 初始值设为'A' $new_sire_code = 'A'; $breeder_sire->sire_code = $new_sire_code; } // 后续代码保持不变 $new_breeder_code = $breeder_sire->sire_code . $supplier_code . $blood_line; $breeder_sire->breeder_code = $new_breeder_code; $breeder_sire->date_of_birth = $request->input('date_of_birth'); $breeder_sire->initial_weight = $request->input('initial_weight'); $breeder_sire->blood_line = $blood_line; $breeder_sire->save();
关键说明
- 替换后代码可以处理从A→Z→AA→AB→...→AZ→BA→...→ZZ→AAA的完整增量逻辑
stringToNumber通过逐位计算实现字母到数字的转换,比如AA = 1*26 + 1 = 27numberToString处理无0的26进制转换,避免出现类似"0"对应的字符,确保Z之后直接生成AA
内容的提问来源于stack exchange,提问作者kyllyg
相关产品推荐
相关产品推荐

