DocX с файловым потоком не сохраняет - PullRequest
0 голосов
/ 03 октября 2011

Итак, для проекта я создаю резюме, и мне нужно сохранить их в файл docx.Это приложение ASP.NET MVC, и для генерации docx я использую libray docx для создания документа.

Я могу создать файл, но файловый поток не добавляетсодержимое, которое я вставил в него.

Вот код, который я использую

public ActionResult CVToWord(int id) 
        {
            var CV = CVDAO.CV.Single(cv => cv.id == id);
            var filename = "CV - " + CV.firstname + " " + CV.name + " - " + CV.creationdate.ToString("dd MM yyyy") + ".docx";
            System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.OpenOrCreate);

            using (DocX doc = DocX.Create(stream)) 
            {
                Paragraph title = doc.InsertParagraph();
                title.Append(CV.firstname + " " + CV.name);
                doc.Save();
            }

            return File(stream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", filename);
        }

Как я уже сказал, это создает файл, но файл не имеет никакого содержимого.У кого-нибудь есть идея, почему?

Ответы [ 3 ]

1 голос
/ 03 октября 2011
public ActionResult CVToWord(int id) 
        {
            var CV = CVDAO.CV.Single(cv => cv.id == id);
            var filename = "CV - " + CV.firstname + " " + CV.name + " - " + CV.creationdate.ToString("dd MM yyyy") + ".docx";

            using (DocX doc = DocX.Create(filename)) 
            {
                Paragraph title = doc.InsertParagraph();
                title.Append(CV.firstname + " " + CV.name);
                doc.Save();
            }

            System.IO.FileStream stream = new System.IO.FileStream(filename, System.IO.FileMode.Open);
            return File(stream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", filename);
        }

Это работает

0 голосов
/ 03 октября 2011

Я бы написал собственный ActionResult для этого:

public class CVResult: ActionResult
{
    private readonly CV _cv;

    public CVResult(CV cv)
    {
        _cv = cv;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
        var filename = "CV - " + _cv.firstname + " " + _cv.name + " - " + _cv.creationdate.ToString("dd MM yyyy") + ".docx";

        var cd = new ContentDisposition
        {
            Inline = false,
            FileName = filename
        };

        using (var doc = DocX.Create(response.OutputStream))
        {
            Paragraph title = doc.InsertParagraph();
            title.Append(_cv.firstname + " " + _cv.name);
            doc.Save();
        }
    }
}

и теперь ваш результат действия больше не загроможден сантехническим кодом:

public ActionResult CVToWord(int id) 
{
    var cv = CVDAO.CV.Single(cv => cv.id == id);
    return new CVResult(cv);
}
0 голосов
/ 03 октября 2011

Я думаю, вам нужно закрыть FileStream:

stream.Close();
...