Tôi đang làm việc trên một số mã tạo ra một máy chủ bảng tính Excel và sau đó tải xuống nó cho người dùng. Tôi đang sử dụng ExcelPackage để tạo tệp.Tải xuống tệp .xlsx bằng Response.TransmitFile()
Thế hệ đang hoạt động tốt. Tôi có thể mở các tập tin được tạo ra bằng cách sử dụng Excel 2007 mà không có vấn đề gì. Tuy nhiên, tôi đang gặp sự cố khi tải xuống tệp với Response.TransmitFile()
.
Ngay bây giờ, tôi có đoạn mã sau:
//Generate the file using ExcelPackage
string fileName = generateExcelFile(dataList, "MyReportData");
Response.AddHeader("content-disposition", "attachment;filename=FileName.xls");
Response.ContentType = "application/vnd.xls"
Response.Charset = "";
Response.TransmitFile(fileName);
Khi Excel 2007 mở tập tin tải về như trên, nó mang lại cho các "định dạng file không phù hợp với phần mở rộng" cảnh báo. Sau khi nhấp vào cảnh báo, Excel sẽ hiển thị nội dung xml thô của tệp.
Nếu tôi thay đổi phần mở rộng tập tin, như vậy
Response.AddHeader("content-disposition", "attachment;filename=FileName.xlsx");
Excel 2007 đưa ra một "Excel tìm thấy nội dung không thể đọc được trong tập tin" lỗi, tiếp theo là một hộp thoại cung cấp để xác định vị trí một bộ chuyển đổi trên web. Nếu tôi nhấp vào "không" trên hộp thoại này, Excel là có thể tải dữ liệu.
Tôi cũng đã thử nghiệm với các loại MIME khác nhau, như application/vnd.ms-excel
và application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
, được kết hợp với các đuôi tệp .xls và .xlsx. Tất cả các kết hợp đều dẫn đến một trong hai hành vi nêu trên.
Kết hợp chính xác của phần mở rộng tệp và loại MIME để sử dụng trong trường hợp này là gì? Điều gì khác có thể gây ra lỗi này, ngoại trừ loại MIME hoặc phần mở rộng không đúng?
FYI, điều này xảy ra với máy chủ web phát triển tích hợp của Visual Studio. Tôi chưa thử với IIS.
Thiết header Content-Length đã làm các trick. Cách khác, gọi Response.End() sau khi TransmitFile() cũng làm việc. Vì vậy, tôi đoán trình duyệt không biết kết thúc của phản hồi là ở đâu? – Odrade
Nếu không đặt tiêu đề Content-Length hoặc gọi Response.End(), trình duyệt chắc chắn hiểu sai kích thước tệp và lưu quá nhiều dữ liệu vào tệp. Cảm ơn đã giúp đỡ! – Odrade
Độ dài nội dung chắc chắn là cách để đến đây. Tôi đã tìm thấy một số thông tin hữu ích về Response.End() trên blog của Rick Strahl nên được chia sẻ với khách truy cập trong tương lai của trang này: http://west-wind.com/weblog/posts/368975.aspx – Odrade