2015-06-19 70 views
2

因此,我正在做一些For循環,這些循環遍歷從模板導入的不同變量更改,SQL腳本運行,數據轉儲,循環到下一個SQL腳本等,完成使用相同的模板文件(這在查詢結束轉儲保存爲一個新文件多次使用,作爲背景。將工作簿名稱傳遞給For循環C#

我需要能夠通過循環打開模板第一次,然後把它通過每個查詢轉儲,直到完成開,我不希望保留重新打開文件作爲其太大而笨重我有這個至今:

public void ExportToExcel(DataSet dataSet, string templatePath) 
    { 
     Excel.Application excelApp = new Excel.Application(); 
     excelApp.Visible = true; 
     FileInfo excelFileInfo = new FileInfo(templatePath); 
     Boolean fileOpenTest = IsFileLocked(excelFileInfo); 

     if (!fileOpenTest) 
     { 
      Excel.Workbook templateBook = excelApp.Workbooks.Open(templatePath); 
     } 
     else 
     { 
      Excel.Workbook templateBook = excelApp.Workbooks[templatePath]; 
     } 

     for (int i = 0; i < lstQueryDumpSheet.Items.Count; i++) 
     {  
      string tabName = lstQueryDumpSheet.Items[i].ToString(); 
      Excel.Worksheet templateSheet = templateBook.Sheets[tabName]; 

      // Copy DataTable 
      foreach (System.Data.DataTable dt in dataSet.Tables) 
      { ... rest of loops... 

我的問題是,代碼行「Excel.Worksheet templateSheet = templateBook.Sheets [tabName];」告訴我,「templateBook」沒有分配,但我在IF語句外分配它,所以它應該通過....右?

回答

3

這是一個範圍問題。您的代碼:

if (!fileOpenTest) 
{ 
    Excel.Workbook templateBook = excelApp.Workbooks.Open(templatePath); 
} 
else 
{ 
    Excel.Workbook templateBook = excelApp.Workbooks[templatePath]; 
} 

在塊內部聲明templateBook變量,因此其範圍僅限於該塊內。要讓變量持續存在於這些塊之外,您需要像這樣在外部聲明它:

Excel.Workbook templateBook; 
if (!fileOpenTest) 
{ 
    templateBook = excelApp.Workbooks.Open(templatePath); 
} 
else 
{ 
    templateBook = excelApp.Workbooks[templatePath]; 
}