【问题标题】:Accessing an open Excel Workbook in C#在 C# 中访问打开的 Excel 工作簿
【发布时间】:2011-07-13 16:58:48
【问题描述】:

我需要访问一个已经打开的 Excel 文件。我以为只是检查.Workbooks 属性,它会在那里,但事实并非如此。获取对打开的工作簿的引用的正确方法是什么?

var app = new Microsoft.Office.Interop.Excel.Application();

// the count is 0 =(
app.Workbooks.Count == 0;

编辑

我可以通过...获得对 Excel 应用程序的引用

app = (Excel.Application)Marshal.GetActiveObject("Excel.Application");

但是app.Workbooks.Count 仍然是0 为什么它无法获得对打开的工作簿的引用?

【问题讨论】:

    标签: c# excel ms-office office-interop excel-interop


    【解决方案1】:

    检查现有实例,而不是实例化一个新实例:

    try
    {
      Microsoft.Office.Interop.Excel.Application app = 
          System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    }
    catch
    {
      // Excel is not running.
    }
    

    【讨论】:

    • 这似乎引用了 Excel 应用程序 app != nullapp.Workbooks.Count 仍然是 0。为什么它没有获得对打开的工作簿的引用?
    • Excel 互操作可能很烦人。最重要的是确保您始终释放 Excel 应用程序对象。否则,您将运行 EXCEL.exe 的幽灵实例。因此,关闭所有 Excel 实例,然后再次尝试该代码。最后,阅读这篇文章,了解如何正确发布 Excel support.microsoft.com/default.aspx?scid=kb;EN-US;317109
    • 另外,请参阅此线程以进行适当的清理和讨论:stackoverflow.com/questions/158706/…
    • 我不认为我的问题与发布应用程序有关,尽管该链接有所帮助...但我什至无法访问打开的工作簿。我可以访问 Excel 应用程序本身,但我找不到工作簿
    • 验证 - 您是否检查了在任务管理器中打开了多少 Excel 实例?
    【解决方案2】:

    试试这个代码:

    using Excel = Microsoft.Office.Interop.Excel;
    
    public Excel.Application xlApp;
    public Excel.Workbook xlWorkBook;
    public Excel.Worksheet xlWorkSheet;
    
    public void ExcelTransferData()
    {
       xlApp = new Microsoft.Office.Interop.Excel.Application();
       xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    
       foreach (Excel.Workbook item in xlApp.Workbooks)
       {
            //Select the excel target 'NAME'
            if (item.Name == "Template.xlsx")
            {
                xlWorkBook = item; 
                break;
            }
    
            //Select the target workbook
            xlWorkSheet = xlWorkBook.Sheets[1] as Excel.Worksheet;
            //Set cell value
            xlWorkSheet.Cells[5, 1] = "davinceleecode";
       }
    }
    

    【讨论】:

      【解决方案3】:
       String constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+txtSourceFile.Text+";Extended Properties='Excel 8.0;HDR=YES;';";
              String constr2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtLibrary.Text + ";Extended Properties='Excel 8.0;HDR=YES;';";
      
              OleDbConnection con = new OleDbConnection(constr);
              OleDbConnection con2 = new OleDbConnection(constr2);
              OleDbConnection con3 = new OleDbConnection(constr);
      
              OleDbCommand oconn = new OleDbCommand("Select * From [eudra$]", con);
              OleDbCommand oconn2 = new OleDbCommand("Select * From [Sheet1$]", con2);
              OleDbCommand oconn3 = new OleDbCommand("Select * From [eudra$] where EXAMPARM in ('with one or more serious adverse events','with one or more non-serious adverse events that met the incidence cutoff')", con);
      
              if (txtSourceFile.Text != "")
              {
                  con.Open();
                  con2.Open();
                  con3.Open();
      
                  OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
                  OleDbDataAdapter sda2 = new OleDbDataAdapter(oconn2);
                  OleDbDataAdapter sda3 = new OleDbDataAdapter(oconn3);
      
      
                  DataTable data = new DataTable();
                  sda.Fill(data);
      
                  DataTable data2 = new DataTable();
                  sda2.Fill(data2);
      
                  DataTable data3 = new DataTable();
                  sda3.Fill(data3);
      
                  var test = JoinDataTables(data, data2, (row1, row2) => (row1.Field<string>("BODY_SYS").ToUpper() == row2.Field<string>("Term").ToUpper() ));
      
                  data3.Merge(test, true);
      
                  dgvImp.DataSource = data3;
                  con.Close();
              }
      

      【讨论】:

        【解决方案4】:

        第一个函数IsXlFileOpen会告诉你excel文件是否打开 与否。

        第二个函数 GetXlSheet 将为您提供 Excel 应用程序, 工作簿和工作表输出,您可以从那里开始编码。

        using System.Collections.Generic;
        using System.IO;
        using System.Linq;
        using wf = System.Windows.Forms;
        using xl = Microsoft.Office.Interop.Excel;
        
        public static class ExcelTest
        {   
            public xl.Application xlApp = null;
            public xl.Workbook xlWb = null;
            public xl.Worksheet xlWs = null;
        
            public static bool IsXlFileOpen(string xlFileName)
            {       
                try
                {       
                    if (!File.Exists(xlFileName))
                    {
                        wf.MessageBox.Show("Excel File does not exists!");
                        return false;
                    }
        
                    try
                    {
                        xlApp = (xl.Application)Marshal.GetActiveObject("Excel.Application");
                    }
                    catch (Exception ex)
                    {
                        return false;
                    }
        
                    foreach (xl.Workbook wb in xlApp.Workbooks)
                    {
                        if (wb.FullName == xlFileName)
                        {
                            xlWb = wb;
                            return true;
                        }
                    }
        
                    return false;
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
        
            public static void GetXlSheet(string xlFileName,
                                            string xlSheetName)
            {
                try
                {
                    if (!File.Exists(xlFileName))
                    {
                        wf.MessageBox.Show("Excel File does not exists!");
                        return false;
                    }
        
                    xlApp = (xl.Application)Marshal.GetActiveObject("Excel.Application");
                    foreach (xl.Workbook wb in xlApp.Workbooks)
                    {
                        if (wb.FullName == xlFileName)
                        {
                            if (!xlWb
                                .Sheets
                                .Cast<xl.Worksheet>()
                                .Select(s => s.Name)
                                .Contains(xlSheetName))
                            {
                                wf.MessageBox.Show("Sheet name does not exist in the Excel workbook!");
                                return;
                            }
                            xlWs = xlWb.Sheets[xlSheetName];
                        }
                    }
                }
                catch (Exception ex)
                {
                    // catch errors
                }
            }   
        }
        

        【讨论】:

          【解决方案5】:

          添加到 Armbrat 的解决方案中;这对我有用:

          // To use currently running instance of Excel 
          Excel.Application objApp = 
          (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
              Excel.Workbooks objBooks;    
              Excel._Workbook objBook;
                      
          objBooks = objApp.Workbooks;    // Adds to the workbooks collection - objBooks.Count will now == 1
          
          objBook = objBooks["Name of workbook"]; // No filename extension, just the name shown in the workbook window title bar
          

          【讨论】:

            【解决方案6】:

            我知道它的老问题,但我只是发布我的解决方案 我的解决方案是

            1. 在 excel 应用程序对象处执行“Marshal.GetActiveObject”
            2. 如果没有找到工作簿
            3. 然后,释放 excel 应用程序 hwnd 并再次获取活动对象 希望对你有帮助

            【讨论】:

              【解决方案7】:
              // creating Excel Application
              Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
              
              // creating new WorkBook within Excel application
              Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
              
              // creating new Excelsheet in workbook
              Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
              
              // see the excel sheet behind the program
              app.Visible = true;
              
              // get the reference of first sheet. By default its name is Sheet1.
              // store its reference to worksheet
              worksheet = workbook.Sheets["Sheet1"];
              worksheet = workbook.ActiveSheet;
              
              // changing the name of active sheet
              worksheet.Name = "Exported from gridview";
              
              try
              {
                  // storing header part in Excel
                  for (int i = 1; i < dgvRESULTS.Columns.Count + 1; i++)
                  {
                      worksheet.Cells[1, i] = dgvRESULTS.Columns[i - 1].HeaderText;
                      worksheet.Cells[1, i].Interior.Color = System.Drawing.Color.LightYellow;
                  }
              
                  // storing Each row and column value to excel sheet
                  for (int i = 0; i < dgvRESULTS.Rows.Count - 1; i++)
                  {
                      for (int j = 0; j < dgvRESULTS.Columns.Count; j++)
                      {
                          if (dgvRESULTS.Rows[i].Cells[j].Value != null)
                          {
                              worksheet.Cells[i + 2, j + 1] = dgvRESULTS.Rows[i].Cells[j].Value.ToString();
                              //worksheet.Cells[i + 2, j + 1].Interior.Color = System.Drawing.ColorTranslator.ToOle(dgvRESULTS.Rows[i].DefaultCellStyle.BackColor);
                          }
                          else
                          {
                              worksheet.Cells[i + 2, j + 1] = "";
                          }
                      }
                  }
              }
              catch(NullReferenceException ne)
              {
              }
              string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
              // save the application
              workbook.SaveAs(filePath +"\\output.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
              
              // Exit from the application
              app.Quit();
              

              【讨论】:

              • 这个答案似乎与问题无关。
              猜你喜欢
              • 2014-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-10-08
              相关资源
              最近更新 更多