我正在写excel& amp;有一个动态的列数,即我不知道在运行查询之前需要多少列,所以我需要动态分配列号,如下所示:
$objPHPExcel->setActiveSheetIndex(0)
->setCellValue('A1', 'value')
->setCellValue('A2', 'value')
->setCellValue('B2', 'value')
->setCellValue('C2', 'value')
//...etc...
->setCellValue('AA2', 'value')
->setCellValue('AB2', 'value')
->setCellValue('AC2', 'value')
//...etc...
我怎么能用PHP做到这一点?
更新
抱歉,列命名模式为:A,B,C,.. AA,AB,AC ...... BA,BB,BC ......等,数字后缀实际上是行。并且不,'值实际上将从某些查询数据设置填充,我的值看起来更像:
$i=1;
while($result= $query->fetch_assoc()){
->setCellValue($col.$i, $result['whatever'])
$i++;
}
我只是不知道如何让列字母在该模式中递增。
答案 0 :(得分:1)
优化功能
function columnFromIndex($number){
if($number === 0)
return "A";
$name='';
while($number>0){
$name=chr(65+$number%26).$name;
$number=intval($number/26)-1;
if($number === 0){
$name="A".$name;
break;
}
}
return $name;
}
答案 1 :(得分:0)
如果你不知道你将提前使用多少列/行,你怎么能期望以这种方式使用流畅的界面?
在您编辑问题后,您可能会执行以下操作:
$i = 1;
while($result = $query->fetch_assoc()){
$col = 'A';
foreach($result as $value) {
$objPHPExcel->getActiveSheet()->setCellValue($col++.$i, $value);
}
$i++;
}
但是,您可以考虑采用其他方法,并使用fromArray()
方法填充数据
$i = 1;
while($result = $query->fetch_assoc()){
$objPHPExcel->getActiveSheet()->fromArray('A'.$i++, $result);
}
答案 2 :(得分:0)
可能太晚了,我不知道是否有更好的解决方案,但是,我使用此递归函数来解决此问题
private function getLastColumn($last){ //last represent how mouch X axis spaces
//you want to jump
$max = 26; //Max characters (in number) that you cant jump, ('z´)
$inicial = 'A';
$col = '';
if ($last > $max) //if last is bigger than last you should recall the function
{
$last = $last - $max; //discount the max to the last
$letterAscii = ord($inicial); //tansform the charcter to to number
$letterAscii += ($last - 1); // add last -1(-1 to stay in A to keep the
//base 1)
$col = chr($letterAscii); // int to ascci
$col = $col.$this->getLastColumn($last); // recall the funcion and concat
//the result
}else{
$letterAscii = ord($inicial); // same as adove
$letterAscii += ($last - 1);
$col = chr($letterAscii); //only pass the result to col
}
return $col; //return coll
}
如果需要正确的27个空格,则会得到'AA'
如果有更好的解决方案请告诉我:)
答案 3 :(得分:0)
最简单的答案是
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
echo Coordinate::stringFromColumnIndex(5) // return E
echo Coordinate::columnIndexFromString('AA') // returns 27
答案 4 :(得分:0)
我认为为时已晚,但对于我的片段 我做了这个功能,
function number_to_column($num) {
$column_name = array();
for($i=0;$i<=$num;$i++) {
$numeric = $i % 26;
$letter = chr(65 + $numeric);
$num2 = intval($num / 26);
if ($num2 > 0) {
if($i<26) {
$v_column = $letter;
}
if($i>25 && $i<52) {
$v_column = 'A'.$letter;
}
if($i>51) {
$v_column = 'B'.$letter;
}
$column_name[] = $v_column;
} else {
$v_column = $letter;
$column_name[] = $v_column;
}
}
return $column_name;
}
那么我们就可以这样使用了
$column_name = number_to_column(count($array[0])-1);
$column_name 将产生 excel 行名称,