質問: true; // エクセル終了時の処理 xlsApp.Quit(); //シートオブジェクト開放 System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet); //ブックオブジェクト開放 System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); //エクセルオブジェクト開放 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp); } else { //ファイルがない場合の処理 return; } } ``` fpathはコピー後のファイルパスを変数に代入したものとなっています。 このままだとコピーして作られたファイルがそのまま開かれるようになっています。 順序としてはもとからあるファイルにプログラムでセルの中身を書き、データを渡し、開く。 このとき、もとからあるファイルをコピーして別名で保存するようにしてあります。 そのファイルが作成済みの場合に上書きという形にしたいのです。 ファイルがない場合は、あるコードを取得してきて、そのコードをテキストとして ファイル名に追加するようにしています。
回答: いろいろやっていて解決できたのでこっちに書きます。 ``` public void Excel操作(int denpyo_id) { denpyo_id = 2; // TODO テスト用のため要削除 claim_voucher EX = new claim_voucher(); int err = Common.db.SELECTデータ取得(ref EX, denpyo_id); string Tpath = Common.ファイルパス(); string Fpath = Common.ファイルパス(denpyo_id); bool fileflg = false; // テンプレートファイルのファイル存在チェック if (System.IO.File.Exists(Tpath) == true) { try { // fileflgがfalseで新規作成 fileflg = false System.IO.File.Copy(Tpath, Fpath); // 伝票番号付きファイルのファイル存在チェック if (System.IO.File.Exists(Fpath) == true) { //ファイルがある場合の処理 Worksheet sheet = null; Application xlsApp = null; Workbook wb = null; try { xlsApp = new Application(); //指定したパスのExcelを起動 wb = xlsApp.Workbooks.Open(Fpath); //シートを指定 sheet = wb.Sheets[1]; sheet.Select(); // セルの中身を書く // Excelを開く xlsApp.Visible = true; // Excelダイアログ非表示 wb.Application.DisplayAlerts = false; // Excelの保存 wb.SaveAs(Common.ファイルパス(denpyo_id)); // Excel wb.Application.DisplayAlerts = false; } catch { // Excelファイルの作成に失敗 // エクセル終了時の処理 xlsApp.Quit(); // Excel削除 System.IO.File.Delete(Fpath); } finally { if (sheet != null) { // シートオブジェクト開放 Marshal.ReleaseComObject(sheet); } // ブックオブジェクト開放 Marshal.ReleaseComObject(wb); // エクセルオブジェクト開放 Marshal.ReleaseComObject(xlsApp); } } } catch { // fileflgがtrueで上書き処理 fileflg = true; // ここからはtryの中と同じ } } else { return; } } ```