高级使用
匿名 · 更新于 2019/12/18
可以配置CSV读取器和写入器以使其适应您的要求:
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
$reader = ReaderEntityFactory::createReaderFromFile('/path/to/file.csv');
/** All of these methods have to be called before opening the reader. */
$reader->setFieldDelimiter('|');
$reader->setFieldEnclosure('@');
此外,如果您需要读取非UTF-8文件,则可以通过以下方式指定文件的编码:
$reader->setEncoding('UTF-16LE');
默认情况下,编写器生成带有BOM的以UTF-8编码的CSV文件。但是,可以不包含BOM:
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
$writer = WriterEntityFactory::createWriterFromFile('/path/to/file.csv');
$writer->setShouldAddBOM(false);
XLSX和ODS的配置
新建工作表
当前表中已写入最大行数(1,048,576)时,可以更改编写器的行为。默认情况下,会自动创建一个新的工作表,以便继续书写,但这并不总是那么可取。
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
$writer = WriterEntityFactory::createODSWriter();
$writer->setShouldCreateNewSheetsAutomatically(true); // default value
$writer->setShouldCreateNewSheetsAutomatically(false); // will stop writing new data when limit is reached
使用自定义临时文件夹
处理XLSX和ODS文件需要创建临时文件。默认情况下,Spout将使用系统默认的临时文件夹(由返回sys_get_temp_dir())。可以通过在读取器或写入器上显式设置它来覆盖它:
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
$writer = WriterEntityFactory::createXLSXWriter();
$writer->setTempFolder($customTempFolderPath);
字符串存储(XLSX编写器)
XLSX文件支持不同的方式来存储字符串值:
- 共享字符串旨在通过从工作表表示中分离字符串并忽略重复的字符串来优化文件大小(如果一个字符串使用了3次,则只会存储一个字符串)
- 内联字符串的优化程度较低(因为所有重复字符串都已存储),但处理速度更快
为了使内存使用率真正降低,在使用共享字符串时,Spout不会对字符串进行重复数据删除。但是仍可以使用此模式。
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
$writer = WriterEntityFactory::createXLSXWriter();
$writer->setShouldUseInlineStrings(true); // default (and recommended) value
$writer->setShouldUseInlineStrings(false); // will use shared strings
有关Apple Numbers和iOS支持的说明
苹果的产品(Numbers和iOS预览器)不支持内联字符串,而是显示空单元格。因此,如果需要支持这些平台,请确保使用共享字符串!
日期/时间格式
读取包含日期或时间的电子表格时,Spout默认将值作为DateTime对象返回。可以更改此行为,并改为返回格式化日期(例如“ 2016-11-29 1:22 AM”)。日期格式与电子表格中指定的格式相对应。
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
$reader = ReaderEntityFactory::createXLSXReader();
$reader->setShouldFormatDates(false); // default value
$reader->setShouldFormatDates(true); // will return formatted dates
空行
默认情况下,当Spout读取电子表格时,它将跳过空行,仅返回包含数据的行。可以更改此行为,以便Spout返回所有行:
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
$reader = ReaderEntityFactory::createReaderFromFile('/path/to/file.ext');
$reader->setShouldPreserveEmptyRows(true);
造型
可用样式
Spout支持在行和单元级别进行样式设置。可以自定义字体,背景,对齐方式和边框。
对于字体和对齐方式,Spout尚不支持所有可能的格式设置选项。但是您可以找到最重要的:
| 类别 | 属性 | API |
|---|---|---|
| 字形 | 胆大 | StyleBuilder::setFontBold() |
| 斜体 | StyleBuilder::setFontItalic() |
|
| 强调 | StyleBuilder::setFontUnderline() |
|
| 删除线 | StyleBuilder::setFontStrikethrough() |
|
| 字体名称 | StyleBuilder::setFontName('Arial') |
|
| 字体大小 | StyleBuilder::setFontSize(14) |
|
| 字体颜色 | StyleBuilder::setFontColor(Color::BLUE)StyleBuilder::setFontColor(Color::rgb(0, 128, 255)) |
|
| 对准 | 单元格对齐 | StyleBuilder::setCellAlignment(CellAlignment::CENTER) |
| 自动换行 | StyleBuilder::setShouldWrapText(true) |
样式行
可以将某些格式设置选项应用于行。在这种情况下,该行的所有单元格将具有相同的样式:
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Common\Entity\Style\Color;
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile($filePath);
/** Create a style with the StyleBuilder */
$style = (new StyleBuilder())
->setFontBold()
->setFontSize(15)
->setFontColor(Color::BLUE)
->setShouldWrapText()
->setCellAlignment(CellAlignment::RIGHT)
->setBackgroundColor(Color::YELLOW)
->build();
/** Create a row with cells and apply the style to all cells */
$row = WriterEntityFactory::createRowFromArray(['Carl', 'is', 'great'], $style);
/** Add the row to the writer */
$writer->addRow($row);
$writer->close();
在行上添加边框需要一个Border对象。
use Box\Spout\Common\Entity\Style\Border;
use Box\Spout\Writer\Common\Creator\Style\BorderBuilder;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
$border = (new BorderBuilder())
->setBorderBottom(Color::GREEN, Border::WIDTH_THIN, Border::STYLE_DASHED)
->build();
$style = (new StyleBuilder())
->setBorder($border)
->build();
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToFile($filePath);
$cells = WriterEntityFactory::createCell('Border Bottom Green Thin Dashed');
$row = WriterEntityFactory::createRow($cells);
$row->setStyle($style);
$writer->addRow($row);
$writer->close();
样式单元格
与样式行中描述的样式技术相同的技术也可以应用于行中的各个单元格。
单元格样式分别从父行样式和默认行样式继承。
如果存在,应用于特定单元格的样式将覆盖所有父样式。
例:
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
$defaultStyle = (new StyleBuilder())
->setFontSize(8)
->build();
$writer = WriterEntityFactory::createXLSXWriter();
$writer->setDefaultRowStyle($defaultStyle)
->openToFile($filePath);
$zebraBlackStyle = (new StyleBuilder())
->setBackgroundColor(Color::BLACK)
->setFontColor(Color::WHITE)
->setFontSize(10)
->build();
$zebraWhiteStyle = (new StyleBuilder())
->setBackgroundColor(Color::WHITE)
->setFontColor(Color::BLACK)
->setFontItalic()
->build();
$cells = [
WriterEntityFactory::createCell('Ze', $zebraBlackStyle),
WriterEntityFactory::createCell('bra', $zebraWhiteStyle)
];
$rowStyle = (new StyleBuilder())
->setFontBold()
->build();
$row = WriterEntityFactory::createRow($cells, $rowStyle);
$writer->addRow($row);
$writer->close();
默认样式
Spout将对所有创建的行使用默认样式。可以通过以下方式覆盖此样式:
$defaultStyle = (new StyleBuilder())
->setFontName('Arial')
->setFontSize(11)
->build();
$writer = WriterEntityFactory::createXLSXWriter();
$writer->setDefaultRowStyle($defaultStyle)
->openToFile($filePath);
玩床单
创建XLSX或ODS文件时,可以控制将数据写入哪张纸。您随时可以检索或设置当前工作表:
$firstSheet = $writer->getCurrentSheet();
$writer->addRow($rowForSheet1); // writes the row to the first sheet
$newSheet = $writer->addNewSheetAndMakeItCurrent();
$writer->addRow($rowForSheet2); // writes the row to the new sheet
$writer->setCurrentSheet($firstSheet);
$writer->addRow($anotherRowForSheet1); // append the row to the first sheet
还可以检索当前创建的所有图纸:
$sheets = $writer->getSheets();
读取时可以检索某些工作表的属性:
foreach ($reader->getSheetIterator() as $sheet) {
$sheetName = $sheet->getName();
$isSheetVisible = $sheet->isVisible();
$isSheetActive = $sheet->isActive(); // active sheet when spreadsheet last saved
}
如果您在应用程序中依赖工作表的名称,则可以通过以下方式对其进行自定义:
// Accessing the sheet name when writing
$sheet = $writer->getCurrentSheet();
$sheetName = $sheet->getName();
// Customizing the sheet name when writing
$sheet = $writer->getCurrentSheet();
$sheet->setName('My custom name');
请注意,Excel对工作表名称有一些限制:
- 它不能为空
- 不得超过31个字符
- 它不能包含以下字符:\ /?* : [ 要么 ]
- 它不能以单引号开头或结尾
- 它必须是唯一的
处理这些限制是开发人员的责任。Spout不会尝试自动更改工作表的名称,因为一个人可能依赖此名称来准确传递工作表的名称。
流利的界面
因为流畅的界面很棒,所以可以将它们与Spout一起使用:
use Box\Spout\Writer\WriterEntityFactory;
$writer = WriterEntityFactory::createWriterFromFile('path/to/file.ext');
$writer->setTempFolder($customTempFolderPath)
->setShouldUseInlineStrings(true)
->openToFile($filePath)
->addRow($headerRow)
->addRows($dataRows)
->close();
