【问题标题】:Excel Worksheet Modifying Current Sheet C#Excel工作表修改当前工作表C#
【发布时间】:2011-09-20 19:57:55
【问题描述】:

您是否可以在 Excel 中修改已打开的工作表。他们的 MSDN 页面为您提供以下内容。这每次都会添加一个新的工作簿和工作表。我有代码打开和现有工作表,我只是希望它替换单元格中的值并关闭。非常感谢任何帮助。

using Excel = Microsoft.Office.Interop.Excel; //Excel Reference

 public virtual Object ActiveSheet { get; set; }

 private void button15_Click(object sender, EventArgs e)//Generate Model and Part Numbers
    {
        Excel.Application oXL;
        Excel._Workbook oWB;
        Excel._Worksheet oSheet;

        //Start Excel and get Application object.
        oXL = new Excel.Application();
        oXL.Visible = true;

        //Get a new workbook.
        oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
        oSheet = (Excel._Worksheet)oWB.ActiveSheet;  
        oSheet.Cells[6, 4] = "0"; //Change Value in Cell in Excel Cell Location [y-axis, x-axis]
     }

【问题讨论】:

  • 我打电话给微软,他们要为这个答案向我收取 500 美元,所以任何人都得到了这个表扬!

标签: c# winforms excel


【解决方案1】:

您可以遍历oXL.Workbooks 以访问当前打开的工作簿...当前活动的工作簿可通过oXl.ActiveWorkbook 获得。

编辑 - 根据评论:

在访问ActiveWorkbook之前使用oXL.Windows找到已经打开的窗口并调用Activate或者只是调用oXL.ActiveWindow.Close()oXL.ActiveWindow.ActivatePrevious()来获取已经打开的窗口...

编辑 2 - 根据解决方案的最后部分评论:

使用

oXL = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

【讨论】:

  • 是的,我想我不知道没有对象 ActiveWorkbook,至少我找不到一个
  • 查看我更新的答案和链接 - 有oXl.ActiveWorkbook
  • oXL 是什么 = 那么它不能是新的 Excel.Application 将打开另一个 Excel 窗口并出错。还有什么我可以使 oXL 等于
  • oXL 是新的 Excel 应用程序 - 因为 Excel 不会再次启动(“Singleton”),所以一切都很好......
  • 将它与stackoverflow.com/questions/1118735/… 结合起来 - 如果这不起作用,那么你的 OS/Excel 安装真的很奇怪......你有没有机会尝试从 Windows 服务或第二个“桌面会话” or or ?
【解决方案2】:

这是我想出的,希望对大家有所帮助。感谢所有帮助过的人

 using Excel = Microsoft.Office.Interop.Excel; //Excel Reference   

  public virtual Object ActiveSheet { get; set; }   

  private void button15_Click(object sender, EventArgs e)//Generate Model and Part Numbers   
  {   
        //Gets ActiveSheet to Modify
        Excel.Application oXL;
        Excel.Workbook oWB;
        Excel.Worksheet oSheet;

        //Start Excel and get Active Workbook and Sheet to modify
        oXL = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
        oXL.Visible = true;
        oWB = (Excel.Workbook)oXL.ActiveWorkbook; 
        oSheet = (Excel.Worksheet)oWB.ActiveSheet;   

        //Cell Input
        oSheet.Cells[6, 4] = "0"; //Change Value in Cell in Excel Cell Location [y-axis, x-axis] 
   }   

【讨论】:

    【解决方案3】:

    如果您像下面这样打开,那么您将只创建一个新实例。 oXL = new Excel.Application();

    c# 将创建第二个 excel 进程。通过这种方式,您无法访问任何由用户手动打开的 Excel 应用程序。

    如果您想打开不是由您的应用程序打开的活动工作表,请在此处查看: Get instance of Excel application with C# by Handle

    其他都是一样的:

    oSheet = (Excel._Worksheet)oWB.ActiveSheet; 
    

    如果您想访问通过 c# 实例打开的工作表,则:(.net framework 4)

    using Excel;
    
        Excel.Application oXl = new Excel.Application();
        Workbook oWb = oxl.workbooks.add();
        Worksheet oWs = oWs.Worksheets(1); //As default excel will open 3 worksheet and active worksheet will be first one.
    

    编辑:我没有检查代码块可能是输入错误。

    【讨论】:

    • 这也会打开一个新的应用程序,但不会修改现有打开的文件
    • 知道了,感谢您的帮助。由于 StackOverflow,我无法发布答案
    【解决方案4】:

    放弃互操作类并使用 OLEDB 在工作表上运行更新查询可能会更简单。如果您有兴趣,我可以提供示例。

    【讨论】:

    • 我明白了,感谢您的帮助,由于堆栈溢出,无法发布
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多