2019年10月11日14:05:58
从体系结构您已经知道,使用基本PhpSpreadsheet类无法对持久性存储进行读写。为此,PhpSpreadsheet提供读者和作家,这是实现PhpOfficePhpSpreadsheetReaderIReader
和 PhpOfficePhpSpreadsheetWriterIWriter
。
PhpSpreadsheet API提供了多种创建 PhpOfficePhpSpreadsheetReaderIReader
或 PhpOfficePhpSpreadsheetWriterIWriter
实例的方法:
通过直接创建PhpOfficePhpSpreadsheetIOFactory
。下面的所有示例都演示了直接创建方法。请注意,您也可以使用PhpOfficePhpSpreadsheetIOFactory
该类来执行此操作。
PhpOfficePhpSpreadsheetReaderIReader
使用创建PhpOfficePhpSpreadsheetIOFactory
有两种方法可以将文件读入PhpSpreadsheet:使用自动文件类型解析或显式。
自动文件类型解析可PhpOfficePhpSpreadsheetReaderIReader
使用PhpSpreadsheet 检查不同的 分布。如果其中之一可以加载指定的文件名,则使用该文件名加载文件PhpOfficePhpSpreadsheetReaderIReader
。显式模式要求您指定 PhpOfficePhpSpreadsheetReaderIReader
应使用的模式。
您可以使用以下代码示例在自动文件类型解析模式下创建PhpOfficePhpSpreadsheetReaderIReader
实例 PhpOfficePhpSpreadsheetIOFactory
:
$spreadsheet = PhpOfficePhpSpreadsheetIOFactory::load("05featuredemo.xlsx");
此功能的典型用法是当您需要读取用户上传的文件时,并且您不知道他们是在上传xls还是xlsx文件。
如果您需要在阅读器上设置一些属性(例如,仅读取数据,请参阅稍后的更多内容),则可以改用以下变体:
$reader = PhpOfficePhpSpreadsheetIOFactory::createReaderForFile("05featuredemo.xlsx");
$reader->setReadDataOnly(true);
$reader->load("05featuredemo.xlsx");
您可以使用以下代码示例以显式模式使用创建PhpOfficePhpSpreadsheetReaderIReader
实例 PhpOfficePhpSpreadsheetIOFactory
:
$reader = PhpOfficePhpSpreadsheetIOFactory::createReader("Xlsx");
$spreadsheet = $reader->load("05featuredemo.xlsx");
请注意,自动类型解析模式比显式模式稍慢。
PhpOfficePhpSpreadsheetWriterIWriter
使用创建PhpOfficePhpSpreadsheetIOFactory
您可以PhpOfficePhpSpreadsheetWriterIWriter
使用创建实例 PhpOfficePhpSpreadsheetIOFactory
:
$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, "Xlsx");
$writer->save("05featuredemo.xlsx");
Xlsx文件格式是PhpSpreadsheet的主要文件格式。它允许将内存电子表格输出到.xlsx文件。
您可以使用以下代码读取.xlsx文件:
$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$spreadsheet = $reader->load("05featuredemo.xlsx");
您可以在阅读器上设置选项setReadDataOnly,以指示阅读器忽略样式,数据验证等,而仅读取单元格数据:
$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("05featuredemo.xlsx");
您可以在阅读器上设置选项setLoadSheetsOnly,以指示阅读器仅加载具有给定名称的图纸:
$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]);
$spreadsheet = $reader->load("05featuredemo.xlsx");
您可以在阅读器上设置选项setReadFilter,以指示阅读器仅加载与给定规则匹配的单元格。读取过滤器可以是任何实现的类 PhpOfficePhpSpreadsheetReaderIReadFilter
。默认情况下,使用读取所有单元格PhpOfficePhpSpreadsheetReaderDefaultReadFilter
。
以下代码将仅读取Excel文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {
public function readCell($column, $row, $worksheetName = ‘‘) {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new PhpOfficePhpSpreadsheetReaderXlsx();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xlsx");
您可以使用以下代码编写.xlsx文件:
$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->save("05featuredemo.xlsx");
默认情况下,该编写器会预先计算电子表格中的所有公式。在大型电子表格上,这可能会很慢,甚至可能是不必要的。但是,您可以禁用公式预计算:
$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.xlsx");
由于Office2003兼容性包中的错误,打开Xlsx电子表格时可能会出现一些小问题(主要与公式计算有关)。您可以使用以下代码启用Office2003兼容性:
$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->setOffice2003Compatibility(true);
$writer->save("05featuredemo.xlsx");
Office2003兼容性仅应在需要时使用 Office2003兼容性选项应仅在需要时使用。此选项禁用多个Office2007文件格式选项,从而导致使用该选项时功能较低的Office2007电子表格。
Xls文件格式是旧的Excel文件格式,已在PhpSpreadsheet中实现,以提供统一的方式来创建.xlsx和.xls文件。它基本上是PEAR Spreadsheet_Excel_Writer的修改版本,尽管它已被扩展并且比旧的PEAR库具有更少的限制和更多的功能。这可以通过BIFF8读取所有使用OLE2的BIFF版本:BIFF5(由Office 95引入),但不能读取早期版本。
Xls文件格式将不再进行开发,它只是为PhpSpreadsheet提供了其他文件格式。
Excel5(BIFF)限制请注意,BIFF文件格式在样式设置单元格和通过PHP处理大型电子表格方面有一些限制。
您可以使用以下代码读取.xls文件:
$reader = new PhpOfficePhpSpreadsheetReaderXls();
$spreadsheet = $reader->load("05featuredemo.xls");
您可以在阅读器上设置选项setReadDataOnly,以指示阅读器忽略样式,数据验证等,而仅读取单元格数据:
$reader = new PhpOfficePhpSpreadsheetReaderXls();
$reader->setReadDataOnly(true);
$spreadsheet = $reader->load("05featuredemo.xls");
您可以在阅读器上设置选项setLoadSheetsOnly,以指示阅读器仅加载具有给定名称的图纸:
$reader = new PhpOfficePhpSpreadsheetReaderXls();
$reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]);
$spreadsheet = $reader->load("05featuredemo.xls");
您可以在阅读器上设置选项setReadFilter,以指示阅读器仅加载与给定规则匹配的单元格。读取过滤器可以是任何实现的类 PhpOfficePhpSpreadsheetReaderIReadFilter
。默认情况下,使用读取所有单元格PhpOfficePhpSpreadsheetReaderDefaultReadFilter
。
以下代码将仅读取Excel文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {
public function readCell($column, $row, $worksheetName = ‘‘) {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new PhpOfficePhpSpreadsheetReaderXls();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xls");
您可以使用以下代码编写.xls文件:
$writer = new PhpOfficePhpSpreadsheetWriterXls($spreadsheet);
$writer->save("05featuredemo.xls");
Excel 2003 XML文件格式是可以在较早版本的Microsoft Excel中使用的文件格式。
Excel 2003 XML限制请注意,Excel 2003 XML格式在样式设置单元格和通过PHP处理大型电子表格方面有一些限制。
您可以使用以下代码读取Excel 2003 .xml文件:
$reader = new PhpOfficePhpSpreadsheetReaderXml();
$spreadsheet = $reader->load("05featuredemo.xml");
您可以在阅读器上设置选项setReadFilter,以指示阅读器仅加载与给定规则匹配的单元格。读取过滤器可以是任何实现的类 PhpOfficePhpSpreadsheetReaderIReadFilter
。默认情况下,使用读取所有单元格PhpOfficePhpSpreadsheetReaderDefaultReadFilter
。
以下代码将仅读取Excel文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {
public function readCell($column, $row, $worksheetName = ‘‘) {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new PhpOfficePhpSpreadsheetReaderXml();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.xml");
符号链接(SYLK)是Microsoft文件格式,通常用于在应用程序(尤其是电子表格)之间交换数据。SYLK文件通常具有.slk后缀。它仅由可显示的ANSI字符组成,可以很容易地由其他应用程序(例如数据库)创建和处理。
SYLK限制请注意,SYLK文件格式在样式设置单元格和通过PHP处理大型电子表格方面有一些限制。
您可以使用以下代码读取.slk文件:
$reader = new PhpOfficePhpSpreadsheetReaderSlk();
$spreadsheet = $reader->load("05featuredemo.slk");
您可以在阅读器上设置选项setReadFilter,以指示阅读器仅加载与给定规则匹配的单元格。读取过滤器可以是任何实现的类 PhpOfficePhpSpreadsheetReaderIReadFilter
。默认情况下,使用读取所有单元格PhpOfficePhpSpreadsheetReaderDefaultReadFilter
。
以下代码将仅读取SYLK文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {
public function readCell($column, $row, $worksheetName = ‘‘) {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new PhpOfficePhpSpreadsheetReaderSlk();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.slk");
Open Office或Libre Office .ods文件是Open Office或Libre Office Calc文件的标准文件格式。
您可以使用以下代码读取.ods文件:
$reader = new PhpOfficePhpSpreadsheetReaderOds();
$spreadsheet = $reader->load("05featuredemo.ods");
您可以在阅读器上设置选项setReadFilter,以指示阅读器仅加载与给定规则匹配的单元格。读取过滤器可以是任何实现的类 PhpOfficePhpSpreadsheetReaderIReadFilter
。默认情况下,使用读取所有单元格PhpOfficePhpSpreadsheetReaderDefaultReadFilter
。
以下代码将仅读取Calc文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements PhpOfficePhpSpreadsheetReaderIReadFilter {
public function readCell($column, $row, $worksheetName = ‘‘) {
// Read title row and rows 20 - 30
if ($row == 1 || ($row >= 20 && $row <= 30)) {
return true;
}
return false;
}
}
$reader = new PhpOfficePhpSpreadsheetReaderOds();
$reader->setReadFilter( new MyReadFilter() );
$spreadsheet = $reader->load("06largescale.ods");
CSV(逗号分隔值)通常与其他系统一起用作导入/导出文件格式。PhpSpreadsheet允许读取和写入CSV文件。
CSV限制请注意,CSV文件格式在样式单元格,数字格式等方面有一些限制。
您可以使用以下代码读取.csv文件:
$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$spreadsheet = $reader->load("sample.csv");
CSV文件通常不是真正的“逗号分隔”,或使用分号(;
)作为分隔符。您可以PhpOfficePhpSpreadsheetReaderCsv
在读取CSV文件之前指示 一些选项。
分隔符将被自动检测,因此在大多数情况下,无需指定分隔符。但是,如果自动检测不适合用例,则可以手动设置。
请注意,PhpOfficePhpSpreadsheetReaderCsv
默认情况下假定加载的CSV文件是UTF-8编码的。如果要读取在Microsoft Office Excel中创建的CSV文件,则正确的输入编码可能是Windows-1252(CP1252)。始终确保正确设置了输入编码。
$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$reader->setInputEncoding(‘CP1252‘);
$reader->setDelimiter(‘;‘);
$reader->setEnclosure(‘‘);
$reader->setSheetIndex(0);
$spreadsheet = $reader->load("sample.csv");
CSV文件只能包含一个工作表。因此,您可以指定要从CSV中读取的工作表:
$reader->setSheetIndex(0);
使用CSV文件时,可能会出现要将CSV数据导入到现有Spreadsheet
对象中的情况。以下代码将CSV文件加载到$spreadsheet
包含某些工作表的现有文件中,并导入到第6个工作表中:
$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$reader->setDelimiter(‘;‘);
$reader->setEnclosure(‘‘);
$reader->setSheetIndex(5);
$reader->loadIntoExisting("05featuredemo.csv", $spreadsheet);
您可以使用以下代码编写.csv文件:
$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->save("05featuredemo.csv");
CSV文件通常不是真正的“逗号分隔”,或使用分号(;
)作为分隔符。您可以PhpOfficePhpSpreadsheetWriterCsv
在编写CSV文件之前指示 一些选项:
$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setDelimiter(‘;‘);
$writer->setEnclosure(‘‘);
$writer->setLineEnding("rn");
$writer->setSheetIndex(0);
$writer->save("05featuredemo.csv");
CSV文件只能包含一个工作表。因此,您可以指定要写入CSV的工作表:
$writer->setSheetIndex(0);
默认情况下,该编写器会预先计算电子表格中的所有公式。在大型电子表格上,这可能会很慢,甚至可能是不必要的。但是,您可以禁用公式预计算:
$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.csv");
通过编写BOM表文件头,可以将CSV文件标记为UTF-8。可以使用以下代码启用此功能:
$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->setUseBOM(true);
$writer->save("05featuredemo.csv");
如果要导出的工作表包含带小数或千位分隔符的数字,则在进行导出之前,应考虑要对那些字符使用哪些字符。
默认情况下,PhpSpreadsheet在服务器的区域设置中查找以决定要使用的字符。但是为避免出现问题,建议如下所示显式设置字符。
英文用户将要在导出之前使用它:
PhpOfficePhpSpreadsheetSharedStringHelper::setDecimalSeparator(‘.‘);
PhpOfficePhpSpreadsheetSharedStringHelper::setThousandsSeparator(‘,‘);
德国用户将要使用相反的值。
PhpOfficePhpSpreadsheetSharedStringHelper::setDecimalSeparator(‘,‘);
PhpOfficePhpSpreadsheetSharedStringHelper::setThousandsSeparator(‘.‘);
请注意,上面的代码将小数和千位分隔符设置为全局选项。这也会影响HTML和PDF的导出方式。
PhpSpreadsheet允许您以HTML格式读取或写入电子表格,以便向PC上没有电子表格应用程序的任何人快速表示其中的数据,或加载由其他脚本保存的文件,这些脚本只是创建HTML标记并为其提供.xls文件扩展。
HTML限制请注意,HTML文件格式在样式单元格,数字格式等方面有一些限制。
您可以使用以下代码读取.html或.htm文件:
$reader = new PhpOfficePhpSpreadsheetReaderHtml();
$spreadsheet = $reader->load("05featuredemo.html");
HTML限制请注意,HTML阅读器仍处于试验阶段,尚不支持干净的合并单元格或嵌套表
请注意,PhpOfficePhpSpreadsheetWriterHtml
默认情况下仅输出第一个工作表。
您可以使用以下代码编写.htm文件:
$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$writer->save("05featuredemo.htm");
HTML文件可以包含一个或多个工作表。如果要将所有工作表都写到一个HTML文件中,请使用以下代码:
$writer->writeAllSheets();
HTML文件可以包含一个或多个工作表。因此,您可以指定要写入HTML的工作表:
$writer->setSheetIndex(0);
在某些情况下,您需要显式设置所包含映像的根目录。例如,代替:
html <img src="./images/logo.jpg">
您可能想看看:
<img src="http://www.domain.com/images/logo.jpg">
您可以使用以下代码来实现此结果:
$writer->setImagesRoot(‘http://www.example.com‘);
默认情况下,该编写器会预先计算电子表格中的所有公式。在大型电子表格上,这可能会很慢,甚至可能是不必要的。但是,您可以禁用公式预计算:
$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.htm");
在某些情况下,您可能希望将生成的HTML嵌入到现有网站中。 PhpOffice PhpSpreadsheet Writer Html支持仅生成HTML代码的特定部分,从而使您可以在网站中使用这些部分。
支持的方法:
generateHTMLHeader()
generateStyles()
generateSheetData()
generateHTMLFooter()
这是一个示例,该示例独立地检索所有部分并将它们合并到结果HTML页面中:
<?php
$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
echo $writer->generateHTMLHeader();
?>
<style>
<#gth#
html {
font-family: Times New Roman;
font-size: 9pt;
background-color: white;
}
<?php
echo $writer->generateStyles(false); // do not write <style> and </style>
?>
-->
</style>
<?php
echo $writer->generateSheetData();
echo $writer->generateHTMLFooter();
?>
通过编写BOM表文件头,可以将HTML文件标记为UTF-8。可以使用以下代码启用此功能:
$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$writer->setUseBOM(true);
$writer->save("05featuredemo.htm");
请参阅“ PhpOfficePhpSpreadsheetWriterCsv
如何控制它们的外观”部分。
PhpSpreadsheet允许您将电子表格写入PDF格式,以快速分发表示的数据。
PDF限制请注意,PDF文件格式在样式单元格,数字格式等方面有一些限制。
PhpSpreadsheet的PDF Writer是第三方PDF渲染库(如TCPDF,mPDF或Dompdf)的包装。现在,您必须自己安装PDF渲染库。但PhpSpreadsheet可以与许多不同的库一起使用。
当前,支持以下库:
图书馆 | 可从下载 | PhpSpreadsheet作家 |
---|---|---|
技术合作伙伴 | https://github.com/tecnickcom/tcpdf | pdf文件 |
PDF文件 | https://github.com/mpdf/mpdf | pdf文件 |
Dompdf | https://github.com/dompdf/dompdf | Dompdf |
不同的库具有不同的优点和缺点。有些生成比其他格式更好的格式输出,有些比其他格式更快或使用更少的内存,而有些生成较小的.pdf文件。他们希望根据自己的情况使用的是开发人员的选择。
您可以使用其特定名称实例化writer,如下所示:
$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, ‘Mpdf‘);
或者,您可以使用更通用的名称注册正在使用的编写器,因此您不必记住选择的是哪个库,而只需要编写PDF文件即可:
$class = PhpOfficePhpSpreadsheetWriterPdfMpdf::class;
PhpOfficePhpSpreadsheetIOFactory::registerWriter(‘Pdf‘, $class);
$writer = PhpOfficePhpSpreadsheetIOFactory::createWriter($spreadsheet, ‘Pdf‘);
或者,您可以像这样直接实例化您选择的作者:
$writer = PhpOfficePhpSpreadsheetWriterPdfMpd
参与评论
手机查看
返回顶部