我需要将数据从 php(从 mysql 数据库检索的数据)导出到 excel。我正在使用 Zend 框架。在导出到 Excel 之前,我需要对我的数据进行一些更改。实际上,我真正需要的是生成每月现金簿。
我已经阅读了很多文件,但最终一团糟。我真的不明白我应该如何开始。我真的需要梨吗?我需要下载任何类库吗?难道没有一种简单的方法可以做到这一点吗?
提前致谢
我需要将数据从 php(从 mysql 数据库检索的数据)导出到 excel。我正在使用 Zend 框架。在导出到 Excel 之前,我需要对我的数据进行一些更改。实际上,我真正需要的是生成每月现金簿。
我已经阅读了很多文件,但最终一团糟。我真的不明白我应该如何开始。我真的需要梨吗?我需要下载任何类库吗?难道没有一种简单的方法可以做到这一点吗?
提前致谢
我建议你使用很棒的PHPExcel
图书馆。它真的很强大,支持多种格式,可以进行可视化格式化并且易于使用。
你可以在他们的网页上找到更多关于它的信息:
http://phpexcel.codeplex.com/.(PHPExcel
已移至https://github.com/PHPOffice/PHPExcel)
PHPExcel
现在已被PhpSpreadsheet GitHub取代
。
使用示例:
$objPHPExcel = new PHPExcel();
/** You can set many properties */
$objPHPExcel->getProperties()->setCreator("My company")
->setLastModifiedBy("John Doe")
->setTitle("Annual report")
->setSubject("Sales")
->setDescription("Annual sales report by John Doe")
->setCategory("Finance");
/** Choose one of sheets */
$activeSheet = $objPHPExcel->setActiveSheetIndex(0);
/** Simply set value of cell */
$activeSheet->setCellValue("A1", 'plural');
当然,您可以做更多事情,阅读 excel 文件、设置视觉样式、创建绘图、表达式等等。
我写了一份 94 行的库存差异报告,其中我从 MySQL 中获取数据(每个表 6k+ 条记录),从从多个表中提取的 MySQL 数据创建一个多维数组,然后将所有内容转储到一个字符串中,从而生成一个 .xls:
<?php
////////////////////////////////// BEGIN SETUP
$filename ="document_name.xls";
header('Content-type: application/ms-excel');
header('Content-Disposition: attachment; filename='.$filename);
////////////////////////////////// END SETUP
////////////////////////////////// BEGIN GATHER
// Your MySQL queries, fopens, et cetera go here.
// Cells are delimited by \t
// \n is just like you might expect; new line/row below
// E.G:
$stuff="PART\tQTY\tVALUE\t\n";
$stuff=$stuff."01-001-0001\t37\t28.76\t\n";
$stuff=$stuff."01-001-0002\t6\t347.06\t\n";
$stuff=$stuff."01-001-0003\t12\t7.11\t\n";
////////////////////////////////// END GATHER
// The point is to get all of your data into one string and then:
////////////////////////////////// BEGIN DUMP
echo $stuff;
////////////////////////////////// END DUMP
?>
无需扩展。
唯一需要注意的是,我还没有弄清楚如何在没有 Excel 告诉我数据可能已损坏的情况下吐出 .xls - 而且我没有尝试进行任何格式化或任何比简单地“导出”数据更复杂的事情. 当然,文件/数据很好,但它确实会从 Excel 生成警告。
编辑:我应该注意“设置”和“转储”来自以下内容:daniweb.com
您可以使用 CSV 为 excel 创建可导入格式。这是最简单的方法。
CSV 看起来像这样:
"my first cellcontent", "my second cell content", "my third cell content"
"second line, first cell content", "etc", "etc
每行代表一个 Excel 行,您将单元格内容放在双引号之间,并用逗号分隔。请注意,\r\n
如果您的数据中有一些内容,它可能会破坏您的 CSV 并创建不需要的新行。
用一点谷歌你会发现这个:http ://www.the-art-of-web.com/php/dataexport/
准备数据
$data = array(
array( "firstname" => "Mary", "lastname" => "Johnson", "age" => 25 ),
array( "firstname" => "Amanda", "lastname" => "Miller", "age" => 18 ),
array( "firstname" => "James", "lastname" => "Brown", "age" => 31 ),
array( "firstname" => "Patricia", "lastname" => "Williams", "age" => 7 ),
array( "firstname" => "Michael", "lastname" => "Davis", "age" => 43 ),
array( "firstname" => "Sarah", "lastname" => "Miller", "age" => 24 ),
array( "firstname" => "Patrick", "lastname" => "Miller", "age" => 27 )
);
第一步是以制表符分隔的格式输出数据(也可以使用 CSV,但稍微复杂一些)。为此,我们使用以下代码:
<?php
header("Content-Type: text/plain");
$flag = false;
foreach( $data as $row ) {
if( !$flag ) {
// display field/column names as first row
echo implode( "\t", array_keys( $row ) ) . "\r\n";
$flag = true;
}
echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;
?>
我们将内容类型设置为 text/plain,以便可以更轻松地在浏览器中查看输出。否则,由于没有 HTML 格式,输出将显示为单行文本。
输出的第一行将是列标题(在这种情况下使用字段名称)。值用制表符 \t 分隔,行用换行符 \n 分隔。输出应如下所示:
firstname lastname age
Mary Johnson 25
Amanda Miller 18
James Brown 31
Patricia Williams 7
Michael Davis 43
Sarah Miller 24
Patrick Miller 27
这段代码中已经存在一个可能不会立即明显的弱点。如果要输出的字段之一已经包含一个或多个制表符,或者更糟的是一个换行符怎么办?由于我们依靠这些字符来指示列和换行符,这将把整个过程抛在脑后。
解决方案是“转义”制表符。在这种情况下,我们将用文字 \t 替换制表符,用文字 \n 替换换行符,这样它们就不会影响格式:
<?php
function cleanData( &$str ) {
$str = preg_replace( "/\t/", "\\t", $str );
$str = preg_replace("/\r?\n/", "\\n", $str);
}
header("Content-Type: text/plain");
$flag = false;
foreach( $data as $row ) {
if( !$flag ) {
// display field/column names as first row
echo implode( "\t", array_keys( $row ) ) . "\r\n";
$flag = true;
}
array_walk( $row, 'cleanData' );
echo implode( "\t", array_values( $row ) ) . "\r\n";
}
exit;
?>
现在,在回显每一行之前,任何制表符都被替换为“\t”,这样我们的列就不会被打断。此外,数据中的任何换行符都将替换为“\n”。