Làm cách nào để tạo một tệp Excel động trong PHP?

Khi chúng tôi xuất một trang tính Excel từ PHP hoặc ngôn ngữ khác, trường hợp sử dụng phổ biến nhất là xuất bảng từ cơ sở dữ liệu và đôi khi nó cũng chứa một số thông tin trong đầu trang và chân trang với một số tổng

Tóm lại, chúng tôi có một bảng và một số cột

Đây là cách bạn thực hiện bình thường, bằng cách đặt thủ công từng ký tự cột vào các phần khác nhau của tài liệu, chẳng hạn như

  • tiêu đề
  • hàng
  • tạo kiểu

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Normal way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue['A'.$i, 'Name'];
$sheet->setCellValue['B'.$i, 'Phone'];
$sheet->setCellValue['C'.$i, 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue['A'.$i, $row['name']];
  $sheet->setCellValue['B'.$i, $row['phone']];
  $sheet->setCellValue['C'.$i, $row['city']];
}

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:C'.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle['A3:C3']->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension['A']->setWidth[12];
$sheet->getColumnDimension['B']->setWidth[25];
$sheet->getColumnDimension['C']->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['normal.xlsx'];

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Vấn đề với phương pháp này là nếu bạn muốn thêm các cột mới, bạn sẽ phải dành thời gian đổi tên tất cả các chữ cái. Và bạn cũng sẽ phải nhớ bạn đã gán chữ cái nào cho mỗi cột khi bạn áp dụng kiểu dáng

Vì vậy, nếu bạn muốn thêm cột Company sau

// Load the column names helper
require 'ExCol.php';

ExCol::reset[]; // reset mapping before using

$show_company_column=true;

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Dynamic way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue[ExCol::get['name', $i], 'Name'];
$sheet->setCellValue[ExCol::get['phone', $i], 'Phone'];
if [$show_company_column] {
  $sheet->setCellValue[ExCol::get['company', $i], 'Company'];
}
$sheet->setCellValue[ExCol::get['city', $i], 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue[ExCol::get['name', $i], $row['name']];
  $sheet->setCellValue[ExCol::get['phone', $i], $row['phone']];
  if [$show_company_column] {
    $sheet->setCellValue[ExCol::get['company', $i], $row['company']];
  }
  $sheet->setCellValue[ExCol::get['city', $i], $row['city']];
}

$lastColLetter=ExCol::getLast[];

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:'.$lastColLetter.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle["A3:{$lastColLetter}3"]->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension[ExCol::get['name']]->setWidth[12];
if [$show_company_column] {
  $sheet->getColumnDimension[ExCol::get['company']]->setWidth[35];
}
$sheet->getColumnDimension[ExCol::get['phone']]->setWidth[25];
$sheet->getColumnDimension[ExCol::get['city']]->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['dynamic.xlsx'];
0, bạn sẽ phải đặt nó trên chữ cái
// Load the column names helper
require 'ExCol.php';

ExCol::reset[]; // reset mapping before using

$show_company_column=true;

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Dynamic way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue[ExCol::get['name', $i], 'Name'];
$sheet->setCellValue[ExCol::get['phone', $i], 'Phone'];
if [$show_company_column] {
  $sheet->setCellValue[ExCol::get['company', $i], 'Company'];
}
$sheet->setCellValue[ExCol::get['city', $i], 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue[ExCol::get['name', $i], $row['name']];
  $sheet->setCellValue[ExCol::get['phone', $i], $row['phone']];
  if [$show_company_column] {
    $sheet->setCellValue[ExCol::get['company', $i], $row['company']];
  }
  $sheet->setCellValue[ExCol::get['city', $i], $row['city']];
}

$lastColLetter=ExCol::getLast[];

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:'.$lastColLetter.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle["A3:{$lastColLetter}3"]->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension[ExCol::get['name']]->setWidth[12];
if [$show_company_column] {
  $sheet->getColumnDimension[ExCol::get['company']]->setWidth[35];
}
$sheet->getColumnDimension[ExCol::get['phone']]->setWidth[25];
$sheet->getColumnDimension[ExCol::get['city']]->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['dynamic.xlsx'];
1 và đổi tên cột tiếp theo là
// Load the column names helper
require 'ExCol.php';

ExCol::reset[]; // reset mapping before using

$show_company_column=true;

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Dynamic way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue[ExCol::get['name', $i], 'Name'];
$sheet->setCellValue[ExCol::get['phone', $i], 'Phone'];
if [$show_company_column] {
  $sheet->setCellValue[ExCol::get['company', $i], 'Company'];
}
$sheet->setCellValue[ExCol::get['city', $i], 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue[ExCol::get['name', $i], $row['name']];
  $sheet->setCellValue[ExCol::get['phone', $i], $row['phone']];
  if [$show_company_column] {
    $sheet->setCellValue[ExCol::get['company', $i], $row['company']];
  }
  $sheet->setCellValue[ExCol::get['city', $i], $row['city']];
}

$lastColLetter=ExCol::getLast[];

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:'.$lastColLetter.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle["A3:{$lastColLetter}3"]->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension[ExCol::get['name']]->setWidth[12];
if [$show_company_column] {
  $sheet->getColumnDimension[ExCol::get['company']]->setWidth[35];
}
$sheet->getColumnDimension[ExCol::get['phone']]->setWidth[25];
$sheet->getColumnDimension[ExCol::get['city']]->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['dynamic.xlsx'];
1 thành
// Load the column names helper
require 'ExCol.php';

ExCol::reset[]; // reset mapping before using

