0

我在使用 phpExcel 时遇到问题。我的任务是生成一个包含相当复杂公式的报告。该公式包括一些连接的字符串,但 phpExcel 似乎不喜欢那样。生成的文件显示了公式的一部分,在连接点之一处进行切割。当公式显示为普通字符串时,我删除了 = 符号以查看 phpExcel,它做得很好。我可以手动将 = 符号重新输入,公式按预期工作。

我拼凑了一个测试文件来演示发生了什么。我附上了一张图片,显示了这个脚本输出的内容。正如我们所看到的,W 和 X 列中的公式在其中一个连接上被截断。

require_once('/PHPExcel1.8.0/PHPExcel.php');

$Excel = new PHPExcel();

// Set file properties
$Excel->getProperties()->setCreator('Spreadsheet Author');
$worksheet = $Excel->getActiveSheet();

// Change the name of the first worksheet
$worksheet->setTitle('Report');
$Excel->createSheet(1);

// Set the header rows
$worksheet
->setCellValue('A1', 'Report Title')
->setCellValue('A3', 'Header 1')->setCellValue('B3', 'Header 2')->setCellValue('C3', 'Header 3')->setCellValue('D3', 'Header 4')
->setCellValue('E3', 'Header 5')->setCellValue('F3', 'Header 6')->setCellValue('G3', 'Header 7')->setCellValue('H3', 'Header 8')
->setCellValue('I3', 'Header 9')->setCellValue('J3', 'Header 10')->setCellValue('K3', 'Header 11')->setCellValue('L3', 'Header 12')
->setCellValue('M3', 'Header 13')->setCellValue('N3', 'Header 14')->setCellValue('O3', 'Header 15')->setCellValue('P3', 'Header 16')
->setCellValue('Q3', 'Header 17')->setCellValue('R3', 'Header 18')->setCellValue('S3', 'Header 19')->setCellValue('T3', 'Header 20')
->setCellValue('U3', 'Header 21')
->setCellValue('V3', 'Header 22')
->setCellValue('W3', 'Formula 2 (95% CI)')
->setCellValue('X3', 'Formula 2 (95% CI)');

// Switch pages
$Excel->setActiveSheetIndex(1);
$worksheet = $Excel->getActiveSheet();
$worksheet->setTitle('f'); // Make a separate sheet called "f"

$worksheet
->setCellValue('A1', 'n')->setCellValue('B1', 'p')->setCellValue('C1', 'e')
->setCellValue('D1', 'n')->setCellValue('E1', 'p')->setCellValue('F1', 'e');

// Switch back
$Excel->setActiveSheetIndex(0);
$worksheet = $Excel->getActiveSheet();


/*
* Populate the data in the spreadsheet
***************************************/

$data = array(
    array('String', 'Name', 1427312154, 2, 7, 0, 2, 1, 0, 0, 0, 2, 1, 0),
    array('String', 'Name', 1427312154, 25, 148, 0, 85, 0, 0, 0, 53, 99, 15, 0)
);

