Kích thước không phải là một biện pháp tốt cho các tệp sổ làm việc khi làm việc với PHPExcel. Số hàng và cột (tức là ô) quan trọng hơn.
Bản thân mã PHPExcel có dấu chân từ 10 đến 25MB, tùy thuộc vào thành phần nào đang được truy cập.
Hiện tại, mỗi ô trong sổ làm việc tính trung bình 1k bộ nhớ (không có bộ nhớ đệm) hoặc 1.6k trên PHP 64 bit - tôi sẽ giả sử PHP 32 bit cho thời điểm này - vì vậy (ví dụ) bảng tính của 8000 dòng với 31 cột (248.000 ô) sẽ có khoảng 242MB. Với bộ đệm ẩn tế bào (chẳng hạn như php: // temp hoặc DiskISAM), có thể giảm xuống còn khoảng một phần ba, do đó, 8000 dòng của 31 cột sẽ yêu cầu khoảng 80MB.
Có một số tùy chọn có sẵn để giúp bạn giảm mức sử dụng bộ nhớ:
Bạn đang sử dụng bộ đệm ẩn tế bào với PHPExcel?
require_once './Classes/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory:: cache_to_phpTemp;
$cacheSettings = array(' memoryCacheSize ' => '8MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings);
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objPHPExcel = $objReader->load("test.xlsx");
Nếu bạn chỉ cần truy cập vào dữ liệu trong bảng tính của bạn, và không cần phải truy cập vào các định dạng tế bào, sau đó bạn có thể vô hiệu hóa đọc các thông tin định dạng từ workbook:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadDataOnly(true);
$objPHPExcel = $objReader->load("test.xlsx");
Nếu bạn chỉ cần truy cập một số, nhưng không phải tất cả các trang tính trong sổ làm việc, bạn chỉ có thể tải các trang tính đó:
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setLoadSheetsOnly(array("Worksheet1", "Worksheet2"));
$objPHPExcel = $objReader->load("test.xlsx");
nếu bạn chỉ muốn đọc các ô nhất định trong trang tính, bạn c thêm bộ lọc:
class MyReadFilter implements PHPExcel_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;
}
}
$objReader = PHPExcel_IOFactory::createReader('Excel2007');
$objReader->setReadFilter(new MyReadFilter());
$objPHPExcel = $objReader->load("test.xlsx");
Tất cả các kỹ thuật này có thể làm giảm đáng kể yêu cầu bộ nhớ.
Tìm hiểu nội dung trong PHP Excel đang sử dụng quá nhiều bộ nhớ, sau đó sửa nó ..... – SoapBox
@SoapBox: Tóm lại, PHPExcel - đó là một bộ nhớ thực: (Ngoài ra, đây là loại thư viện phức tạp, vì vậy Trong trường hợp xấu nhất, có thể dễ dàng hơn khi bỏ qua vấn đề và tìm một số thư viện thay thế – Piskvor
Trở thành Microsoft Certified, nó chỉ đòi hỏi phải biết cách khởi động lại máy. –