2012-01-24 24 views
7

Tôi đang cố gắng sử dụng tuyệt vời DocX library on codeplex để tạo tài liệu từ.lưu tài liệu được tạo bởi docX vào phản hồi và gửi cho người dùng để tải xuống

khi người dùng nhấp vào một nút, các tài liệu được tạo ra và tôi muốn để có thể gửi nó cho người sử dụng ngay lập tức thông qua phản ứng .. Tôi đang làm một cái gì đó tương tự như này ngay bây giờ:

Chỉnh sửa mã dựa trên gợi ý

using (DocX Report = DocX.Create(string.Format("Report-{0}.doc", DateTime.Now.Ticks))) 
{ 
    Paragraph p = Report.InsertParagraph(); 
    p.Append("Title").FontSize(30).Bold() 
    .Append("Sub title").FontSize(28) 
     .AppendLine() 
     .Append(DateTime.Now.Date) 
    ; 

    MemoryStream ms = new MemoryStream(); 
    Report.SaveAs(ms); 


    Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".docx\""); 
    Response.ContentType = "application/msword"; 

    Response.Write(ms); 
    Response.End(); 
} 

tôi đã thử một vài biến thể của việc này .. nhưng tôi không thể đạt được những gì tôi muốn .. Looking at this answer tôi có thể có thể lưu các tài liệu trên máy chủ và cởi mở với io dòng .. nhưng tôi muốn tránh bước bổ sung đó (và sau đó tôi cũng cần xóa tệp)

Tôi không thấy điểm tạo tệp trong vài milli giây .. phải có cách để lưu nội dung và gửi chúng tới luồng phản hồi .. phải không?

Tôi làm cách nào để tìm hiểu? thanks ..

EDIT: mã hiện tại của tôi hoặc ném lên không thể mở tệp (Access denied) error Nếu tôi đang sử dụng luồng tệp, HOẶC tải xuống tệp tài liệu trống mà không có bất kỳ nội dung nào (đôi khi, loại phản hồi được ghi vào tài liệu)


mã này được cho tôi một tài liệu MS Word với System.IO.MemoryStream như nội dung của nó ..


được rồi, đây là giải pháp làm việc cuối cùng:

Vì lý do nào đó, thư viện DocX không muốn lưu trực tiếp vào Response.OutputStream, vì vậy tôi phải lưu nó vào luồng bộ nhớ và ghi luồng bộ nhớ để phản hồi, như Neil & Daniel được đề xuất. Dưới đây là những gì phù hợp với tôi:

MemoryStream ms = new MemoryStream() 
Report.SaveAs(ms); 

Response.Clear(); 
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".doc\"); 
Response.ContentType = "application/msword"; 

ms.WriteTo(Response.OutputStream); 
Response.End(); 
+0

Điều gì sẽ xảy ra với mã hiện tại của bạn? – Stu

+0

@Stu, mã đã chỉnh sửa để trả lời bạn, cảm ơn! – LocustHorde

+0

Tôi đang bối rối mà câu trả lời để chấp nhận, tôi có thể bỏ phiếu cả hai như cả hai đã giúp tôi ... – LocustHorde

Trả lời

2

Hãy thử sử dụng MemoryStream thay vì FileStream.

mã hiện tại của bạn trông thật sự sai:

Bạn đang tiết kiệm báo cáo cho OutputStream của phản ứng hiện tại và sau đó rõ ràng là phản ứng

+0

Xin chào, phản hồi của tôi viết là một chức năng riêng biệt, khi tôi sao chép vào đây để đơn giản hóa, quên sắp xếp lại nó .. Tôi tiếp tục và sửa đổi nó .. Tôi nhận được sự cho phép bị từ chối lỗi và tôi nhận ra tôi không wnat tập tin stream anyway, do đó, nhìn vào dòng bộ nhớ bây giờ .. cảm ơn – LocustHorde

+0

Hi, là dòng bộ nhớ an toàn? nó tiêu thụ quá nhiều ram nếu tôi sử dụng nó cho các tập tin lớn? (tệp khoảng 1 MB)? thanks – LocustHorde

+0

MemoryStream hầu như chỉ đơn giản là một mảng byte []. Vì vậy, không có chi phí lớn trong việc sử dụng nó. Bạn có thể sử dụng nó mà không gặp vấn đề gì ngay cả đối với các tệp lớn. BTW: 1MB không lớn. –

2

Khi bạn làm Report.SaveAs(response.OutputStream); - nó đã viết tập tin (!) nội dung cho luồng đầu ra. Bạn không cần phải làm Response.Write(response.OutputStream);

Vì vậy, bạn mã nên trông như thế này:

... 

Report.SaveAs(response.OutputStream); 
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".doc\""); 
Response.ContentType = "application/msword"; 
1

Tôi nghĩ bạn có nhiều việc một chút sau ra trước và bối rối.

Trước hết, hãy xóa đầu ra, sau đó thêm tiêu đề, sau đó viết nội dung.

Response.Clear(); 
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".doc\""); 
Response.ContentType = "application/msword"; 

// This writes the document to the output stream. 
Report.SaveAs(response.OutputStream); 

Response.End(); 

Ngoài ra, nếu tệp của bạn là tệp định dạng docx, hãy thêm .docx thay vì .doc vào tên tệp của bạn.

+0

Xin chào, cảm ơn, đó là lỗi của tôi, tôi không nhìn vào mã khi tôi dán vào đây để xem nó có ổn không. Tôi đang xem luồng bộ nhớ ngay bây giờ .. cảm ơn – LocustHorde

+0

Tôi không nghĩ rằng bạn _need_ MemoryStream. Mẫu ở trên có cá thể Báo cáo ghi tài liệu trực tiếp vào luồng đầu ra. –

+0

nhưng điều đó thực sự không hoạt động .. đó là lý do tại sao tôi phải dùng đến MemoryStream ... - sử dụng Report.SaveAs (response.OutputStream) cho tôi một lỗi - phương thức không được hỗ trợ – LocustHorde

4

Đây có thể là hơi muộn, nhưng tôi tìm thấy một cách để có được điều này làm việc với FileStreamResult:

public FileStreamResult DownloadDocument() 
    { 
     using (DocX document = DocX.Create(@"Test.docx")) 
     { 
      // Insert a new Paragraphs. 
      Paragraph p = document.InsertParagraph(); 

      p.Append("I am ").Append("bold").Bold() 
      .Append(" and I am ") 
      .Append("italic").Italic().Append(".") 
      .AppendLine("I am ") 
      .Append("Arial Black") 
      .Font(new FontFamily("Arial Black")) 
      .Append(" and I am not.") 
      .AppendLine("I am ") 
      .Append("BLUE").Color(Color.Blue) 
      .Append(" and I am") 
      .Append("Red").Color(Color.Red).Append("."); 

      var ms = new MemoryStream(); 
      document.SaveAs(ms); 
      ms.Position = 0; 

      var file = new FileStreamResult(ms, "application/vnd.openxmlformats-officedocument.wordprocessingml.document") 
      { 
       FileDownloadName = string.Format("test_{0}.docx", DateTime.Now.ToString("ddMMyyyyHHmmss")) 
      }; 

      return file; 

     } 
    } 

Các bit quan trọng là thiết lập vị trí của các MemoryStream trở về 0, nếu không nó dường như là tại cuối cùng, và tập tin đã trở về trống.

Các vấn đề liên quan