2010-06-29 51 views
4

我需要能够在PowerPoint 2003中将演示文稿(以编程方式)另存为OpenXML(“.pptx”)。 我安装了Microsoft Office兼容包。这确实使我可以从PowerPoint 2003执行“另存为PowerPoint 2007演示文稿”。以编程方式保存为PowerPoint 2007(pptx),从PowerPoint 2003

如何以编程方式执行此操作? (例如VBA)

我试图Presentation.SaveAs: 虽然有在PowerPoint 2003为ppSaveAsOpenXMLPresentation没有固有PpSaveAsFileType枚举值,我做了一个程序,它打印出PpSaveAsFileType值,结果发现,在运行时,ppSaveAsOpenXMLPresentation = 24

不过,我想: SaveAs(@"c:\temp\saveas\pupik.pptx", (PpSaveAsFileType) ((int) 24), MsoTriState.msoTrue);

,并得到一个“无效枚举值”异常

任何想法如何使这项工作?

(PS - 我知道这个问题已经由几个人在网络上问过,但都没有提供任何解决方案)

感谢, 阿里

回答

4

编辑>一些语法

AFAIK pptx格式不支持启用宏的演示文稿,因此,如果您的代码位于您试图保存的演示文稿中,则不起作用。

我没有手头有Excel 2003了,但如果兼容包启用该选项“PPTX”在配置对话框,默认保存格式,你要保存另一个演示我想你可以的,如果你使用类似:

MyOtherPresentation.SaveAs "C:\Mypres", ppSaveAsDefault 

请注意,如果演示文稿以前没有在ppt格式保存,这可能只是工作

编辑

如果上述不起作用,您可以尝试不同的方法。保存在老格式文件并调用一个转换程序:

ppcnvcom.exe
为例见here(使用wordconv.exe,但本质上是相同的)
一定要拥有所有的办公室升级安装,因为如果不是程序结束 报告没有错误,什么都不做。

OFC
here的说明
here有一个良好的讨论

HTH!

+0

感谢贝利萨留,但我需要的是加载“.PPT”,保存为“.PPTX”所以不幸的是“保存为默认”不起作用。 顺便说一句 - 我的代码不在演示文稿中我试图保存,它是一个C#VSTO程序,所以我没有宏的问题。 – 2010-06-30 09:09:51

+0

@Arie Livshin如果你用另一个名字保存它,它可能会工作。谨慎尝试? – 2010-06-30 11:49:48

+0

我把它保存到原来的名字以外。 – 2010-06-30 14:20:00

3

一个窍门是在注册表中修改应用程序的默认保存格式,然后保存并最后再次恢复原始保存格式。

相关的关键是

Software\Microsoft\Office\11.0\PowerPoint\Options 

与名DefaultFormat创建DWORD值,并将其设置为0×21另存为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

@Arie Livshin这是一个聪明的方法!要在VBA中操作注册表,有几个选项。请在http://www.excelforum.com/excel-programming/531053-read-registry-keys-and-possibly-write.html中查找示例。在编程之前,您可以使用regedit手动尝试。 – 2010-07-06 17:05:42

0

我用ppcnvcom.exe但请注意,与相当数量的职位我只使用-oice开关没有-NMe开关

0

对于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

我知道这是一个老问题,但我解决了最近使用的问题:

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

而不是SaveAs。无论原始格式是ppt还是pptx格式,都可以很好地工作。

(我无法得到提及为我工作的注册表的改变方法,无需重新打开演示文稿。)

相关问题