Erlo

phpspreadsheet 中文文档(六)读写文件+读取文件

2019-10-11 16:04:25 发布   1117 浏览  
页面报错/反馈
收藏 点赞

2019年10月11日14:05:58

 

读写文件

体系结构您已经知道,使用基本PhpSpreadsheet类无法对持久性存储进行读写。为此,PhpSpreadsheet提供读者和作家,这是实现PhpOfficePhpSpreadsheetReaderIReader和 PhpOfficePhpSpreadsheetWriterIWriter

PhpOffice PhpSpreadsheet IOFactory

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");

Excel 2007(SpreadsheetML)文件格式

Xlsx文件格式是PhpSpreadsheet的主要文件格式。它允许将内存电子表格输出到.xlsx文件。

PhpOffice PhpSpreadsheet Reader 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");

PhpOffice PhpSpreadsheet Writer Xlsx

编写电子表格

您可以使用以下代码编写.xlsx文件:

$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->save("05featuredemo.xlsx");

公式预计算

默认情况下,该编写器会预先计算电子表格中的所有公式。在大型电子表格上,这可能会很慢,甚至可能是不必要的。但是,您可以禁用公式预计算:

$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->setPreCalculateFormulas(false);
$writer->save("05featuredemo.xlsx");

Office 2003兼容性包

由于Office2003兼容性包中的错误,打开Xlsx电子表格时可能会出现一些小问题(主要与公式计算有关)。您可以使用以下代码启用Office2003兼容性:

$writer = new PhpOfficePhpSpreadsheetWriterXlsx($spreadsheet);
$writer->setOffice2003Compatibility(true);
$writer->save("05featuredemo.xlsx");

Office2003兼容性仅应在需要时使用 Office2003兼容性选项应仅在需要时使用。此选项禁用多个Office2007文件格式选项,从而导致使用该选项时功能较低的Office2007电子表格。

Excel 5(BIFF)文件格式

Xls文件格式是旧的Excel文件格式,已在PhpSpreadsheet中实现,以提供统一的方式来创建.xlsx和.xls文件。它基本上是PEAR Spreadsheet_Excel_Writer的修改版本,尽管它已被扩展并且比旧的PEAR库具有更少的限制和更多的功能。这可以通过BIFF8读取所有使用OLE2的BIFF版本:BIFF5(由Office 95引入),但不能读取早期版本。

Xls文件格式将不再进行开发,它只是为PhpSpreadsheet提供了其他文件格式。

Excel5(BIFF)限制请注意,BIFF文件格式在样式设置单元格和通过PHP处理大型电子表格方面有一些限制。

PhpOffice PhpSpreadsheet Reader Xls

阅读电子表格

您可以使用以下代码读取.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");

PhpOffice PhpSpreadsheet Writer Xls

编写电子表格

您可以使用以下代码编写.xls文件:

$writer = new PhpOfficePhpSpreadsheetWriterXls($spreadsheet);
$writer->save("05featuredemo.xls");

Excel 2003 XML文件格式

Excel 2003 XML文件格式是可以在较早版本的Microsoft Excel中使用的文件格式。

Excel 2003 XML限制请注意,Excel 2003 XML格式在样式设置单元格和通过PHP处理大型电子表格方面有一些限制。

PhpOffice PhpSpreadsheet Reader Xml

阅读电子表格

您可以使用以下代码读取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处理大型电子表格方面有一些限制。

PhpOffice PhpSpreadsheet Reader Slk

阅读电子表格

您可以使用以下代码读取.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");

开放/自由办公室(.ods)

Open Office或Libre Office .ods文件是Open Office或Libre Office Calc文件的标准文件格式。

PhpOffice PhpSpreadsheet Reader Ods

阅读电子表格

您可以使用以下代码读取.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(逗号分隔值)

CSV(逗号分隔值)通常与其他系统一起用作导入/导出文件格式。PhpSpreadsheet允许读取和写入CSV文件。

CSV限制请注意,CSV文件格式在样式单元格,数字格式等方面有一些限制。

PhpOffice PhpSpreadsheet Reader Csv

读取CSV文件

您可以使用以下代码读取.csv文件:

$reader = new PhpOfficePhpSpreadsheetReaderCsv();
$spreadsheet = $reader->load("sample.csv");

设置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);

PhpOffice PhpSpreadsheet Writer Csv

编写CSV文件

您可以使用以下代码编写.csv文件:

$writer = new PhpOfficePhpSpreadsheetWriterCsv($spreadsheet);
$writer->save("05featuredemo.csv");

设置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");

写入UTF-8 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的导出方式。

的HTML

PhpSpreadsheet允许您以HTML格式读取或写入电子表格,以便向PC上没有电子表格应用程序的任何人快速表示其中的数据,或加载由其他脚本保存的文件,这些脚本只是创建HTML标记并为其提供.xls文件扩展。

HTML限制请注意,HTML文件格式在样式单元格,数字格式等方面有一些限制。

PhpOffice PhpSpreadsheet Reader HTML

阅读电子表格

您可以使用以下代码读取.html或.htm文件:

$reader = new PhpOfficePhpSpreadsheetReaderHtml();

$spreadsheet = $reader->load("05featuredemo.html");

HTML限制请注意,HTML阅读器仍处于试验阶段,尚不支持干净的合并单元格或嵌套表

PhpOffice PhpSpreadsheet Writer Html

请注意,PhpOfficePhpSpreadsheetWriterHtml默认情况下仅输出第一个工作表。

编写电子表格

您可以使用以下代码编写.htm文件:

$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);

$writer->save("05featuredemo.htm");

编写所有工作表

HTML文件可以包含一个或多个工作表。如果要将所有工作表都写到一个HTML文件中,请使用以下代码:

$writer->writeAllSheets();

写一个特定的工作表

HTML文件可以包含一个或多个工作表。因此,您可以指定要写入HTML的工作表:

$writer->setSheetIndex(0);

设置HTML文件的图片根目录

在某些情况下,您需要显式设置所包含映像的根目录。例如,代替:

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嵌入网页中

在某些情况下,您可能希望将生成的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();
?>

编写UTF-8 HTML文件

通过编写BOM表文件头,可以将HTML文件标记为UTF-8。可以使用以下代码启用此功能:

$writer = new PhpOfficePhpSpreadsheetWriterHtml($spreadsheet);
$writer->setUseBOM(true);

$writer->save("05featuredemo.htm");

十进制和千位分隔符

请参阅“ PhpOfficePhpSpreadsheetWriterCsv如何控制它们的外观”部分。

PDF格式

PhpSpreadsheet允许您将电子表格写入PDF格式,以快速分发表示的数据。

PDF限制请注意,PDF文件格式在样式单元格,数字格式等方面有一些限制。

PhpOffice PhpSpreadsheet Writer 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
登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认