2017-02-16 15 views
0

これでは苦労しますが、Interopを使用して開いているExcelファイルに接続し、そのファイルに書き込む必要があります。C#Interopを使用して開いているExcelファイルに書き込む

ファイルは外部プロセスによって開かれ、このアプリケーションは後でブックに書き込まれます。ファイルを開いてアクティブなワークブックに書き込むことができます。しかし、私は以前のワークブックに接続して書く方法を見つけることができません。

私はを使用していましたが、すぐに複数のファイルが開いているコンピュータでアプリケーションを実行していて、アクティブなものではない可能性が最も高いファイルに書き込む必要があります。私はC#の代替を見つけることはできませんが、GetObjectを使用することができます

+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シャープを使用)[C#を使用してExcelに書き込む](http://stackoverflow.com/questions/19933135/writing-to-excel-using-c-sharp ) –

答えて

3

(見つからない場合は、それはまた、ファイルを開きます)

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 
} 

更新

私はGetObjectが何を見てILSpyを使用しかし、それは私が期待したものではありません。

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) 
{ 
// .... 
} 

のようです。

しかしポイントMarshal.GetActiveObjectは常にそれがROT(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()); 
      } 
     } 
    } 
} 
関連する問題