C#使用Interop写入打开的Excel文件

问题描述:

我对此有着难以置信的困难,但我需要能够使用Interop连接到打开的Excel文件,然后写入该文件。C#使用Interop写入打开的Excel文件

该文件由外部进程打开,然后此应用程序稍后写入工作簿。我可以让它打开一个文件并写入活动工作簿。但我找不到连接到以前的工作簿并编写的方法。

我一直在使用Marshal.GetActiveObject,但我很快就会在打开多个文件的计算机上运行应用程序,并且需要写入最有可能不是活动文件的应用程序。

+0

https://msdn.microsoft.com/en-us/library/office/bb448854.aspx –

+0

是Excel应用程序实例的“外部过程”吗? – Slai

+0

也许这会帮助你,[http://stackoverflow.com/questions/16722339/writing-to-an-existing-excel-file-using-c-sharp](http://stackoverflow.com/questions/16722339 /写入到现有的excel文件使用c-sharp)[使用C#写入Excel](http://stackoverflow.com/questions/19933135/writing-to-excel-using-c-sharp ) –

我无法找到C#另类,但也可以使用GetObject(它也打开,如果没有找到该文件)

object o = Microsoft.VisualBasic.Interaction.GetObject(@"C:\x.xlsx", "Excel.Application"); 
var wb = o as Microsoft.Office.Interop.Excel.Workbook; 
if (wb != null) 
{ 
    Microsoft.Office.Interop.Excel.Application xlApp = wb.Application; 
    // your code 
} 

更新

我用ILSpy看什么GetObject呢,但这不是我所期望的。

object o = System.Runtime.InteropServices.Marshal.BindToMoniker(@"C:\x.xlsx"); 
+0

@ user1892538打开的文件所处的模式。它获取对已打开的Excel应用程序的引用。 – Slai

这似乎是C#版本

using Excel = Microsoft.Office.Interop.Excel; 
Excel.Application excel = null; 
try 
{ 
    excel = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
} 
catch (COMException exc) 
{ 
// .... 
} 

明显假设该文件是由同一机器上的Excel应用程序中打开。

的一点是,Marshal.GetActiveObject总是返回它发现腐第一实例(running object table)。这是因为Office不注册新对象。你必须从子窗口获得应用程序,就像在这个更复杂的answer中建议的那样。

试试这种方式。

Microsoft.Office.Interop.Excel.Application oXL; 
Microsoft.Office.Interop.Excel._Workbook oWB; 
Microsoft.Office.Interop.Excel._Worksheet oSheet; 
Microsoft.Office.Interop.Excel.Range oRng; 
object misvalue = System.Reflection.Missing.Value; 
try 
{ 
    //Start Excel and get Application object. 
    oXL = new Microsoft.Office.Interop.Excel.Application(); 
    oXL.Visible = true; 

    //Get a new workbook. 
    oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add("")); 
    oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet; 

    //Add table headers going cell by cell. 
    oSheet.Cells[1, 1] = "First Name"; 
    oSheet.Cells[1, 2] = "Last Name"; 
    oSheet.Cells[1, 3] = "Full Name"; 
    oSheet.Cells[1, 4] = "Salary"; 

    //Format A1:D1 as bold, vertical alignment = center. 
    oSheet.get_Range("A1", "D1").Font.Bold = true; 
    oSheet.get_Range("A1", "D1").VerticalAlignment = 
     Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter; 

    // Create an array to multiple values at once. 
    string[,] saNames = new string[5, 2]; 

    saNames[0, 0] = "John"; 
    saNames[0, 1] = "Smith"; 
    saNames[1, 0] = "Tom"; 

    saNames[4, 1] = "Johnson"; 

    //Fill A2:B6 with an array of values (First and Last Names). 
    oSheet.get_Range("A2", "B6").Value2 = saNames; 

    //Fill C2:C6 with a relative formula (=A2 & " " & B2). 
    oRng = oSheet.get_Range("C2", "C6"); 
    oRng.Formula = "=A2 & \" \" & B2"; 

    //Fill D2:D6 with a formula(=RAND()*100000) and apply format. 
    oRng = oSheet.get_Range("D2", "D6"); 
    oRng.Formula = "=RAND()*100000"; 
    oRng.NumberFormat = "$0.00"; 

    //AutoFit columns A:D. 
    oRng = oSheet.get_Range("A1", "D1"); 
    oRng.EntireColumn.AutoFit(); 

    oXL.Visible = false; 
    oXL.UserControl = false; 
    oWB.SaveAs("c:\\test\\test505.xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, 
     false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
     Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); 

    oWB.Close(); 

从这里:

How to write some data to excel file(.xlsx)

此外,检查了这一点。

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace WindowsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       System.Data.OleDb.OleDbConnection MyConnection ; 
       System.Data.OleDb.OleDbCommand myCommand = new System.Data.OleDb.OleDbCommand(); 
       string sql = null; 
       MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='c:\\csharp.net-informations.xls';Extended Properties=Excel 8.0;"); 
       MyConnection.Open(); 
       myCommand.Connection = MyConnection; 
       sql = "Insert into [Sheet1$] (id,name) values('5','e')"; 
       myCommand.CommandText = sql; 
       myCommand.ExecuteNonQuery(); 
       MyConnection.Close(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show (ex.ToString()); 
      } 
     } 
    } 
}