Я пытаюсь использовать удивительную библиотеку DocX на codeplex для создания текстового документа.
, когда пользователь нажимает кнопку, документ создается, и я хочу иметь возможностьотправить его пользователю немедленно через ответ .. Я делаю что-то похожее на это сейчас:
Отредактированный код на основе предложений
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();
}
Я пробовал нескольковарианты этого .. но я не могу достичь того, что я хочу .. Глядя на этот ответ Возможно, я могу сохранить документ на сервере и открыть с потоком IO ... но я хочу избежать этогошаг (а потом мне тоже нужно удалить файл)
Не вижу смысла создавать файл за несколько миллисекунд ... должен быть способ сохранить содержимое и отправить его в ответстрим .. правильно?
Как бы я поступил?спасибо ..
РЕДАКТИРОВАТЬ: мой текущий код либо выдает не удается открыть файл ошибка (доступ запрещен) Если я использую поток файлов, ИЛИ загружает пустой файл документа без какого-либо содержимого (иногда, тип ответа записывается вдокумент)
Этот код дает мне документ MS Word с
System.IO.MemoryStream
в качестве его содержимого.
Хорошо, вот окончательное рабочее решение:
По какой-то причине библиотека DocX не хочет сохранять в Response.OutputStream
напрямую, поэтому мне пришлось сохранить ее в потоке памяти и записать поток памяти в ответ, например Neil & Daniel предложено.Вот что сработало для меня:
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();