2017-02-16 7 views
0

저는이 작업에 엄청난 어려움을 겪고 있지만 Interop을 사용하여 열린 Excel 파일에 연결 한 다음 해당 파일에 쓸 수 있어야합니다.C# Interop을 사용하여 열린 Excel 파일에 쓰기

파일은 외부 프로세스에서 열어 나중에이 응용 프로그램에서 나중에 통합 문서에 쓸 수 있습니다. 파일을 열고 활성 통합 문서에 쓸 수 있습니다. 하지만 이전 통합 문서에 연결하고 작성하는 방법을 찾을 수 없습니다.

나는 Marshal.GetActiveObject을 사용하고 있었지만, 곧 여러 파일이 열려있는 컴퓨터에서 응용 프로그램을 실행하고있을 가능성이 높고 활성화되어 있지 않은 응용 프로그램에 쓸 필요가 있습니다.

+0

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

+0

는 "외부 처리"엑셀 응용 프로그램 인스턴스입니까? – Slai

+0

아마도 도움이 될 것입니다. [http://stackoverflow.com/questions/16722339/writing-to-an-existing-excel-file-using-c-sharp](http://stackoverflow.com/questions/16722339)/writing-to-existing-excel-file-using-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 
} 

업데이트

내가 GetObject이 무엇을보고 ILSpy을 사용 (또한 발견되지 않는 경우는 파일이 열립니다) , 그러나 그것은 내가 예상했던 것이 아니었다.

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

@ user1892538 열린 파일이있는 모드입니다. 열어 본 Excel 응용 프로그램에 대한 참조를 가져옵니다. – Slai

1

이 분명 파일이 같은 기계에 엑셀 응용 프로그램에서 열립니다 가정

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

C# 버전을 것 같다.

그러나 점은 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()); 
      } 
     } 
    } 
}