2017-02-16 63 views
0

我對此有着難以置信的困難,但我需要能夠使用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 ) –

回答

3

我無法找到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

1

這似乎是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中建議的那樣。

0

試試這種方式。

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