1

我在正在编写的加载项中保存 PowerPoint 文件时遇到问题。

基本上,我需要将当前打开的演示文稿另存为 wmv,然后通过 FTP 将其传输到外部服务器……听起来很简单吧?

我已经研究出如何将当前打开的演示文稿保存为 wmv。

我还有代码来检查文件是否打开,这样我就可以知道“保存”过程何时完成。

但是代码只是进入了一个无限循环。wmv 开始写入但永远不会超过 0kb。

如果我删除线

checkfile(exportPath, exportName);

它工作得很好......否则它只会停留在一个循环中。

这是我到目前为止的代码......

using System;
using System.Windows.Forms;
using Office = Microsoft.Office.Core;
using PowerPoint = Microsoft.Office.Interop.PowerPoint;
using System.IO;

namespace PowerPointAddIn2
{
public partial class LoginPanel : UserControl
{
    public LoginPanel()
    {
        InitializeComponent();
    }

    private void LoginPanel_Load(object sender, EventArgs e)
    {

    }

    private void btnLogin_Click(object sender, EventArgs e)
    {

        string exportName = "video_of_presentation";
        string exportPath = @"C:\{0}.wmv";

        // Export the currently open presentation
        PowerPoint.Application ppApplication = null;
        ppApplication = new PowerPoint.Application();
        ppApplication.Activate();
        ppApplication.ActivePresentation.SaveAs(String.Format(exportPath, exportName), PowerPoint.PpSaveAsFileType.ppSaveAsWMV, Office.MsoTriState.msoTrue);

        checkfile(exportPath, exportName);

        MessageBox.Show("Finished");

    }

    protected void checkfile(string exportPath, string exportName)
    {
        FileInfo f = new FileInfo(String.Format(exportPath, exportName));
        while (IsFileLocked(f) == true) { System.Threading.Thread.Sleep(5000); }
        MessageBox.Show("Finished");
    }

    protected virtual bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

}

}

根据我发布的先前线程,我还尝试了 Thread.Join() 以查看是否可以在继续之前简单地等待保存线程完成,但是在保存文件时它根本没有暂停,所以我结束了同样的结果。

任何帮助/指针将不胜感激。

谢谢

4

1 回答 1

1

PowerPoint Application 对象有一个 ppMediaTaskStatus 属性,该属性应该返回您需要的信息。您可以使用 PPT VBA IDE 中的对象浏览器获取各种值。

于 2013-07-12T16:54:20.710 回答