Программно сохранить как PowerPoint 2007 (pptx) из PowerPoint 2003 - PullRequest
4 голосов
/ 30 июня 2010

Мне нужно иметь возможность сохранять презентации (программно) в PowerPoint 2003 как OpenXML (".pptx"). Я установил пакет обеспечения совместимости Microsoft Office. Это действительно позволяет мне выполнить «Сохранить как презентацию PowerPoint 2007» из PowerPoint 2003.

Как я могу сделать это программно? (например, VBA)

Я пытался Presentation.SaveAs: Хотя в PowerPoint 2003 для ppSaveAsOpenXMLPresentation не присуще значение enum PpSaveAsFileType, я создал программу, которая печатает значения PpSaveAsFileType, и обнаружил, что во время выполнения ppSaveAsOpenXMLPresentation = 24.

Однако я попробовал: SaveAs(@"c:\temp\saveas\pupik.pptx", (PpSaveAsFileType) ((int) 24), MsoTriState.msoTrue);

И получил исключение «Недопустимое значение перечисления»

Есть идеи, как заставить это работать?

(PS. Мне известно, что этот вопрос уже задавался несколькими людьми в Интернете, но решения не предлагались.)

Спасибо, Арье

Ответы [ 5 ]

4 голосов
/ 30 июня 2010

Правка> Немного грамматики

AFAIK формат pptx не поддерживает презентации с поддержкой макросов, поэтому, если ваш код находится в презентации, которую вы пытаетесь сохранить, он не будет работать.

У меня нет Excel 2003 под рукой, но , если в пакете совместимости включена опция "pptx" в диалоге конфигурации, Формат сохранения по умолчанию, , и вы пытаетесь сохранить ДРУГОЕ презентация Я думаю, вы можете, если вы используете что-то вроде:

 MyOtherPresentation.SaveAs "C:\Mypres", ppSaveAsDefault

Обратите внимание, что это может работать, только если презентация не была сохранена ранее в формате ppt

EDIT

Если вышеперечисленное не работает, вы можете попробовать другой подход. Сохраните файл в старом формате и вызовите программу конвертации:

ppcnvcom.exe
См. здесь для примера (с использованием wordconv.exe, но по сути то же самое)
Обязательно установите все обновления для офиса, потому что, если нет, программа заканчивается не сообщая об ошибке и ничего не делая.

OFC
См. здесь для инструкций
И здесь для хорошей дискуссии

НТН!

3 голосов
/ 01 июля 2010

Хитрость заключается в том, чтобы изменить формат сохранения приложения по умолчанию в реестре, затем сохранить и, наконец, восстановить исходный формат сохранения снова.

Соответствующий ключ:

Software\Microsoft\Office\11.0\PowerPoint\Options

Создайте значение DWORD с именем DefaultFormat и установите его 0x21, чтобы сохранить как PPTX.

public void SomeMethod()
{
    ...
    using (PptxSaver pptxSaver = new PptxSaver())
    {
        presentation.SaveAs("sample.pptx")
    }
    ...
}

class PptxSaver : IDisposable
{
    private const string OptionKey = @"Software\Microsoft\Office\11.0\PowerPoint\Options";
    private const string OptionValue = "DefaultFormat";        
    private const int SaveFormatPptx = 0x21;

    private int oldFormat;

    public PptxSaver()
    {
        using (RegistryKey key = Registry.CurrentUser.OpenSubKey(OptionKey, true))
        {
            oldFormat = (int)key.GetValue(OptionValue, -1);
            key.SetValue(OptionValue, SaveFormatPptx, RegistryValueKind.DWord);
        }
    }

    public void Dispose()
    {
        // Delete the value
        using (RegistryKey key = Registry.CurrentUser.OpenSubKey(OptionKey, true))
        {
            if (oldFormat == -1)
            {
                key.DeleteValue(OptionValue);
            }
            else
            {
                key.SetValue(OptionValue, oldFormat);
            }
        }
    }       
}
0 голосов
/ 04 ноября 2016

Я знаю, что это старый вопрос, но я недавно обошел проблему, используя:

Presentation.SaveCopyAs "c:\temp\saveas\pupik.pptx"

вместо SaveAs.Работает хорошо, независимо от того, является ли оригинал в формате ppt или pptx.

(я не мог заставить упомянутый метод изменения реестра работать на меня, не открывая презентацию заново.)

0 голосов
/ 31 января 2013

Для VBA это работает:

Sub TestSaveas()
  SaveAs "c:\somefilepath\"
End sub

Private Sub SaveAs(fp As String)
   Dim dlgSaveAs As FileDialog
   Dim strMyFile As String

   Set dlgSaveAs = Application.FileDialog(msoFileDialogSaveAs)
   With dlgSaveAs
       .InitialFileName = fp
       If .Show = -1 Then
           strMyFile = .SelectedItems(1)
           Application.ActivePresentation.SaveAs strMyFile
           'MsgBox strMyFile
           ''-- save your file to strMyFile here
       Else
           MsgBox "File not saved"
       End If
   End With
   dlgSaveAs.Execute
   Set dlgSaveAs = Nothing
End Sub
0 голосов
/ 15 ноября 2010

Я использовал ppcnvcom.exe, но учтите, что в отличие от значительного количества сообщений я использовал только ключ -oice без ключа -nme

...