| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- <?php
- namespace plugin\saiadmin\service;
- use OpenSpout\Common\Entity\Style\Border;
- use OpenSpout\Common\Entity\Style\BorderPart;
- use OpenSpout\Writer\XLSX\Writer;
- use OpenSpout\Common\Entity\Row;
- use OpenSpout\Common\Entity\Style\Style;
- /**
- * Excel写入类
- * OpenSpout
- */
- class OpenSpoutWriter
- {
- /**
- * 操作实例
- * @var Writer
- */
- protected $instance;
- /**
- * 文件路径
- * @var string
- */
- protected $filepath;
- /**
- * 初始化
- * @param string $fileName 文件名称
- */
- public function __construct(string $fileName)
- {
- $this->filepath = $this->getFileName($fileName);
- $this->instance = new Writer();
- $this->instance->openToFile($this->filepath);
- }
- /**
- * 获取完整的文件路径
- * @param string $fileName
- * @return string
- */
- public function getFileName(string $fileName): string
- {
- $path = config('plugin.saiadmin.saithink.export_path',base_path() . '/plugin/saiadmin/public/export/');
- @mkdir($path, 0777, true);
- return $path . $fileName;
- }
- /**
- * 设置表格宽度
- * @param array $width 宽度数组
- * @return void
- */
- public function setWidth(array $width = [])
- {
- if (empty($width)) {
- return;
- }
- $sheet = $this->instance->getCurrentSheet();
- foreach ($width as $key => $value) {
- $sheet->setColumnWidth($value, $key + 1);
- }
- }
- /**
- * 设置表头
- * @param array $header 表头数组
- * @param $style
- * @return void
- */
- public function setHeader(array $header = [], $style = null): void
- {
- if (empty($style)) {
- $border = new Border(
- new BorderPart("top", "black", "thin"),
- new BorderPart("right", "black", "thin"),
- new BorderPart("bottom", "black", "thin"),
- new BorderPart("left", "black", "thin"),
- );
- $style = new Style();
- $style->setFontBold();
- $style->setCellAlignment("center");
- $style->setBorder($border);
- }
- $rowFromValues = Row::fromValues($header, $style);
- $this->instance->addRow($rowFromValues);
- }
- /**
- * 设置数据
- * @param array $data 数据数组
- * @param $style
- * @return void
- */
- public function setData(array $data = [], $style = null, array $filter = []): void
- {
- if (empty($style)) {
- $border = new Border(
- new BorderPart("top", "black", "thin"),
- new BorderPart("right", "black", "thin"),
- new BorderPart("bottom", "black", "thin"),
- new BorderPart("left", "black", "thin"),
- );
- $style = new Style();
- $style->setCellAlignment("center");
- $style->setBorder($border);
- }
- foreach($data as $row) {
- if (!empty($filter)) {
- foreach ($filter as $key => $value) {
- foreach ($value as $item) {
- if ($item['value'] == $row[$key]) {
- $row[$key] = $item['label'];
- break;
- }
- }
- }
- }
- $rowFromValues = Row::fromValues($row, $style);
- $this->instance->addRow($rowFromValues);
- }
- }
- /**
- * 获取文件
- * @return string
- */
- public function returnFile(): string
- {
- $this->instance->close();
- return $this->filepath;
- }
- }
|