Преобразование файла powerpoint из .ppt -> .pptx с использованием битового потока с использованием c # .net 2008 - PullRequest
1 голос
/ 02 августа 2010

Я пытаюсь создать и открыть powerpoint, используя двоичные данные из базы данных sql, используя linq.

A.Сначала я читаю его в байтовый массив, а затем создаю файл .ppt.

public bool createPresentation(string fileName, byte[] powerPoint)
    {
        DirectoryInfo di = new DirectoryInfo(downloadPath);
        if (!di.Exists)
            di.Create();

        fileName = string.Concat(downloadPath, fileName,".PPT");
        //Define a new instance of FileStream
        FileStream powerpointStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite);
       powerpointStream.Write(powerPoint, 0, powerPoint.Count());
       powerpointStream.Close();

        return True; 
    }

B.Затем я пытаюсь открыть файл .ppt и сохранить его как файл .pptx

public bool convertPPTtoPPTX(string path)
    {
        string source = path;
        string destination = path.Replace("PPT", "PPTX");

        DirectoryInfo di = new DirectoryInfo(downloadPathPPTX);
        if (!di.Exists)
            di.Create();

        PowerPoint.Application app = new PowerPoint.Application();//Line Y

        PowerPoint.Presentation pptx = app.Presentations.Open(source, MsoTriState.msoFalse, MsoTriState.msoTrue, MsoTriState.msoFalse);//Line Z
        pptx.SaveAs(destination, PowerPoint.PpSaveAsFileType.ppSaveAsDefault);
        pptx.Close();
        app.Quit();

       return true;
    }

C.Наконец, я пытаюсь прочитать файл .pptx в порядке байтового массива, чтобы обновить БД через linq.

    public byte[] convertToBinary(string source)
    {
        byte[] binary = File.ReadAllBytes(source);
        return binary;
    }

E.Вот как я получаю двоичные данные через linq-sql

public List<Template> getPPTFileBiniary(int ID)
    {
        var ppt = from p in db.paPresentationTemplates
                  where p.ID==ID
                  select new Template { pptFile = p.PPTFile.ToArray() };

        return ppt.ToList();
    }

F.Класс шаблона, используемый в E

class Template
{
    public int ID { get; set; }
    public string  FileName { get; set; }
    public Byte[] pptFile { get; set; }

    public Template()
    { 

    }

}

У меня есть несколько проблем, связанных с этим.

  1. Для следующего потока байтов я получаю сообщение об ошибке:PowerPoint не может открыть файл. "от часть B Линия Z .байтовые данные: «0x00000000000000000000» Почему это так?
  2. Для некоторых экземпляров среды выполнения снова выдается следующее исключение из Часть B Строка Y .«Создание экземпляра компонента COM с CLSID {91493441-5A91-11CF-8700-00AA0060263B} из IClassFactory не удалось из-за следующей ошибки: 80010108».Но когда я отлаживаю с помощью клавиши F11, это исключение не выдается.Может кто-нибудь объяснить это?
  3. Также в некоторых случаях при вызове части B выдается исключение, в котором говорится, что «файл powerpoint используется другой программой / приложением».Когда powerpoint даже не работает в моих процессах управления задачами.

Пожалуйста, помогите мне преодолеть эти барьеры.Спасибо, Ясинду.

1 Ответ

1 голос
/ 09 августа 2010

Я выяснил причину 1-й части моего вопроса, а также решение для моего 2-го вопроса.

Q1:
Это происходит потому, что сохраненный битовый поток файла ppt представляет собой поврежденныйфайл.Поэтому после создания его нельзя открыть.

Q2: ошибка возникает, когда я всегда пытаюсь создать новый экземпляр приложения внутри цикла.Поэтому: 1. Я создал экземпляр в верхней части моего класса и отключил вызов метода app.Quit ().2. Закрыв объект Power Point, я убедился, что объект был уничтожен, сравнив его со значением Null. (Pptx = null;)

Q3 все еще вызывает у меня сомнения и был бы благодарен за любую помощь экспертизы..

...