2015-06-19 45 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]; 
}