2013-10-23 72 views
0

我想將數據導出到Excel模板。工作簿中有多個選項卡。我想要導出到的工作表標籤被稱爲「可行性」。問題是:如何導出到此特定的工作表名稱?導出到特定的Excel工作表名稱

using Excel = Microsoft.Office.Interop.Excel; 

//excel output variables 
    private string excelFileName = SqlDB.GetFolderTemplates() + SqlDB.GetFileEngOrd(); 
    private static Excel.Application xlsApp; 
    private static Excel.Workbooks workbooks; 
    private static Excel.Workbook workbook; 
    private Excel.Worksheet worksheet; 

private void btnFeasibility_Click(object sender, EventArgs e) 
    { 
     xlsApp = new Excel.ApplicationClass(); 
     if (xlsApp == null) 
     { 
      MessageBox.Show(Constants.EXCEL_INSTALL); 
      return; 
     } 

     try 
     { 

      xlsApp.Visible = true; 
      workbooks = xlsApp.Workbooks; 
      workbook = xlsApp.Workbooks.Open(excelFileName); 
//PROBLEM IS HERE -- HOW CAN I GO TO THE WORKSHEET NAMED "FEASIBILITY" 
      worksheet = (Excel.Worksheet)workbook.Sheets[1]; 
      worksheet.Select(); 

      worksheet.Cells[3, 4] = newEngOrd.CustName; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     finally 
     { 
      //release excel 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); 
      worksheet = null; 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); 
      workbook = null; 
      System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp); 
      xlsApp = null; 

      GC.GetTotalMemory(false); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
      GC.GetTotalMemory(true); 

      MessageBox.Show("Export Complete"); 
     } 

    } 
+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

好的 - 學到了一些新的感謝。 – maverick07281975

回答

0

運行a查看所有工作表,查看名稱是否匹配。

int foundNr=-1; 
InteropExcel.Sheets sheets = workbook.Sheets; 
InteropExcel.Sheet tempSheet = null; 
for (int sheetIndex = 1; sheetIndex <= sheets.Count; sheetIndex++) 
{ 
    tempSheet = (InteropExcel.Worksheet)sheets[sheetIndex]; 
    if (tempSheet.Name == "Feasibility") 
    { 
    foundNr = sheetIndex; 
    Marshal.FinalReleaseComObject(tempSheet); 
    tempSheet = null;   
    break 
    } 

    Marshal.FinalReleaseComObject(tempSheet); 
    tempSheet = null; 
} 

if (foundNr != -1) 
{ 
    sheet = (InteropExcel.Worksheet)sheets[foundNr]; 
} 

我的發佈方式是給你的COM變量賦空值。然後,如果在finally語句中它不爲null,則調用FinalReleaseComObject。即使方法中存在異常,它也會被釋放。

Excel process not closing

InteropExcel.Sheets sheets = null 
try 
{ 
    sheets = ....; 
} 
finally 
{ 
    if (sheets != null) 
    { 
    Marshal.FinalReleaseComObject(sheets); 
    sheets = null; 
    } 
} 
+0

這找到了工作表並導出到它。但是,Excel.exe仍處於打開狀態,並未關閉。任何其他想法?我不想在Excel.exe上殺人 – maverick07281975

+0

該鏈接涵蓋了大部分你必須注意的事情。總結:1)確保你釋放了所有的Interop變量。 2)不要重複使用/重新分配任何變量。首先釋放它。 3)不要使用可變內部結構。 (a.b = x;而是c = a.b; c = x;然後釋放c)。3)註釋所有代碼並加回,直到它不釋放。然後你知道你的問題在哪裏。 –

+0

我在導出到所有打開的excel進程ID的excel之前做了一個散列表。導出後,然後殺死不在散列表中的進程ID。不優雅,但它的作品。 – maverick07281975