if (count($data) == 0)
{
    echo 'No rows to report';
    exit;
}
else
{
    // Conversion arrays
    $row = 4;

    for ($i = 0; $i < count($data); $i++)
    {
        $worksheet
        ->setCellValue('A' . $row, $data[$i][0])->setCellValue('B' . $row, $data[$i][1])->setCellValue('C' . $row, date('m/j/Y', $data[2]))
        ->setCellValue('D' . $row, $data[$i][3])->setCellValue('E' . $row, $data[$i][4])->setCellValue('F' . $row, $data[$i][5])
        ->setCellValue('G' . $row, $data[$i][6])->setCellValue('H' . $row, $data[$i][7])->setCellValue('I' . $row, $data[$i][8])
        ->setCellValue('J' . $row, $data[$i][9])->setCellValue('K' . $row, $data[$i][10])->setCellValue('L' . $row, '=SUM(H' . $row . ':K' . $row . ')')
        ->setCellValue('M' . $row, $data[$i][11])->setCellValue('N' . $row, $data[$i][12])->setCellValue('O' . $row, $data[$i][13])
        ->setCellValue('P' . $row, '=SUM(L' . $row . ':O' . $row . ')')
        ->setCellValue('Q' . $row, '=ROUND(F' . $row . '/E' . $row . ',1)')
        ->setCellValue('R' . $row, '=ROUND(G' . $row . '/E' . $row . ',1)')
        ->setCellValue('S' . $row, '=ROUND(P' . $row . '/E' . $row . ',1)')
        ->setCellValue('T' . $row, '=ROUND(L' . $row . '/E' . $row . ',1)')
        ->setCellValue('U' . $row, '=ROUND(I' . $row . '/E' . $row . ',2)')
        ->setCellValue('V' . $row, '=ROUND(J' . $row . '/E' . $row . ',3)')
        // THIS IS THE TROUBLE SPOT!!!
        ->setCellValue('W' . $row, '="1:"&ROUND(M' . $row . '/L' . $row . ',1)&", (1:"&ROUND((M' . $row . '/L' . $row . ')-f!B' . $row . ',1)&" to 1: "&ROUND((M' . $row . '/L' . $row . ')+f!B' . $row . ',1)&")"')
        // THIS ONE TOO[![enter image description here][1]][1]!!!
        ->setCellValue('X' . $row, '=ROUND(N' . $row . '/M' . $row . '*100,1)&"%"&" ("&ROUND(((f!E' . $row . '-f!F' . $row . ')*f!D' . $row . ')/(f!D' . $row . '-((f!E' . $row . '-f!F' . $row . ')*f!D' . $row . '))*100,1)&"%"&" to "&ROUND(((f!E' . $row . '+f!F' . $row . ')*f!D' . $row . ')/(f!D' . $row . '-((f!E' . $row . '+f!F' . $row . ')*f!D' . $row . '))*100,1)&"%)"');

        // Switch pages
        $Excel->setActiveSheetIndex(1);
        $worksheet = $Excel->getActiveSheet();

        $worksheet
        ->setCellValue('A' . $row, '=Report!G' . $row . '+Report!H' . $row)
        ->setCellValue('B' . $row, '=Report!G' . $row . '/A' . $row)
        ->setCellValue('C' . $row, '=1.96*SQRT(((B' . $row . '*(1-B' . $row . '))/A' . $row . '))')
        ->setCellValue('D' . $row, '=Report!G' . $row . '+Report!H' . $row)
        ->setCellValue('E' . $row, '=Report!I' . $row . '/B' . $row)
        ->setCellValue('F' . $row, '=1.96*SQRT((B' . $row . '*(1-B' . $row . '))/B' . $row . ')');

        // Switch pages
        $Excel->setActiveSheetIndex(0);
        $worksheet = $Excel->getActiveSheet();

        $row++;
    }
}

// Put the active cell on A1
$worksheet->setSelectedCell('A1');


/*
* Close and output file
************************/

// Force download
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="report.xls"');
header('Cache-Control: max-age=0');

// Select the rendering engine and save XLS file
$saveExcel = PHPExcel_IOFactory::createWriter($Excel, 'Excel5');
$saveExcel->setPreCalculateFormulas(false);
$saveExcel->save('php://output');

在此处输入图像描述

更新 我换掉了 CONCATENATE 函数的速记连接,看看我是否能得到更好的结果。

->setCellValue('W' . $row, '=CONCATENATE("1:",ROUND(M' . $row . '/L' . $row . ',1),", [1:",ROUND((M' . $row . '/L' . $row . ')-f!B' . $row . ',1)," to 1: ",ROUND((M' . $row . '/L' . $row . ')+f!B' . $row . ',1),"]")')
->setCellValue('X' . $row, '=CONCATENATE(ROUND(N' . $row . '/M' . $row . '*100,1),"%"," [",ROUND(((f!E' . $row . '-f!F' . $row . ')*f!D' . $row . ')/(f!D' . $row . '-((f!E' . $row . '-f!F' . $row . ')*f!D' . $row . '))*100,1),"% to ",ROUND(((f!E' . $row . '+f!F' . $row . ')*f!D' . $row . ')/(f!D' . $row . '-((f!E' . $row . '+f!F' . $row . ')*f!D' . $row . '))*100,1),"%]")');

这完全产生了一个不同的问题。异常细胞里面什么都没有。没有任何形式的公式或输出。所以我开始从 concat 中分割参数,看看是否有任何一个引起了问题。原来是最后一个参数——文字“)”字符。如果我删除了这部分 concat 或将这个角色换成其他任何东西,一切都会完美无缺。出于某种原因,当 concat 的最后一段包含“)”符号时,phpExcel 讨厌它。我没有进一步解决这个荒谬的问题,而是将括号换成了括号。如果我能找到解决方案,我会将电子表格恢复原样。

4

0 回答 0