2017-02-16 16 views
0

У меня с этим нелепое время, но мне нужно иметь возможность подключиться к открытому файлу excel с помощью Interop, а затем записать в этот файл.C# Запись в открытый файл Excel с помощью Interop

Файл открывается внешним процессом, после чего это приложение приходит позже для записи в книгу. Я могу открыть его, чтобы открыть файл и записать в активную книгу. но я не могу найти способ подключения к предыдущей книге и записи.

Я использовал 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/write-to-an-existing-excel-file-using-c-sharp) [Запись в Excel с использованием C#] (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 
} 

Update

Я использовал ILSpy, чтобы увидеть, что GetObject делает , но это не совсем то, что я ожидал.

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

очевидно предполагая, что файл открыт с помощью приложения первенствовать на же машины.

Но дело в том, что 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()); 
      } 
     } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^