$show_company_column=true;

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Dynamic way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue[ExCol::get['name', $i], 'Name'];
$sheet->setCellValue[ExCol::get['phone', $i], 'Phone'];
if [$show_company_column] {
  $sheet->setCellValue[ExCol::get['company', $i], 'Company'];
}
$sheet->setCellValue[ExCol::get['city', $i], 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue[ExCol::get['name', $i], $row['name']];
  $sheet->setCellValue[ExCol::get['phone', $i], $row['phone']];
  if [$show_company_column] {
    $sheet->setCellValue[ExCol::get['company', $i], $row['company']];
  }
  $sheet->setCellValue[ExCol::get['city', $i], $row['city']];
}

$lastColLetter=ExCol::getLast[];

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:'.$lastColLetter.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle["A3:{$lastColLetter}3"]->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension[ExCol::get['name']]->setWidth[12];
if [$show_company_column] {
  $sheet->getColumnDimension[ExCol::get['company']]->setWidth[35];
}
$sheet->getColumnDimension[ExCol::get['phone']]->setWidth[25];
$sheet->getColumnDimension[ExCol::get['city']]->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['dynamic.xlsx'];
3, đồng thời đổi tên ở mọi nơi, không chỉ trong tiêu đề, mà còn trong các hàng

Bạn sẽ nói đó là một nhiệm vụ nhanh chóng, nhưng

  • Nếu bạn có 10-20 cột trở lên thì sao?
  • Điều gì sẽ xảy ra nếu bạn muốn có một số trường hợp khi bạn hiển thị một cột và các trường hợp khác khi bạn muốn ẩn nó dựa trên tùy chọn người dùng khi xuất?

Giải pháp

Được rồi, đó có thể không phải là giải pháp tốt nhất, tôi chắc rằng những người khác có thể nghĩ ra cách tốt hơn để làm điều đó nhưng đây là một cách để tránh mất nhiều thời gian đổi tên cột

// Load the column names helper
require 'ExCol.php';

ExCol::reset[]; // reset mapping before using

$show_company_column=true;

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Dynamic way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue[ExCol::get['name', $i], 'Name'];
$sheet->setCellValue[ExCol::get['phone', $i], 'Phone'];
if [$show_company_column] {
  $sheet->setCellValue[ExCol::get['company', $i], 'Company'];
}
$sheet->setCellValue[ExCol::get['city', $i], 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue[ExCol::get['name', $i], $row['name']];
  $sheet->setCellValue[ExCol::get['phone', $i], $row['phone']];
  if [$show_company_column] {
    $sheet->setCellValue[ExCol::get['company', $i], $row['company']];
  }
  $sheet->setCellValue[ExCol::get['city', $i], $row['city']];
}

$lastColLetter=ExCol::getLast[];

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:'.$lastColLetter.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle["A3:{$lastColLetter}3"]->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension[ExCol::get['name']]->setWidth[12];
if [$show_company_column] {
  $sheet->getColumnDimension[ExCol::get['company']]->setWidth[35];
}
$sheet->getColumnDimension[ExCol::get['phone']]->setWidth[25];
$sheet->getColumnDimension[ExCol::get['city']]->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['dynamic.xlsx'];

Vào chế độ toàn màn hình Thoát chế độ toàn màn hình

Vì vậy, làm thế nào nó hoạt động?

Chà, chúng tôi đã tạo một lớp người trợ giúp nhỏ có tên là

// Load the column names helper
require 'ExCol.php';

ExCol::reset[]; // reset mapping before using

$show_company_column=true;

$spreadsheet = new Spreadsheet[];
$sheet = $spreadsheet->getActiveSheet[];
$sheet->setCellValue['A1', 'Dynamic way of naming Excel columns'];

$i=3;

// Header
$sheet->setCellValue[ExCol::get['name', $i], 'Name'];
$sheet->setCellValue[ExCol::get['phone', $i], 'Phone'];
if [$show_company_column] {
  $sheet->setCellValue[ExCol::get['company', $i], 'Company'];
}
$sheet->setCellValue[ExCol::get['city', $i], 'City'];

// Rows
foreach [$rows as $row] {
  $i++;
  $sheet->setCellValue[ExCol::get['name', $i], $row['name']];
  $sheet->setCellValue[ExCol::get['phone', $i], $row['phone']];
  if [$show_company_column] {
    $sheet->setCellValue[ExCol::get['company', $i], $row['company']];
  }
  $sheet->setCellValue[ExCol::get['city', $i], $row['city']];
}

$lastColLetter=ExCol::getLast[];

// Styling
$lastRowIndex=$i;

$sheet->getStyle['A3:'.$lastColLetter.$lastRowIndex]->applyFromArray[[
    'borders' => [
        'allBorders' => [
            'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN,
        ],
    ],
]];

$sheet->getStyle["A3:{$lastColLetter}3"]->getFill[]
    ->setFillType[\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID]
    ->getStartColor[]->setARGB['FFA0A0A0'];

$sheet->getColumnDimension[ExCol::get['name']]->setWidth[12];
if [$show_company_column] {
  $sheet->getColumnDimension[ExCol::get['company']]->setWidth[35];
}
$sheet->getColumnDimension[ExCol::get['phone']]->setWidth[25];
$sheet->getColumnDimension[ExCol::get['city']]->setWidth[25];

$writer = new Xlsx[$spreadsheet];
$writer->save['dynamic.xlsx'];
4

Tôi biết, tôi có thể đã tìm thấy một cái tên tốt hơn nhưng ít nhất nó ngắn

Chủ Đề