首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的Office应用程序word

C#中的Office应用程序word
EN

Stack Overflow用户
提问于 2016-07-27 12:40:25
回答 4查看 1.2K关注 0票数 0

我试着从几个word文档中创建很多PDF文档。不幸的是,我无法关闭/清理(垃圾收集)。因此内存消耗大量,最终程序转储。

这是我的密码。我希望你们聪明的人能引导我找到解决方案。

代码语言:javascript
复制
//**************************************************************
// Please notice:
//
// this.Files is an array with filepath and filenames e.g.:
// {"x:\doc\doc1.doc", "x:\doc\doc2.doc",...,"x:\doc\docn.doc"}.
//
// Please notice:
//**************************************************************


public void wordToPDF() {

    string LS_fileName = "";
    string LS_fileExtension = "";
    string LS_PDF = ".pdf";

    try
    {
        foreach (string Filename in this.Files)
        {
            LS_fileName = Path.GetFileName( Filename );
            if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
            { 
                // Convert to PDF:
                Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();
                wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
                LS_fileExtension = Path.GetExtension(Filename);

                LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );                  int i = 0;
                foreach (string value in this.Files)
                {
                    if (value == Filename)
                    {
                         this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
                         break;
                    }
                    i++;
                }
                wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine("getFiles Hello I must be going.");
    }
}
}

//更新1:

代码语言:javascript
复制
public void wordToPDF() {

    string LS_fileName = "";
    string LS_fileExtension = "";
    string LS_PDF = ".pdf";
    int i = 0;

    MSWORD.Application appWord = new MSWORD.Application();

    try
    {
        foreach (string Filename in this.Files)
            {
                LS_fileName = Path.GetFileName( Filename );
                    if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
                    { 
                        // Convert to PDF:
                        wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
                        LS_fileExtension = Path.GetExtension(Filename);

                        LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );
                        i = 0;
                        foreach (string value in this.Files)
                        {
                            if (value == Filename)
                            {
                               this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
                                break;
                            }
                            i++;
                            }
                            wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
                    }
    }
}
    catch (Exception ex)
    {
        Console.WriteLine("getFiles Hello I must be going.");
        System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
    wordDocument.Close();
    if (appWord != null)
    {
        appWord.Quit();
        appWord = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}
    System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);
wordDocument.Close();
    if (appWord != null)
    {
        appWord.Quit();
        appWord = null;
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.WaitForPendingFinalizers();
    }
}

//更新2:

代码语言:javascript
复制
public void wordToPDF() 
{

    string LS_fileName = "";
    string LS_fileExtension = "";
    string LS_PDF = ".pdf";
    object missingType = Type.Missing;
    object SaveChanges = Type.Missing;
    object OriginalFormat = Type.Missing;
    object RouteDocument = Type.Missing;

    MSWORD.Application appWord = new MSWORD.Application();

    try
    {
        foreach (string Filename in this.Files)
            {
                LS_fileName = Path.GetFileName( Filename );
                    if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
                    { 
                            // Convert to PDF:
            wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
                            LS_fileExtension = Path.GetExtension(Filename);

                            LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );
                            int i = 0;
                            foreach (string value in this.Files)
                            {
                                if (value == Filename)
                                {
                                    this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
                                    break;
                                }
                                i++;
                            }
                            wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);

                            wordDocument.Close();
                    }
                }
    }
            catch (Exception ex)
            {
                Console.WriteLine("getFiles Hello I must be going.");
                System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);

                if (appWord != null)
                {
                    appWord.Quit();
                    appWord = null;
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
            }
            System.Runtime.InteropServices.Marshal.ReleaseComObject(appWord);

            appWord.Quit(ref object SaveChanges = Type.Missing, ref object OriginalFormat);
            if (appWord != null)
            {
                appWord = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-29 07:30:33

显然,退出winword应用程序不起作用。Hense应用了一种更基本的解决方案:

代码语言:javascript
复制
Process[] processes = Process.GetProcessesByName("winword");
foreach (var process in processes)
{
    try
    {
        process.Kill();
    }
    catch (Exception)
    {
    // handle the exception...                    
    }

}
// That solved the problem.
// Thanks for your help :-).
票数 0
EN

Stack Overflow用户

发布于 2016-07-27 13:56:29

1)试着把这条线移出你的回路。(foreach (string Filename in this.Files))

代码语言:javascript
复制
 Microsoft.Office.Interop.Word.Application appWord = new Microsoft.Office.Interop.Word.Application();

2)在循环结束时关闭所有Documents (foreach (string Filename in this.Files)),这将关闭所有Word窗口,或者您可以保存保存文档的链接并关闭它。

编辑:

代码语言:javascript
复制
foreach (string Filename in this.Files)
        {
            LS_fileName = Path.GetFileName( Filename );
                if (Path.GetExtension( Filename ) == ".doc" || Path.GetExtension( Filename ) == ".docx")
                { 
                    // Convert to PDF:
                    wordDocument = appWord.Documents.Open(GlobalVar.TempFiles + LS_fileName);
                    LS_fileExtension = Path.GetExtension(Filename);

                    LS_fileName = LS_fileName.Replace( LS_fileExtension, LS_PDF );
                    i = 0;
                    foreach (string value in this.Files)
                    {
                        if (value == Filename)
                        {
                           this.Files[i] = this.Files[i].Replace(LS_fileExtension, LS_PDF);
                            break;
                        }
                        i++;
                        }
                        wordDocument.ExportAsFixedFormat(GlobalVar.TempFiles + LS_fileName, MSWORD.WdExportFormat.wdExportFormatPDF);
                       wordDocument.Close(missing, missing, missing);
                }
}

描述:由于word模型,word是一个只有一个主体Microsoft.Office.Interop.Word.Application的应用程序--它包含所有在运行时打开的文档,这些文档看起来像一个独立的应用程序(windows),但它们不是。

票数 2
EN

Stack Overflow用户

发布于 2016-07-27 12:51:09

确保在释放COM对象之前关闭文档和应用程序,然后释放并可能强制使用GC.Collect()。

编辑:如果您多次使用word,只要启动word一次并打开文件进行pdf导出,然后逐个关闭即可。最后关闭wordApp。

Edit2:每次启动内环时,都应该将i重置为0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38613260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档