PHP xuất nhiều trang tính Excel
Để cho phép xuất có nhiều trang tính, nên sử dụng mối quan tâm Show 1 0 có thể thực hiện các mối quan tâm như 1, 2,1 Thao tác này hiện sẽ tải xuống xlsx của tất cả hóa đơn trong năm 2018, với 12 trang tính đại diện cho mỗi tháng trong năm Gần đây tôi phải tạo một bản xuất dữ liệu lớn cho một dự án. Tôi thích sử dụng gói Simple Excel của Spatie để thực hiện việc này vì nó rất đơn giản để sử dụng và hoạt động tốt khi xuất một lượng lớn dữ liệu sang tệp CSV hoặc Excel với khả năng truyền tải xuống trình duyệt. Tuy nhiên, dự án cụ thể này có một yêu cầu bổ sung, xuất dữ liệu của nhiều trang tính cùng một lúc. May mắn thay, gói này cũng cho phép bạn làm điều này Đối tượng nhà vănGói Simple Excel sử dụng gói box/spout dưới mui xe. Trong readme, nó nói rằng bạn có thể truy cập vào người viết bên dưới bằng cách sử dụng 3
Nếu chúng tôi chuyển đến tài liệu gói hộp/vòi, có một phần trên. Các tài liệu cho thấy chúng ta có thể xem cách lấy trang tính hiện tại, đặt tên cho trang tính hiện tại và cách tạo trang tính mới Đặt tên cho một bảng tínhĐể đặt tên cho một trang tính, chúng ta có thể sử dụng 4 để lấy trang tính hiện tại với người viết và sau đó sử dụng 5 để đặt tên
Tạo một bảng tính mớiĐể tạo một trang tính mới, chúng tôi có thể sử dụng 6 và sau đó chúng tôi có thể sử dụng 5 một lần nữa để đặt tên cho trang tính mới này
Mang tất cả lại với nhauBây giờ chúng tôi biết cách thực hiện các nhiệm vụ riêng lẻ mà chúng tôi có thể kết hợp tất cả lại với nhau
Để biết thêm thông tin về cách tạo tệp xuất trong Laravel, hãy xem Sử dụng Bộ sưu tập tài nguyên Laravel với tệp xuất Khi tạo một trang tính, gói Simple Excel thường tạo hàng tiêu đề cho chúng tôi, nhưng có vẻ như khi bạn tạo một trang tính mới, bạn cần xác định các tiêu đề mới cho dữ liệu của mình Thứ nhất, vòng lặp bên dưới không hoạt động như mong đợi, tôi không thể xuất thành nhiều tệp excel. Nó xuất và ghi vào cùng một tệp
Thứ hai, sau khi xuất, tôi gặp lỗi bên dưới trong tệp. Yêu cầu của tôi là xuất dữ liệu sang một tệp excel riêng trên mỗi lần lặp của vòng lặp. Vì vậy, ai đó có thể giúp tôi với những vấn đề này không. Tôi không thể tìm ra vấn đề ở đâu if(isset($_GET['groupname'], $_GET['decks'], $_GET['rows'])) { $groupname = $_GET['groupname']; $decks = $_GET['decks']; $rows = $_GET['rows']; $pickdeckrows = $rows/$decks; for($i=1; $i<=$decks; $i++){ $stmt = $dbconnect->prepare("SELECT v.decknumber, v.vtext FROM decks v WHERE v.groupname =:groupname LIMIT :pickdeckrows"); $stmt -> bindValue(':groupname', $groupname); $stmt -> bindValue(':pickdeckrows', $pickdeckrows); $stmt -> execute(); ob_end_clean(); $output = '
lỗi
1. Lưu ý. ob_end_clean(). không thể xóa bộ đệm. Không có bộ đệm để xóa 2. Cảnh báo. Không thể sửa đổi thông tin tiêu đề - tiêu đề đã được gửi bởi (tiêu đề đầu tiên) 3. Cảnh báo. Không thể sửa đổi thông tin tiêu đề - tiêu đề đã được gửi bởi (tiêu đề thứ hai)
Cảm ơn
Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn Jacques1Đăng ngày 3 tháng 9 năm 2017 Jacques1
Đăng ngày 3 tháng 9 năm 2017 Bạn dường như không hiểu cách thức hoạt động của HTTP
Bạn có thể gửi một phản hồi bằng một tệp duy nhất*. Nếu bạn muốn người dùng tải xuống nhiều tệp, bạn phải đặt chúng vào kho lưu trữ hoặc hiển thị trang nơi có thể tải xuống từng tệp một
* Về lý thuyết, có nhiều thông điệp, nhưng tôi sẽ tránh xa những thử nghiệm đó Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn Jacques1Đăng ngày 3 tháng 9 năm 2017 Jacques1
Đăng ngày 3 tháng 9 năm 2017 Thành thật mà nói, tôi không biết bạn đang làm gì ở đó. Bạn chạy đi chạy lại cùng một truy vấn, mỗi lần bạn tạo cùng một bảng HTML, sau đó bạn cố giả vờ rằng bảng HTML này là một bảng tính Excel
Bạn mong đợi gì từ điều này ngoài một tập hợp các tệp giống hệt nhau, tất cả đều chứa nội dung vô nghĩa? Liên kết để bình luậnChia sẻ trên các trang web khácNhiều tùy chọn chia sẻ hơn sắc tháiĐăng ngày 3 tháng 9 năm 2017 sắc thái
Đăng ngày 3 tháng 9 năm 2017
Trên thực tế, tôi đã không bao gồm mã để xóa các hàng được xuất. Dưới đây là mã mà tôi đã thử và nó hoạt động tốt khi xuất một lần. Nhưng tôi muốn xuất nó cho đến khi vòng lặp kết thúc if(isset($_GET['tên nhóm'], $_GET['bộ bài'], $_GET['hàng'])) {
$groupname = $_GET['groupname']; $boong = $_GET['boong']; $rows = $_GET['rows']; $pickdeckrows = $rows/$decks;
// for($i=1; $i<=$decks; $i++){
$stmt = $dbconnect->prepare("CHỌN v. số boong, v. vtext TỪ sàn v WHERE v. tên nhóm =. tên nhóm GIỚI HẠN. cuốc chim"); $stmt -> bindValue('. tên nhóm', $tên nhóm); $stmt -> bindValue('. pickdeckrows', $pickdeckrows); $stmt -> thực thi();
ob_end_clean();
đầu ra $ = ' ID nhóm | Văn bản |
'; while($row = $stmt -> tìm nạp()) { đầu ra $. = ' '. $row["số boong"]. ' | '. $row["vtext"]. ' |
'; } đầu ra $. = ' |
tiêu đề ('Loại nội dung. đơn/đồng. MS Excel');
tiêu đề ('Bố trí nội dung. tập tin đính kèm; . $groupname. 'boong. xls');
tiếng vang $ đầu ra;
$stmtdelete = $dbconnect->prepare("XÓA TỪ sàn Ở ĐÂU tên nhóm =. tên nhóm GIỚI HẠN. cuốc chim");
$stmtdelete -> bindValue('. tên nhóm', $tên nhóm);
$stmtdelete -> bindValue('. pickdeckrows', $pickdeckrows);
$stmtdelete -> thực thi();
// }
}
Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
Jacques1
Đăng ngày 3 tháng 9 năm 2017
Jacques1
- Các thành viên
- 4. 2k
- 189
- Chia sẻ
Đăng ngày 3 tháng 9 năm 2017 (đã chỉnh sửa)
Đọc câu trả lời. Và, không, điều này không ổn. Một số ứng dụng có thể đủ thông minh để nhận ra rằng bảng HTML giả làm bảng tính của bạn thực ra là một bảng HTML nên được nhập, nhưng điều đó không thay đổi được thực tế là khai báo kiểu là vô nghĩa và dẫn đến lỗi bất cứ lúc nào
Nếu bạn muốn có một bảng tính, thì hãy phục vụ một bảng tính. Có một số thư viện có thể tạo tệp hợp lệ. Nhưng sau đó một lần nữa. Đọc câu trả lời
Đã chỉnh sửa ngày 3 tháng 9 năm 2017 bởi Jacques1Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
sắc thái
Đăng ngày 3 tháng 9 năm 2017
sắc thái
- Các thành viên
- 40
- Tác giả
- Chia sẻ
Đăng ngày 3 tháng 9 năm 2017
Đọc câu trả lời. Và, không, điều này không ổn. Một số ứng dụng có thể đủ thông minh để nhận ra rằng bảng HTML giả làm bảng tính của bạn thực ra là một bảng HTML nên được nhập, nhưng điều đó không thay đổi được thực tế là khai báo kiểu là vô nghĩa và dẫn đến lỗi bất cứ lúc nào
Nếu bạn muốn có một bảng tính, thì hãy phục vụ một bảng tính. Có một số thư viện có thể tạo tệp hợp lệ. Nhưng sau đó một lần nữa. Đọc câu trả lời
Được rồi, tôi hiểu ý của bạn. Tôi thấy file excel của mình có dữ liệu nhưng nó chỉ là kết xuất HTML Table chứ không phải ở dạng bảng tính. Tôi thấy có Thư viện PHP Excel. Tôi sẽ sử dụng nó nhưng một lần nữa yêu cầu của tôi là tạo nhiều tệp excel và người dùng không thể thực hiện thủ công vì sẽ có hơn 10 tệp excel và họ muốn nó được tạo tự động
Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
Jacques1
Đăng ngày 3 tháng 9 năm 2017
Jacques1
- Các thành viên
- 4. 2k
- 189
- Chia sẻ
Đăng ngày 3 tháng 9 năm 2017
Tôi đã nói là có hai lựa chọn. Hai. Nếu bạn không muốn người dùng tải các tệp xuống một cách riêng biệt, thì hãy sử dụng một kho lưu trữ ( . zip , . hắc ín. gz , sao cũng được).
Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
- Dung dịch
đá
Đăng ngày 3 tháng 9 năm 2017
đá
- guru
- 4. 3k
- 92
- Địa điểm. Bonita, Florida
- Lứa tuổi. 36
- Dung dịch
- Chia sẻ
Đăng ngày 3 tháng 9 năm 2017
Đối với việc tạo các tệp "excel", nếu bạn không cần bất kỳ tính năng ưa thích nào như nhiều trang tính, định dạng, v.v. thì tôi thường thấy việc tạo tệp CSV là dễ nhất. Loại tệp thường được ánh xạ tới chương trình bảng tính của người dùng (có thể là excel, open office, bất cứ thứ gì) và dễ dàng tạo/kiểm tra
prepare("SELECT v.decknumber, v.vtext FROM decks v WHERE v.groupname =:groupname LIMIT :pickdeckrows"); $stmt->bindValue(':groupname', $groupname); $stmt->bindValue(':pickdeckrows', $pickdeckrows); $stmt->execute(); ob_end_clean(); $output = fopen('php://memory', 'w+'); $length = fputcsv($output, [ 'GroupId' , 'Text' ]); while($row = $stmt -> fetch()){ $length += fputcsv($output, [ $row["decknumber"] , $row["vtext"] ]); } header('Content-Type: text/csv'); header('Content-length: '.$length); header('Content-Disposition: attachment; filename='.$groupname.'deck.csv'); rewind($output); fpassthru($output); fclose($output); $stmtdelete = $dbconnect->prepare("DELETE FROM decks WHERE groupname =:groupname LIMIT :pickdeckrows"); $stmtdelete -> bindValue(':groupname', $groupname); $stmtdelete -> bindValue(':pickdeckrows', $pickdeckrows); $stmtdelete -> execute(); //} }Và như đã đề cập, nếu bạn cần cung cấp nhiều tệp trong một yêu cầu, hãy đóng gói chúng vào một kho lưu trữ. sau đó phục vụ tập tin đó
Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
sắc thái
Đăng ngày 3 tháng 9 năm 2017
sắc thái
- Các thành viên
- 40
- Tác giả
- Chia sẻ
Đăng ngày 3 tháng 9 năm 2017
Đối với việc tạo các tệp "excel", nếu bạn không cần bất kỳ tính năng ưa thích nào như nhiều trang tính, định dạng, v.v. thì tôi thường thấy việc tạo tệp CSV là dễ nhất. Loại tệp thường được ánh xạ tới chương trình bảng tính của người dùng (có thể là excel, open office, bất cứ thứ gì) và dễ dàng tạo/kiểm tra
prepare("SELECT v.decknumber, v.vtext FROM decks v WHERE v.groupname =:groupname LIMIT :pickdeckrows"); $stmt->bindValue(':groupname', $groupname); $stmt->bindValue(':pickdeckrows', $pickdeckrows); $stmt->execute(); ob_end_clean(); $output = fopen('php://memory', 'w+'); $length = fputcsv($output, [ 'GroupId' , 'Text' ]); while($row = $stmt -> fetch()){ $length += fputcsv($output, [ $row["decknumber"] , $row["vtext"] ]); } header('Content-Type: text/csv'); header('Content-length: '.$length); header('Content-Disposition: attachment; filename='.$groupname.'deck.csv'); rewind($output); fpassthru($output); fclose($output); $stmtdelete = $dbconnect->prepare("DELETE FROM decks WHERE groupname =:groupname LIMIT :pickdeckrows"); $stmtdelete -> bindValue(':groupname', $groupname); $stmtdelete -> bindValue(':pickdeckrows', $pickdeckrows); $stmtdelete -> execute(); //} }Và như đã đề cập, nếu bạn cần cung cấp nhiều tệp trong một yêu cầu, hãy đóng gói chúng vào một kho lưu trữ. sau đó phục vụ tập tin đó
Cảm ơn đã cung cấp thông tin. Có, tôi thực sự không cần định dạng và nhiều trang tính. Tôi phát hiện ra rằng ứng dụng chỉ có thể hỗ trợ định dạng tệp CSV
Yêu cầu chính không chỉ là xuất thành nhiều tệp. Người dùng sau đó chọn một trong các tệp được tạo vào ứng dụng của họ. Vì vậy, nếu tôi tạo nó thành một kho lưu trữ thì một lần nữa tôi phải giải nén và cung cấp cho họ để lựa chọn. Vì vậy, bạn có thể vui lòng cho tôi biết nếu đây là cách duy nhất tôi có thể làm điều đó?
Cảm ơn
Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
sắc thái
Đăng ngày 4 tháng 9 năm 2017
sắc thái
- Các thành viên
- 40
- Tác giả
- Chia sẻ
Đăng ngày 4 tháng 9 năm 2017
Đối với việc tạo các tệp "excel", nếu bạn không cần bất kỳ tính năng ưa thích nào như nhiều trang tính, định dạng, v.v. thì tôi thường thấy việc tạo tệp CSV là dễ nhất. Loại tệp thường được ánh xạ tới chương trình bảng tính của người dùng (có thể là excel, open office, bất cứ thứ gì) và dễ dàng tạo/kiểm tra
prepare("SELECT v.decknumber, v.vtext FROM decks v WHERE v.groupname =:groupname LIMIT :pickdeckrows"); $stmt->bindValue(':groupname', $groupname); $stmt->bindValue(':pickdeckrows', $pickdeckrows); $stmt->execute(); ob_end_clean(); $output = fopen('php://memory', 'w+'); $length = fputcsv($output, [ 'GroupId' , 'Text' ]); while($row = $stmt -> fetch()){ $length += fputcsv($output, [ $row["decknumber"] , $row["vtext"] ]); } header('Content-Type: text/csv'); header('Content-length: '.$length); header('Content-Disposition: attachment; filename='.$groupname.'deck.csv'); rewind($output); fpassthru($output); fclose($output); $stmtdelete = $dbconnect->prepare("DELETE FROM decks WHERE groupname =:groupname LIMIT :pickdeckrows"); $stmtdelete -> bindValue(':groupname', $groupname); $stmtdelete -> bindValue(':pickdeckrows', $pickdeckrows); $stmtdelete -> execute(); //} }Và như đã đề cập, nếu bạn cần cung cấp nhiều tệp trong một yêu cầu, hãy đóng gói chúng vào một kho lưu trữ. sau đó phục vụ tập tin đó
Sử dụng giải pháp của bạn, khi tôi xuất, nó đang xuất dưới dạng chỉ mục. php chứ không phải dưới dạng tệp csv. Tại sao vậy ??
Liên kết để bình luận
Chia sẻ trên các trang web khác
Nhiều tùy chọn chia sẻ hơn
sắc thái
Đăng ngày 5 tháng 9 năm 2017
sắc thái
- Các thành viên
- 40
- Tác giả
- Chia sẻ
Đăng ngày 5 tháng 9 năm 2017
Được chứ. Được hiểu là trang xuất của tôi là một phần của trang Chỉ mục của tôi, nội dung của trang chỉ mục đã bị hủy. Vì vậy, để giải quyết vấn đề này, tôi đã chỉ bản xuất của mình sang một trang độc lập và hiện tại quá trình tải xuống csv đang hoạt động hoàn hảo
Tôi cũng đã đọc từ một diễn đàn khác rằng "Tôi không thể nhổ nhiều tệp cùng lúc để tải xuống. Đó là hạn chế của giao thức http và PHP không thể giải quyết vấn đề đó trừ khi tôi lưu nhiều tệp vào đĩa, sau đó nén chúng và cung cấp tệp zip HOẶC sử dụng một loạt chuyển hướng tiêu đề để lấy các tệp theo thứ tự tuần tự. "
Vì vậy, tôi đoán rằng tôi không có lựa chọn nào khác ngoài việc nén tất cả các tệp và sau đó có thể giải nén và cung cấp cho người dùng