2019年10月11日14:05:58
讀寫文件
從體系結構您已經知道,使用基本PhpSpreadsheet類無法對持久性存儲進行讀寫。為此,PhpSpreadsheet提供讀者和作家,這是實現\PhpOffice\PhpSpreadsheet\Reader\IReader
和 \PhpOffice\PhpSpreadsheet\Writer\IWriter
。
\ PhpOffice \ PhpSpreadsheet \ IOFactory
PhpSpreadsheet API提供了多種創建 \PhpOffice\PhpSpreadsheet\Reader\IReader
或 \PhpOffice\PhpSpreadsheet\Writer\IWriter
實例的方法:
通過直接創建\PhpOffice\PhpSpreadsheet\IOFactory
。下面的所有示例都演示了直接創建方法。請注意,您也可以使用\PhpOffice\PhpSpreadsheet\IOFactory
該類來執行此操作。
\PhpOffice\PhpSpreadsheet\Reader\IReader
使用創建\PhpOffice\PhpSpreadsheet\IOFactory
有兩種方法可以將文件讀入PhpSpreadsheet:使用自動文件類型解析或顯式。
自動文件類型解析可\PhpOffice\PhpSpreadsheet\Reader\IReader
使用PhpSpreadsheet 檢查不同的 分布。如果其中之一可以加載指定的文件名,則使用該文件名加載文件\PhpOffice\PhpSpreadsheet\Reader\IReader
。顯式模式要求您指定 \PhpOffice\PhpSpreadsheet\Reader\IReader
應使用的模式。
您可以使用以下代碼示例在自動文件類型解析模式下創建\PhpOffice\PhpSpreadsheet\Reader\IReader
實例 \PhpOffice\PhpSpreadsheet\IOFactory
:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("05featuredemo.xlsx");
此功能的典型用法是當您需要讀取用戶上傳的文件時,並且您不知道他們是在上傳xls還是xlsx文件。
如果您需要在閱讀器上設置一些屬性(例如,僅讀取數據,請參閱稍后的更多內容),則可以改用以下變體:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("05featuredemo.xlsx"); $reader->setReadDataOnly(true); $reader->load("05featuredemo.xlsx");
您可以使用以下代碼示例以顯式模式使用創建\PhpOffice\PhpSpreadsheet\Reader\IReader
實例 \PhpOffice\PhpSpreadsheet\IOFactory
:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx"); $spreadsheet = $reader->load("05featuredemo.xlsx");
請注意,自動類型解析模式比顯式模式稍慢。
\PhpOffice\PhpSpreadsheet\Writer\IWriter
使用創建\PhpOffice\PhpSpreadsheet\IOFactory
您可以\PhpOffice\PhpSpreadsheet\Writer\IWriter
使用創建實例 \PhpOffice\PhpSpreadsheet\IOFactory
:
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, "Xlsx"); $writer->save("05featuredemo.xlsx");
Excel 2007(SpreadsheetML)文件格式
Xlsx文件格式是PhpSpreadsheet的主要文件格式。它允許將內存電子表格輸出到.xlsx文件。
\ PhpOffice \ PhpSpreadsheet \ Reader \ Xlsx
閱讀電子表格
您可以使用以下代碼讀取.xlsx文件:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $spreadsheet = $reader->load("05featuredemo.xlsx");
僅讀取數據
您可以在閱讀器上設置選項setReadDataOnly,以指示閱讀器忽略樣式,數據驗證等,而僅讀取單元格數據:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setReadDataOnly(true); $spreadsheet = $reader->load("05featuredemo.xlsx");
僅閱讀特定的工作表
您可以在閱讀器上設置選項setLoadSheetsOnly,以指示閱讀器僅加載具有給定名稱的圖紙:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]); $spreadsheet = $reader->load("05featuredemo.xlsx");
僅讀取特定的單元格
您可以在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器可以是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
。默認情況下,使用讀取所有單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter
。
以下代碼將僅讀取Excel文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { 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 \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.xlsx");
\ PhpOffice \ PhpSpreadsheet \ Writer \ Xlsx
編寫電子表格
您可以使用以下代碼編寫.xlsx文件:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $writer->save("05featuredemo.xlsx");
公式預計算
默認情況下,該編寫器會預先計算電子表格中的所有公式。在大型電子表格上,這可能會很慢,甚至可能是不必要的。但是,您可以禁用公式預計算:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.xlsx");
Office 2003兼容性包
由於Office2003兼容性包中的錯誤,打開Xlsx電子表格時可能會出現一些小問題(主要與公式計算有關)。您可以使用以下代碼啟用Office2003兼容性:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($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 \PhpOffice\PhpSpreadsheet\Reader\Xls(); $spreadsheet = $reader->load("05featuredemo.xls");
僅讀取數據
您可以在閱讀器上設置選項setReadDataOnly,以指示閱讀器忽略樣式,數據驗證等,而僅讀取單元格數據:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $reader->setReadDataOnly(true); $spreadsheet = $reader->load("05featuredemo.xls");
僅閱讀特定的工作表
您可以在閱讀器上設置選項setLoadSheetsOnly,以指示閱讀器僅加載具有給定名稱的圖紙:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); $reader->setLoadSheetsOnly(["Sheet 1", "My special sheet"]); $spreadsheet = $reader->load("05featuredemo.xls");
僅讀取特定的單元格
您可以在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器可以是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
。默認情況下,使用讀取所有單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter
。
以下代碼將僅讀取Excel文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { 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 \PhpOffice\PhpSpreadsheet\Reader\Xls(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.xls");
\ PhpOffice \ PhpSpreadsheet \ Writer \ Xls
編寫電子表格
您可以使用以下代碼編寫.xls文件:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($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 \PhpOffice\PhpSpreadsheet\Reader\Xml(); $spreadsheet = $reader->load("05featuredemo.xml");
僅讀取特定的單元格
您可以在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器可以是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
。默認情況下,使用讀取所有單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter
。
以下代碼將僅讀取Excel文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { 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 \PhpOffice\PhpSpreadsheet\Reader\Xml(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.xml");
象征性LinK(SYLK)
符號鏈接(SYLK)是Microsoft文件格式,通常用於在應用程序(尤其是電子表格)之間交換數據。SYLK文件通常具有.slk后綴。它僅由可顯示的ANSI字符組成,可以很容易地由其他應用程序(例如數據庫)創建和處理。
SYLK限制請注意,SYLK文件格式在樣式設置單元格和通過PHP處理大型電子表格方面有一些限制。
\ PhpOffice \ PhpSpreadsheet \ Reader \ Slk
閱讀電子表格
您可以使用以下代碼讀取.slk文件:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk(); $spreadsheet = $reader->load("05featuredemo.slk");
僅讀取特定的單元格
您可以在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器可以是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
。默認情況下,使用讀取所有單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter
。
以下代碼將僅讀取SYLK文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { 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 \PhpOffice\PhpSpreadsheet\Reader\Slk(); $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 \PhpOffice\PhpSpreadsheet\Reader\Ods(); $spreadsheet = $reader->load("05featuredemo.ods");
僅讀取特定的單元格
您可以在閱讀器上設置選項setReadFilter,以指示閱讀器僅加載與給定規則匹配的單元格。讀取過濾器可以是任何實現的類 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
。默認情況下,使用讀取所有單元格\PhpOffice\PhpSpreadsheet\Reader\DefaultReadFilter
。
以下代碼將僅讀取Calc文件中任何工作表的第1行和第20至30行:
class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { 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 PhpOffice\PhpSpreadsheet\Reader\Ods(); $reader->setReadFilter( new MyReadFilter() ); $spreadsheet = $reader->load("06largescale.ods");
CSV(逗號分隔值)
CSV(逗號分隔值)通常與其他系統一起用作導入/導出文件格式。PhpSpreadsheet允許讀取和寫入CSV文件。
CSV限制請注意,CSV文件格式在樣式單元格,數字格式等方面有一些限制。
\ PhpOffice \ PhpSpreadsheet \ Reader \ Csv
讀取CSV文件
您可以使用以下代碼讀取.csv文件:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $spreadsheet = $reader->load("sample.csv");
設置CSV選項
CSV文件通常不是真正的“逗號分隔”,或使用分號(;
)作為分隔符。您可以\PhpOffice\PhpSpreadsheet\Reader\Csv
在讀取CSV文件之前指示 一些選項。
分隔符將被自動檢測,因此在大多數情況下,無需指定分隔符。但是,如果自動檢測不適合用例,則可以手動設置。
請注意,\PhpOffice\PhpSpreadsheet\Reader\Csv
默認情況下假定加載的CSV文件是UTF-8編碼的。如果要讀取在Microsoft Office Excel中創建的CSV文件,則正確的輸入編碼可能是Windows-1252(CP1252)。始終確保正確設置了輸入編碼。
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); $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 \PhpOffice\PhpSpreadsheet\Reader\Csv(); $reader->setDelimiter(';'); $reader->setEnclosure(''); $reader->setSheetIndex(5); $reader->loadIntoExisting("05featuredemo.csv", $spreadsheet);
\ PhpOffice \ PhpSpreadsheet \ Writer \ Csv
編寫CSV文件
您可以使用以下代碼編寫.csv文件:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->save("05featuredemo.csv");
設置CSV選項
CSV文件通常不是真正的“逗號分隔”,或使用分號(;
)作為分隔符。您可以\PhpOffice\PhpSpreadsheet\Writer\Csv
在編寫CSV文件之前指示 一些選項:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->setDelimiter(';'); $writer->setEnclosure(''); $writer->setLineEnding("\r\n"); $writer->setSheetIndex(0); $writer->save("05featuredemo.csv");
寫一個特定的工作表
CSV文件只能包含一個工作表。因此,您可以指定要寫入CSV的工作表:
$writer->setSheetIndex(0);
公式預計算
默認情況下,該編寫器會預先計算電子表格中的所有公式。在大型電子表格上,這可能會很慢,甚至可能是不必要的。但是,您可以禁用公式預計算:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.csv");
寫入UTF-8 CSV文件
通過編寫BOM表文件頭,可以將CSV文件標記為UTF-8。可以使用以下代碼啟用此功能:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Csv($spreadsheet); $writer->setUseBOM(true); $writer->save("05featuredemo.csv");
十進制和千位分隔符
如果要導出的工作表包含帶小數或千位分隔符的數字,則在進行導出之前,應考慮要對那些字符使用哪些字符。
默認情況下,PhpSpreadsheet在服務器的區域設置中查找以決定要使用的字符。但是為避免出現問題,建議如下所示顯式設置字符。
英文用戶將要在導出之前使用它:
\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setDecimalSeparator('.'); \PhpOffice\PhpSpreadsheet\Shared\StringHelper::setThousandsSeparator(',');
德國用戶將要使用相反的值。
\PhpOffice\PhpSpreadsheet\Shared\StringHelper::setDecimalSeparator(','); \PhpOffice\PhpSpreadsheet\Shared\StringHelper::setThousandsSeparator('.');
請注意,上面的代碼將小數和千位分隔符設置為全局選項。這也會影響HTML和PDF的導出方式。
的HTML
PhpSpreadsheet允許您以HTML格式讀取或寫入電子表格,以便向PC上沒有電子表格應用程序的任何人快速表示其中的數據,或加載由其他腳本保存的文件,這些腳本只是創建HTML標記並為其提供.xls文件擴展。
HTML限制請注意,HTML文件格式在樣式單元格,數字格式等方面有一些限制。
\ PhpOffice \ PhpSpreadsheet \ Reader \ HTML
閱讀電子表格
您可以使用以下代碼讀取.html或.htm文件:
$reader = new \PhpOffice\PhpSpreadsheet\Reader\Html(); $spreadsheet = $reader->load("05featuredemo.html");
HTML限制請注意,HTML閱讀器仍處於試驗階段,尚不支持干凈的合並單元格或嵌套表
\ PhpOffice \ PhpSpreadsheet \ Writer \ Html
請注意,\PhpOffice\PhpSpreadsheet\Writer\Html
默認情況下僅輸出第一個工作表。
編寫電子表格
您可以使用以下代碼編寫.htm文件:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($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 \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.htm");
將生成的HTML嵌入網頁中
在某些情況下,您可能希望將生成的HTML嵌入到現有網站中。\ PhpOffice \ PhpSpreadsheet \ Writer \ Html支持僅生成HTML代碼的特定部分,從而使您可以在網站中使用這些部分。
支持的方法:
generateHTMLHeader()
generateStyles()
generateSheetData()
generateHTMLFooter()
這是一個示例,該示例獨立地檢索所有部分並將它們合並到結果HTML頁面中:
<?php $writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); echo $writer->generateHTMLHeader(); ?> <style> <!-- 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 \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet); $writer->setUseBOM(true); $writer->save("05featuredemo.htm");
十進制和千位分隔符
請參閱“ \PhpOffice\PhpSpreadsheet\Writer\Csv
如何控制它們的外觀”部分。
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 = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Mpdf');
或者,您可以使用更通用的名稱注冊正在使用的編寫器,因此您不必記住選擇的是哪個庫,而只需要編寫PDF文件即可:
$class = \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf::class; \PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', $class); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Pdf');
或者,您可以像這樣直接實例化您選擇的作者:
$writer = \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet);
定制實施或配置
如果需要受支持的PDF庫的自定義實現或自定義配置。您可以擴展PDF庫和PDF編寫器,如下所示:
class My_Custom_TCPDF extends TCPDF { // ... } class My_Custom_TCPDF_Writer extends \PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf { protected function createExternalWriterInstance($orientation, $unit, $paperSize) { $instance = new My_Custom_TCPDF($orientation, $unit, $paperSize); // more configuration of $instance return $instance; } } \PhpOffice\PhpSpreadsheet\IOFactory::registerWriter('Pdf', MY_TCPDF_WRITER::class);
編寫電子表格
一旦確定了要用於PDF生成的渲染器,就可以使用以下代碼編寫.pdf文件:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet); $writer->save("05featuredemo.pdf");
請注意,\PhpOffice\PhpSpreadsheet\Writer\Pdf
默認情況下僅輸出第一個工作表。
編寫所有工作表
PDF文件可以包含一個或多個工作表。如果要將所有工作表都寫到一個PDF文件中,請使用以下代碼:
$writer->writeAllSheets();
寫一個特定的工作表
PDF文件可以包含一個或多個工作表。因此,您可以指定要寫入PDF的工作表:
$writer->setSheetIndex(0);
公式預計算
默認情況下,該編寫器會預先計算電子表格中的所有公式。在大型電子表格上,這可能會很慢,甚至可能是不必要的。但是,您可以禁用公式預計算:
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet); $writer->setPreCalculateFormulas(false); $writer->save("05featuredemo.pdf");
十進制和千位分隔符
請參閱“ \PhpOffice\PhpSpreadsheet\Writer\Csv
如何控制它們的外觀”部分。
從模板生成Excel文件(讀取,修改,寫入)
讀寫器是使您能夠從模板生成Excel文件的工具。與從頭開始生成Excel文件相比,這需要更少的編碼工作,尤其是在您的模板具有許多樣式,頁面設置屬性,標題等的情況下。
這是一個如何打開模板文件,填寫幾個字段並再次保存的示例:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load('template.xlsx'); $worksheet = $spreadsheet->getActiveSheet(); $worksheet->getCell('A1')->setValue('John'); $worksheet->getCell('A2')->setValue('Smith'); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls'); $writer->save('write.xls');
請注意,可以加載一個xlsx文件並生成一個xls文件。
從HTML內容生成Excel文件
如果要從預渲染的HTML內容生成Excel文件,則可以使用HTML Reader自動進行。當您從將下載/發送給用戶的Web應用程序內容生成Excel文件時,此功能非常有用。
例如:
$htmlString = '<table> <tr> <td>Hello World</td> </tr> <tr> <td>Hello<br />World</td> </tr> <tr> <td>Hello<br>World</td> </tr> </table>'; $reader = new \PhpOffice\PhpSpreadsheet\Reader\Html(); $spreadsheet = $reader->loadFromString($htmlString); $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xls'); $writer->save('write.xls');
讀取文件
安全
在讀取電子表格文件時,基於XML的格式(例如OfficeOpen XML,Excel2003 XML,OASIS和Gnumeric)容易受到XML外部實體處理(XXE)注入攻擊。這可能導致:
- 披露文件是否存在
- 服務器端請求偽造
- 命令執行(取決於已安裝的PHP包裝器)
為了防止這種情況,默認情況下,每個基於XML的閱讀器都將在DOCTYPE中聲明的XML實體進行查找,如果發現任何實體,則會引發異常。
加載電子表格文件
加載工作簿文件的最簡單方法是讓PhpSpreadsheet的IO Factory識別文件類型並加載它,並調用該類的靜態load()
方法\PhpOffice\PhpSpreadsheet\IOFactory
。
$inputFileName = './sampleData/example1.xls'; /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
有關samples/Reader/01_Simple_file_reader_using_IOFactory.php
該代碼的有效示例,請參見。
該load()
方法將嘗試識別文件類型,並為該文件類型實例化加載程序;使用它來加載文件並在Spreadsheet
對象中存儲數據和任何格式。
該方法根據文件擴展名對加載器進行初始猜測以實例化;但會在實際執行加載之前測試該文件:因此,例如,如果該文件實際上是CSV文件或包含HTML標記,但已賦予.xls擴展名(很常見),它將拒絕Xls通常用於.xls文件的加載程序;並使用其他加載程序測試文件,直到找到合適的加載程序,然后使用該文件讀取文件。
雖然很容易在代碼中實現,但您不必擔心文件類型;這不是加載文件的最有效方法;而且它缺乏在實際將文件讀入Spreadsheet
對象之前以任何方式配置加載程序的靈活性。
創建閱讀器並加載電子表格文件
如果知道需要加載的電子表格文件的文件類型,則可以實例化該文件類型的新閱讀器對象,然后使用閱讀器的load()
方法將文件讀取為Spreadsheet
對象。可以通過名稱實例化每種不同的受支持文件類型的閱讀器對象。但是,如果文件類型不正確(例如,擴展名為.xls的CSV文件),則可能會得到無法預測的結果,盡管通常應捕獲此類異常。
$inputFileName = './sampleData/example1.xls'; /** Create a new Xls Reader **/ $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xls(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xlsx(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Xml(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Ods(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Slk(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Gnumeric(); // $reader = new \PhpOffice\PhpSpreadsheet\Reader\Csv(); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/02_Simple_file_reader_using_a_specified_reader.php
該代碼的有效示例,請參見。
或者,您可以使用IO Factory的createReader()
方法為您實例化閱讀器對象,只需告訴它要實例化的閱讀器的文件類型即可。
$inputFileType = 'Xls'; // $inputFileType = 'Xlsx'; // $inputFileType = 'Xml'; // $inputFileType = 'Ods'; // $inputFileType = 'Slk'; // $inputFileType = 'Gnumeric'; // $inputFileType = 'Csv'; $inputFileName = './sampleData/example1.xls'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/03_Simple_file_reader_using_the_IOFactory_to_return_a_reader.php
該代碼的有效示例,請參見。
如果不確定文件類型,則可以IOFactory::identify()
在使用該createReader()
方法實例化Reader對象之前,使用該方法標識所需 的閱讀器。
$inputFileName = './sampleData/example1.xls'; /** Identify the type of $inputFileName **/ $inputFileType = \PhpOffice\PhpSpreadsheet\IOFactory::identify($inputFileName); /** Create a new Reader of the type that has been identified **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/04_Simple_file_reader_using_the_IOFactory_to_identify_a_reader_to_use.php
該代碼的有效示例,請參見。
電子表格閱讀器選項
為要加載的工作簿創建閱讀器對象后,您將有機會在執行該load()
方法之前設置其他選項。
從電子表格文件中僅讀取數據
如果您只對工作簿中的單元格值感興趣,而又不需要任何單元格格式信息,則可以使用該setReadDataOnly()
方法將讀取器設置為僅讀取每個單元格中的數據值和任何公式 。
$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader that we only want to load cell data **/ $reader->setReadDataOnly(true); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/05_Simple_file_reader_using_the_read_data_only_option.php
該代碼的有效示例,請參見。
重要的是要注意,工作簿(和PhpSpreadsheet)將日期和時間存儲為簡單的數字值:它們只能通過應用於該單元格的格式掩碼與其他數字值區分開。將只讀數據設置為true時,PhpSpreadsheet不會讀取單元格格式掩碼,因此無法區分日期/時間和數字。
即使僅將讀取數據設置為true,Gnumeric加載器也已編寫為讀取日期值的格式掩碼,因此可以區分日期/時間和數字。但是其他讀者尚未實現此更改。
從電子表格文件中僅讀取數據適用於讀取器:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 是 | Xls | 是 | Xml | 是 |
奧茲 | 是 | 西爾克 | 沒有 | 字母數字 | 是 |
CSV | 沒有 | 的HTML | 沒有 |
從文件中僅讀取命名的工作表
如果您的工作簿包含許多工作表,但是您僅對閱讀其中一些表感興趣,則可以使用該 setLoadSheetsOnly()
方法來標識您對閱讀感興趣的那些表。
要讀取一張紙,您可以將該紙名作為參數傳遞給setLoadSheetsOnly()
方法。
$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $sheetname = 'Data Sheet #2'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader of which WorkSheets we want to load **/ $reader->setLoadSheetsOnly($sheetname); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/07_Simple_file_reader_loading_a_single_named_worksheet.php
該代碼的有效示例,請參見。
如果您要閱讀的不僅僅是一張紙,可以將紙名列表作為數組參數傳遞給該setLoadSheetsOnly()
方法。
$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $sheetnames = ['Data Sheet #1','Data Sheet #3']; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader of which WorkSheets we want to load **/ $reader->setLoadSheetsOnly($sheetnames); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/08_Simple_file_reader_loading_several_named_worksheets.php
該代碼的有效示例,請參見。
要將此選項重置為默認值,可以調用該setLoadAllSheets()
方法。
$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Advise the Reader to load all Worksheets **/ $reader->setLoadAllSheets(); /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/06_Simple_file_reader_loading_all_worksheets.php
該代碼的有效示例,請參見。
從文件中僅讀取命名的工作表適用於讀者:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 是 | Xls | 是 | Xml | 是 |
奧茲 | 是 | 西爾克 | 沒有 | 字母數字 | 是 |
CSV | 沒有 | 的HTML | 沒有 |
從文件中僅讀取特定的列和行(讀取過濾器)
如果您只對閱讀工作表的一部分感興趣,則可以編寫一個篩選器類,該類標識裝入程序是否應讀取單個單元格。讀過濾器必須實現的 \PhpOffice\PhpSpreadsheet\Reader\IReadFilter
接口,並且包含一個 readCell()
接受的參數的方法$column
,$row
以及 $worksheetName
,並返回一個布爾值true或false指示由這些參數確定的工作簿的小區是否應該讀與否。
$inputFileType = 'Xls'; $inputFileName = './sampleData/example1.xls'; $sheetname = 'Data Sheet #3'; /** Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */ class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { public function readCell($column, $row, $worksheetName = '') { // Read rows 1 to 7 and columns A to E only if ($row >= 1 && $row <= 7) { if (in_array($column,range('A','E'))) { return true; } } return false; } } /** Create an Instance of our Read Filter **/ $filterSubset = new MyReadFilter(); /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Tell the Reader that we want to use the Read Filter **/ $reader->setReadFilter($filterSubset); /** Load only the rows and columns that match our filter to Spreadsheet **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/09_Simple_file_reader_using_a_read_filter.php
該代碼的有效示例,請參見。
此示例不是特別有用,因為它只能在非常特殊的情況下使用(當您只希望工作表中的A1:E7范圍內的單元格時。通用的讀取過濾器可能會更有用:
/** Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */ class MyReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { private $startRow = 0; private $endRow = 0; private $columns = []; /** Get the list of rows and columns to read */ public function __construct($startRow, $endRow, $columns) { $this->startRow = $startRow; $this->endRow = $endRow; $this->columns = $columns; } public function readCell($column, $row, $worksheetName = '') { // Only read the rows and columns that were configured if ($row >= $this->startRow && $row <= $this->endRow) { if (in_array($column,$this->columns)) { return true; } } return false; } } /** Create an Instance of our Read Filter, passing in the cell range **/ $filterSubset = new MyReadFilter(9,15,range('G','K'));
有關samples/Reader/10_Simple_file_reader_using_a_configurable_read_filter.php
該代碼的有效示例,請參見。
通過允許您以“塊”形式讀取和處理大型工作簿,這對於節省內存特別有用:例如,當將數據從Excel工作表傳輸到數據庫時,這種用法的一個例子。
$inputFileType = 'Xls'; $inputFileName = './sampleData/example2.xls'; /** Define a Read Filter class implementing \PhpOffice\PhpSpreadsheet\Reader\IReadFilter */ class ChunkReadFilter implements \PhpOffice\PhpSpreadsheet\Reader\IReadFilter { private $startRow = 0; private $endRow = 0; /** Set the list of rows that we want to read */ public function setRows($startRow, $chunkSize) { $this->startRow = $startRow; $this->endRow = $startRow + $chunkSize; } public function readCell($column, $row, $worksheetName = '') { // Only read the heading row, and the configured rows if (($row == 1) || ($row >= $this->startRow && $row < $this->endRow)) { return true; } return false; } } /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Define how many rows we want to read for each "chunk" **/ $chunkSize = 2048; /** Create a new Instance of our Read Filter **/ $chunkFilter = new ChunkReadFilter(); /** Tell the Reader that we want to use the Read Filter **/ $reader->setReadFilter($chunkFilter); /** Loop to read our worksheet in "chunk size" blocks **/ for ($startRow = 2; $startRow <= 65536; $startRow += $chunkSize) { /** Tell the Read Filter which rows we want this iteration **/ $chunkFilter->setRows($startRow,$chunkSize); /** Load only the rows that match our filter **/ $spreadsheet = $reader->load($inputFileName); // Do some processing here }
有關samples/Reader/12_Reading_a_workbook_in_chunks_using_a_configurable_read_filter_
該代碼的有效示例,請參見。
使用讀取過濾器適用於:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 是 | Xls | 是 | Xml | 是 |
奧茲 | 是 | 西爾克 | 沒有 | 字母數字 | 是 |
CSV | 是 | 的HTML | 沒有 |
將多個文件合並到一個電子表格對象中
雖然您可以使用該setLoadSheetsOnly()
方法限制從工作簿文件中讀取的工作表的數量,但某些閱讀器還允許您將來自不同文件的多個單獨的“工作表”組合到單個Spreadsheet
對象中,其中每個單獨的文件都是該工作簿中的單個工作表。對於您閱讀的每個文件,您需要使用的setSheetIndex()
方法來指示應將其加載到哪個工作表索引中$reader
,然后使用 loadIntoExisting()
方法而不是將該load()
方法實際將文件讀入該工作表中。
$inputFileType = 'Csv'; $inputFileNames = [ './sampleData/example1.csv', './sampleData/example2.csv' './sampleData/example3.csv' ]; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Extract the first named file from the array list **/ $inputFileName = array_shift($inputFileNames); /** Load the initial file to the first worksheet in a `Spreadsheet` Object **/ $spreadsheet = $reader->load($inputFileName); /** Set the worksheet title (to the filename that we've loaded) **/ $spreadsheet->getActiveSheet() ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); /** Loop through all the remaining files in the list **/ foreach($inputFileNames as $sheet => $inputFileName) { /** Increment the worksheet index pointer for the Reader **/ $reader->setSheetIndex($sheet+1); /** Load the current file into a new worksheet in Spreadsheet **/ $reader->loadIntoExisting($inputFileName,$spreadsheet); /** Set the worksheet title (to the filename that we've loaded) **/ $spreadsheet->getActiveSheet() ->setTitle(pathinfo($inputFileName,PATHINFO_BASENAME)); }
有關samples/Reader/13_Simple_file_reader_for_multiple_CSV_files.php
該代碼的有效示例,請參見。
請注意,對多個工作表使用相同的工作表索引不會將文件追加到同一工作表中,但會覆蓋先前加載的結果。您不能將多個CSV文件加載到同一工作表中。
將多個文件合並為一個電子表格對象適用於:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 沒有 | Xls | 沒有 | Xml | 沒有 |
奧茲 | 沒有 | 西爾克 | 是 | 字母數字 | 沒有 |
CSV | 是 | 的HTML | 沒有 |
將讀取過濾器與將setSheetIndex()
大型CSV文件拆分為多個工作表的方法相結合
Xls BIFF .xls文件在工作表中限制為65536行,而Xlsx Microsoft Office Open XML SpreadsheetML .xlsx文件在工作表中限制為1,048,576行;但是CSV文件不受可用磁盤空間的限制。這意味着我們通常無法從超大型CSV文件中讀取超過這些限制的所有行,並將其另存為Xls或Xlsx文件。但是,通過使用“讀取過濾器”讀取“塊”中的CSV文件(使用我們在上一節中定義的ChunkReadFilter類和的setSheetIndex()
方法$reader
,我們可以將CSV文件拆分為幾個單獨的工作表。
$inputFileType = 'Csv'; $inputFileName = './sampleData/example2.csv'; echo 'Loading file ',pathinfo($inputFileName,PATHINFO_BASENAME),' using IOFactory with a defined reader type of ',$inputFileType,'<br />'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Define how many rows we want to read for each "chunk" **/ $chunkSize = 65530; /** Create a new Instance of our Read Filter **/ $chunkFilter = new ChunkReadFilter(); /** Tell the Reader that we want to use the Read Filter **/ /** and that we want to store it in contiguous rows/columns **/ $reader->setReadFilter($chunkFilter) ->setContiguous(true); /** Instantiate a new Spreadsheet object manually **/ $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); /** Set a sheet index **/ $sheet = 0; /** Loop to read our worksheet in "chunk size" blocks **/ /** $startRow is set to 2 initially because we always read the headings in row #1 **/ for ($startRow = 2; $startRow <= 1000000; $startRow += $chunkSize) { /** Tell the Read Filter which rows we want to read this loop **/ $chunkFilter->setRows($startRow,$chunkSize); /** Increment the worksheet index pointer for the Reader **/ $reader->setSheetIndex($sheet); /** Load only the rows that match our filter into a new worksheet **/ $reader->loadIntoExisting($inputFileName,$spreadsheet); /** Set the worksheet title for the sheet that we've justloaded) **/ /** and increment the sheet index as well **/ $spreadsheet->getActiveSheet()->setTitle('Country Data #'.(++$sheet)); }
有關samples/Reader/14_Reading_a_large_CSV_file_in_chunks_to_split_across_multiple_worksheets.php
該代碼的有效示例,請參見。
此代碼將從我們正在加載的CSV文件中一次讀取65,530行,並將每個“塊”存儲在新的工作表中。
在setContiguous()
這里,閱讀器的方法很重要。它僅在使用“讀取過濾器”時適用,並標識是否應按單元在CSV文件中的位置或相對於過濾器的位置存儲單元。
例如,如果過濾器對B2:C3范圍內的單元格返回true,則將setContiguous設置為false(默認值),這些將作為B2:C3加載到Spreadsheet
對象中。但是將setContiguous設置為true時,它們將被加載為A1:B2。
在多個工作表中拆分單個加載的文件適用於:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 沒有 | Xls | 沒有 | Xml | 沒有 |
奧茲 | 沒有 | 西爾克 | 沒有 | 字母數字 | 沒有 |
CSV | 是 | 的HTML | 沒有 |
管道或制表符分隔值文件
CSV加載程序將嘗試自動檢測文件中使用的分隔符。如果無法自動檢測,它將默認為逗號。如果這不適合您的用例,則可以使用setDelimiter()
方法手動指定分隔符。
$inputFileType = 'Csv'; $inputFileName = './sampleData/example1.tsv'; /** Create a new Reader of the type defined in $inputFileType **/ $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); /** Set the delimiter to a TAB character **/ $reader->setDelimiter("\t"); // $reader->setDelimiter('|'); /** Load the file to a Spreadsheet Object **/ $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/15_Simple_file_reader_for_tab_separated_value_file_using_the_Advanced_Value_Binder.php
該代碼的有效示例,請參見。
除了定界符之外,您還可以使用以下方法來設置數據加載的其他屬性:
方法 | 默認 |
---|---|
setEnclosure() | " |
setInputEncoding() | UTF-8 |
設置CSV分隔符適用於:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 沒有 | Xls | 沒有 | Xml | 沒有 |
奧茲 | 沒有 | 西爾克 | 沒有 | 字母數字 | 沒有 |
CSV | 是 | 的HTML | 沒有 |
簡要介紹高級價值粘結劑
從不包含格式信息的文件(例如CSV文件)中加載數據時,數據將以字符串或數字(浮點數或整數)的形式讀取。這意味着PhpSpreadsheet不會自動將日期/時間(例如16-Apr-2009
或13:30
),布爾值(true
或false
),百分比(75%
),超鏈接(https://www.example.com
)等識別為簡單字符串以外的任何內容。但是,可以在Value Binder的加載過程中應用針對這些值執行的其他處理。
值綁定器是實現\PhpOffice\PhpSpreadsheet\Cell\IValueBinder
接口的類 。它必須包含一個 bindValue()
接受a \PhpOffice\PhpSpreadsheet\Cell\Cell
和一個值作為參數的方法,並返回一個布爾值true
或false
指示是否已使用該值填充工作簿單元格。Advanced Value Binder實現了這樣一個類:在其他測試中,它標識包含“ TRUE”或“ FALSE”(基於區域設置)的字符串,並將其設置為布爾值;或科學格式的數字(例如“ 1.234e-5”)並將其轉換為浮點數;或日期和時間,將它們轉換為Excel時間戳值–在將值存儲在單元格對象中之前。它還為標識為日期,時間或百分比的字符串設置格式。當它遇到超鏈接或CSV文件中的HTML標記時,可以輕松擴展它以提供其他處理(包括文本或單元格格式)。
因此,使用Value Binder可以在讀取未格式化的文本文件時在加載程序邏輯中提供更大的靈活性。
/** Tell PhpSpreadsheet that we want to use the Advanced Value Binder **/ \PhpOffice\PhpSpreadsheet\Cell\Cell::setValueBinder( new \PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder() ); $inputFileType = 'Csv'; $inputFileName = './sampleData/example1.tsv'; $reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $reader->setDelimiter("\t"); $spreadsheet = $reader->load($inputFileName);
有關samples/Reader/15_Simple_file_reader_for_tab_separated_value_file_using_the_Advanced_Value_Binder.php
該代碼的有效示例,請參見。
使用Value Binder進行加載適用於:
讀者 | 是/否 | 讀者 | 是/否 | 讀者 | 是/否 |
---|---|---|---|---|---|
Xlsx | 沒有 | Xls | 沒有 | Xml | 沒有 |
奧茲 | 沒有 | 西爾克 | 沒有 | 字母數字 | 沒有 |
CSV | 是 | 的HTML | 是 |
錯誤處理
當然,您也應該始終對腳本執行一些錯誤處理。PhpSpreadsheet會引發異常,因此您可以將訪問庫方法的所有代碼包裝在Try / Catch塊中,以捕獲遇到的任何問題,並以適當的方式進行處理。
PhpSpreadsheet讀取器將引發一個 \PhpOffice\PhpSpreadsheet\Reader\Exception
。
$inputFileName = './sampleData/example-1.xls'; try { /** Load $inputFileName to a Spreadsheet Object **/ $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName); } catch(\PhpOffice\PhpSpreadsheet\Reader\Exception $e) { die('Error loading file: '.$e->getMessage()); }
有關samples/Reader/16_Handling_loader_exceptions_using_TryCatch.php
該代碼的有效示例,請參見。
輔助方法
您可以使用Reader的listWorksheetNames()
方法檢索文件中包含的工作表名稱列表,而無需加載整個文件。同樣,一種listWorksheetInfo()
方法將檢索文件中工作表的尺寸,而無需加載和解析整個文件。
listWorksheetNames
該listWorksheetNames()
方法返回一個簡單的數組,列出工作簿中的每個工作表名稱:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $worksheetNames = $reader->listWorksheetNames($inputFileName); echo '<h3>Worksheet Names</h3>'; echo '<ol>'; foreach ($worksheetNames as $worksheetName) { echo '<li>', $worksheetName, '</li>'; } echo '</ol>';
有關samples/Reader/18_Reading_list_of_worksheets_without_loading_entire_file.php
該代碼的有效示例,請參見。
listWorksheetInfo
該listWorksheetInfo()
方法返回一個嵌套數組,每個條目列出工作表的名稱和尺寸:
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader($inputFileType); $worksheetData = $reader->listWorksheetInfo($inputFileName); echo '<h3>Worksheet Information</h3>'; echo '<ol>'; foreach ($worksheetData as $worksheet) { echo '<li>', $worksheet['worksheetName'], '<br />'; echo 'Rows: ', $worksheet['totalRows'], ' Columns: ', $worksheet['totalColumns'], '<br />'; echo 'Cell Range: A1:', $worksheet['lastColumnLetter'], $worksheet['totalRows']; echo '</li>'; } echo '</ol>';
有關samples/Reader/19_Reading_worksheet_information_without_loading_entire_file.php
該代碼的有效示例,請參見