将工作簿名称传递给For循环C#

时间:2015-06-19 15:14:05

标签: c# excel if-statement

所以我正在做一些For循环,它遍历从模板导入的不同变量更改,SQL脚本运行,数据转储,循环到下一个SQL脚本等,这是使用相同的模板文件多次完成的(在查询转储的末尾保存为新文件。将其作为背景:

我需要能够在第一次循环时打开模板,然后通过每个查询转储保持打开状态直到完成。我不想继续重新打开这个文件,因为我到目前为止这个文件太大而且很麻烦:

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...

我的问题是代码行&#34; Excel.Worksheet templateSheet = templateBook.Sheets [tabName];&#34;告诉我&#34; templateBook&#34;没有分配,但我在IF语句之外分配它所以它应该通过....对吗?

1 个答案:

答案 0 :(得分: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];
}