0

以下は、ワークシートをコピーして新しいファイルとして保存するコードです。実際には、環境が Office 2003、Windows Server 2003 のローカルにマクロなしで保存されます。

しかし、サーバーではマクロで保存しますが、これは望ましくありません環境はOffice 2003、Windows Server 2008です

C#:

try
            {
                wBook = xCel.Workbooks.Open(ExcelPath);                
                wSheet = (Excel.Worksheet)wBook.Worksheets.get_Item(1);                    
                wSheet.Copy(Type.Missing, Type.Missing);                    
                wSheet = (Excel.Worksheet)wBook.Sheets[1];
                wSheet.SaveAs(ExcelCopyPath);
             }

            catch {}
            finally
            {                
                if (wBook != null)
                {                    
                    wBook.Close();
                    wSheet = null;
                    wBook = null;
                    Thread.Sleep(500);
                }
                if (Excel.ProcessID > 0)
                 {

                    Process pxCel = Process.GetProcessById(Excel.ProcessID);
                    pxCel.Kill();
                 }

                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();                
                try { Marshal.FinalReleaseComObject(wSheet);}
                catch {}                                        
                try { Marshal.FinalReleaseComObject(wBook);}
                catch {}                
            }

私の問題を確認してください...そしていくつかの答えを提案してください。ありがとう

4

1 に答える 1

0

次のように例外をログに記録します。

try
{
    wBook = xCel.Workbooks.Open(ExcelPath);                
    wSheet = (Excel.Worksheet)wBook.Worksheets.get_Item(1);                    
    wSheet.Copy(Type.Missing, Type.Missing);                    
    wSheet = (Excel.Worksheet)wBook.Sheets[1];
    wSheet.SaveAs(ExcelCopyPath);
 }

catch(Exception ex) 
{
    using(var sw = new StreamWriter(@"C:\temp\mylog.txt", true))
    {
        sw.WriteLine("First catch block");
        sw.WriteLine(ex.Message);
    }
}
finally
{                
    if (wBook != null)
    {                    
        wBook.Close();
        wSheet = null;
        wBook = null;
        Thread.Sleep(500);
    }
    if (Excel.ProcessID > 0)
     {

        Process pxCel = Process.GetProcessById(Excel.ProcessID);
        pxCel.Kill();
     }

    GC.Collect();
    GC.WaitForPendingFinalizers();
    GC.Collect();
    GC.WaitForPendingFinalizers();                
    try { Marshal.FinalReleaseComObject(wSheet);}
catch(Exception ex) 
{
    using(var sw = new StreamWriter(@"C:\temp\mylog.txt", true))
    {
        sw.WriteLine("Second catch block");
        sw.WriteLine(ex.Message);
    }
}                                     
    try { Marshal.FinalReleaseComObject(wBook);}
catch(Exception ex) 
{
    using(var sw = new StreamWriter(@"C:\temp\mylog.txt", true))
    {
        sw.WriteLine("Third catch block");
        sw.WriteLine(ex.Message);
    }
}              
}

実際にはNLogのようなロギングフレームワークを使用する必要がありますが、これは短期的には役立つはずです。これでは問題は解決しませんが、少なくとも今C:\temp\mylog.txtは何が問題になっているのかを開いて確認できるようになり、問題の診断に役立ちます。空のキャッチブロックを使用すると、何が問題になっているのかを把握できないため、問題を解決できなくなります。

于 2013-03-19T14:26:18.613 に答える