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 = ' <table class="table" bordered="1"> <tr> <th>GroupId</th> <th>VignetteText</th> </tr> '; while($row = $stmt -> fetch()) { $output .= ' <tr> <td>'.$row["decknumber"].'</td> <td>'.$row["vtext"].'</td> </tr> '; } $output .= '</table>'; header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment; filename='.$groupname.'deck'.$i.'.xls'); echo $output; } } else { echo "Not set!!!"; }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
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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
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 đó
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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
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?
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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
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?
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; $iprepare("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 $. = '
';
}
đầ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();
// }
}
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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 Jacques1- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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 tệp excel của tôi có dữ liệu nhưng nó chỉ kết xuất Bảng HTML và không ở định 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
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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).
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
- Dung dịch
đá
Đăng ngày 3 tháng 9 năm 2017
đá
- guru
- 4. 3k
- 93
- Đị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
<?php 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 = 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 đó
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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
<?php 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 = 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
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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
<?php 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 = 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 ??
- Trích dẫn
Liên kết để bình luậnChia sẻ trên các trang web khác
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