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

我有一个可笑的困难时间,但我需要能够连接到一个打开的Excel文件使用互操作,然后写入该文件。

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

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

我找不到C#的替代品,但可以使用GetObject (它也打开文件,如果没有find)

 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"); 

这似乎是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将始终返回它在ROT( 运行对象表 )上find的第一个实例。 这是因为Office不注册新对象。 你必须从子窗口获取应用程序,就像在这个更复杂的答案中提出的一样。

试试这种方式。

 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(); 

从这里:

如何写一些数据到excel文件(.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()); } } } }