0

我正在为我的一个项目使用 PHP_XLSXWriter 并遇到一个我似乎无法解决的问题;混合格式。

我需要从我的数据库表中生成一个 Excel 文件,以及一个全是文本的标题行。标题行后面的数据格式为“整数”、“数字”、“文本”。我已经有一个完美运行的脚本,可以从数据库中提取信息,然后将其写入 XLSX 文件,然后再将文件发送到用户的浏览器。该文件的顶部是以下内容:

$header = array("string","string","string");
$writer->writeSheetHeader($sheet_name, $header, $col_options = ['widths'=>[20,20,50], 'suppress_row'=>true] );

这一切都完美无缺,我的文件在 Excel 中打开。但是,我所有的数据都是 Excel 的“文本”格式;标题行和数据行。这显然是因为我声明将三列格式化为“字符串”,但如果我将该行更改为:

$header = array("integer","#0.00","string");
$writer->writeSheetHeader($sheet_name, $header, $col_options = ['widths'=>[20,20,50], 'suppress_row'=>true] );

然后,最终的 Excel 在打开文件时提醒用户注意文件中的问题,并提供修复文件。这行得通,标题都是文本,数据都是正确的格式,但从用户的角度来看,它是混乱和不专业的。

很明显,这个问题的出现是因为标题行不包含整数或数字,我试图强制格式化整个列,但是如何解决这个问题?我花了很长时间搜索帮助文件和在线论坛,但找不到任何清楚地告诉我如何在 PHP_XLSXWriter 中混合格式的内容。

有没有其他人设法解决这个问题,如果是这样,如何解决?

4

1 回答 1

0

现在已经解决了,所以我想我会更新线程以帮助遇到此问题的其他人。

总而言之,问题是在 PHP_XLSXWriter 的许多普通版本(包括我使用的那个)中,您只能为列数据类型格式(十进制、整数、字符串等)设置主标题。这行得通,但是您以后不能再设置其他数据类型格式命令。

经过进一步搜索,我在此页面上发现了一个新功能:https ://github.com/mk-j/PHP_XLSXWriter/pull/126/files 。如果该链接已关闭或无法访问,这是它的新功能:

public function updateFormat($sheet_name, array $header_types) {
    if (empty($sheet_name) || empty($header_types))
        return;
    if(empty($this->sheets[$sheet_name])) {
        $this->writeSheetHeader($sheet_name, $header_types, array('suppress_row'=>true));
        return;
    }
    $sheet = &$this->sheets[$sheet_name];
    $sheet->columns = $this->initializeColumnTypes($header_types);
    $this->current_sheet = $sheet_name;
}

该函数被添加到下载的 xlsxwriter.php 文件中,大约在第 210 行(在“initializeColumnTypes”函数和“writeSheetHeader”函数之间)。

添加后,我可以在我的页面中调用以下 PHP 代码:

$writer->updateFormat($sheet_name, array('integer','#.00','string'));

这意味着初始数据类型格式像往常一样由主标题设置,但我可以使用新函数选择性地格式化我想要的任何行上的数据类型。

希望这将帮助任何发现自己处于与我相同情况的 PHP 开发人员。

于 2020-08-07T09:04:25.320 回答