悠悠楠杉
ThinkPHP5+PhpSpreadsheet实现批量导出数据
1. 准备工作
首先,确保你的环境中已安装了ThinkPHP5和PhpSpreadsheet。如果未安装PhpSpreadsheet,可以通过Composer进行安装:
bash
composer require phpoffice/phpspreadsheet
2. 创建数据模型
假设你已经有了一个数据库模型来存储文章的数据,这里我们用简单的示例数据:
php
// 示例文章数据
$articles = [
['title' => '文章标题1', 'keywords' => '关键词1', 'description' => '描述1', 'content' => '正文内容1...'],
['title' => '文章标题2', 'keywords' => '关键词2', 'description' => '描述2', 'content' => '正文内容2...'],
// 更多文章...
];
3. 编写导出逻辑
创建一个新的控制器或在现有控制器中添加一个新的方法用于导出数据:
```php
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use think\Controller;
use think\Db;
class ExportController extends Controller {
public function exportMarkdown() {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$rowNumber = 1;
$styleArray = [
'font' => ['bold' => true],
'alignment' => ['horizontal' => Alignment::HORIZONTALCENTER],
'borders' => [
'top' => ['borderStyle' => Border::BORDERTHIN, 'color' => ['argb' => 'FF000000']],
'bottom' => ['borderStyle' => Border::BORDERTHIN, 'color' => ['argb' => 'FF000000']],
]
];
$fillArray = [
'fill' => new Fill([
'startColor' => ['argb' => 'FFCCCCCC'], // 浅灰色背景
'endColor' => ['argb' => 'FFCCCCCC'], // 浅灰色背景(实际上不使用结束颜色)
])
]; // 应用于表头单元格的填充样式。
$sheet->getStyle('A1:D1')->applyFromArray($styleArray); // 设置表头样式并填充颜色。
$sheet->setCellValue('A1', '标题'); // 设置列名。
$sheet->setCellValue('B1', '关键词'); // 设置列名。
$sheet->setCellValue('C1', '描述'); // 设置列名。
$sheet->setCellValue('D1', '正文'); // 设置列名。
$rowNumber++; // 移动到下一行开始写数据。
foreach ($articles as $article) { // 遍历文章数据。
$sheet->getStyle('A' . $rowNumber . ':D' . $rowNumber)->applyFromArray($fillArray); // 对每行应用背景色。
$sheet->setCellValue('A' . $rowNumber, $article['title']); // 写标题。
$sheet->setCellValue('B' . $rowNumber, $article['keywords']); // 写关键词。
$sheet->setCellValue('C' . $rowNumber, $article['description']); // 写描述。
$content = mbsubstr($article['content'], 0, 1000) . '...'; // 取正文前1000字,并添加省略号。
$sheet->setCellValue('D' . $rowNumber, $content); // 写正文。
$rowNumber++; // 移动到下一行。 注:实际上这里已经完成了单篇Markdown文章的生成,但是我们将继续用于生成整个文件。} $writer = new Xlsx($spreadsheet); // 创建XLSX写入器。} return $writer->download('Markdown_Articles.xlsx'); // 导出文件。} } ```