2012-10-04 29 views
5

私は既存のExcel 2003テンプレート(xlt)を編集して新しい* .xlsファイルに保存する簡単なC#アプリケーションをやっています。それは次のようである:excel 2003ファイルを保存する

Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open("\\my_template.xlt"); 
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[0]; 

それから私は、ファイル 内の様々な式で使用されているいくつかのセルを変更し、新しいファイルにテンプレートを保存します。

workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal); 
workbook.Close(true, misValue, misValue); 
app.Quit(); 

worksheet = null; 
workbook = null; 
app = null; 

だから、問題はそのときに新しいファイルであります私はそれを開いて、私が編集したセルを使用している数式の結果が "#NAME"のようになっていることを確認してください。ファイルを再オープンすると、すべて正常になります。それはなぜ起こるのですか?

多分私は間違った方法でファイルを保存しているので、最初に開いている間にエラーが表示されるのはなぜですか?この問題は、2003年の事務所の場合にのみ現実のものです...私が認めているように。

+0

? –

+3

どのように細胞を編集していますか? – oberfreak

答えて

3

としてはxlWorkbookNormalxlExcel8代わりのに列挙を変更、hereを述べたが、これは正しい形式で保存されます。

第2に、参照値をnullに設定しても.Netでは実際に何もしません.VB6と似ていません。ガベージコレクタは参照が使用されなくなったときにいつでも把握するのに十分スマートです。

第三に、あなたはネット4以上使用している場合、あなたはワークブックを閉じる方法のオプションの引数の値を指定する必要はありませんので、これは全く同じように動作します:

workbook.Close(true); 

を最後に、あなたはワークシートとしてワークシートをキャストする必要はありません、あなただけのこの操作を行うことができます:あなたが完了したら、アプリケーションオブジェクトを解放するためにマーシャルを使用し、

Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

最後にもう一つの思考を、またはExcelがでたむろしますあなたのタスクマネージャーは永遠に(おそらくあなたがtryブロック内でやる必要があることをしてからfinallyブロック内でこの):

Marshal.ReleaseComObjct(app); 

方法のバージョンを更新しましたが、以下である:

あなたが参照している相互運用機能アセンブリバージョン
Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application(); 

try 
{ 
    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Open(@"\my_template.xlt"); 
    Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Sheets[0]; 

    //Do stuff 

    workbook.SaveAs("newfile.xls", Microsoft.Office.Interop.Excel.XlFileFormat..xlExcel8); 
    workbook.Close(true); 
    app.Quit(); 
} 
finally 
{ 
    Marshal.ReleaseComObject(app); 
} 
+0

後であなたのアドバイスをテストし、ここで結果を報告してください! – TakinosaJi

+0

それは私を助けません..... – TakinosaJi

+0

よく 'xlExcel8'はExcel 2003ブックを保存する正しい列挙型です、あなたは' Value'または 'Value2'プロパティで値を設定していますか? – JMK

関連する問題