所以我正在做一些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语句之外分配它所以它应该通过....对吗?
答案 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];
}