【问题标题】:Export to specific Excel worksheet name导出到特定的 Excel 工作表名称
【发布时间】:2013-10-23 14:46:09
【问题描述】:

我正在尝试将数据导出到 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");
        }

    }

【问题讨论】:

标签: c# excel


【解决方案1】:

对所有工作表运行 for 查看,看看名称是否匹配。

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];
}

我发布的方式是将 null 分配给您的 COM 变量。然后,如果 finally 语句中它不为 null,则调用 FinalReleaseComObject。这样,即使方法中有异常,它也会被释放。

Excel process not closing

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

【讨论】:

  • 这找到了工作表并导出到它。但是,Excel.exe 仍处于打开状态而不是关闭状态。还有其他想法吗?我不想杀死 Excel.exe
  • 该链接涵盖了您需要注意的大部分内容。摘要:1)确保释放所有互操作变量。 2) 不要重复使用/重新分配任何变量。先放出来。 3) 不要在结构中使用变量。 (a.b = x;而不是 c = a.b;c = x;然后释放 c。) 3) 注释所有代码并添加回来,直到它不释放。然后你就知道你的问题出在哪里了。
  • 我最终制作了一个哈希表,然后将所有打开的 excel 进程 ID 导出到 excel。导出后,我会杀死不在哈希表中的进程 ID。不优雅,但它有效。
  • 找到每一个要释放的变量对我来说是一项艰巨的工作,但它在没有杀死线程的情况下释放了 Excel,即使对于非常复杂的 Excel 处理也是如此。我做了类似的事情来杀死应用程序/停止调试。 stackoverflow.com/questions/3342941/…
【解决方案2】:

您是否尝试过 Name 属性? 检查此工作表文档:http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.worksheet_members.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多