我對此有着難以置信的困難,但我需要能夠使用Interop連接到打開的Excel文件,然後寫入該文件。C#使用Interop寫入打開的Excel文件
該文件由外部進程打開,然後此應用程序稍後寫入工作簿。我可以讓它打開一個文件並寫入活動工作簿。但我找不到連接到以前的工作簿並編寫的方法。
我一直在使用Marshal.GetActiveObject
,但我很快就會在打開多個文件的計算機上運行應用程序,並且需要寫入最有可能不是活動文件的應用程序。
我對此有着難以置信的困難,但我需要能夠使用Interop連接到打開的Excel文件,然後寫入該文件。C#使用Interop寫入打開的Excel文件
該文件由外部進程打開,然後此應用程序稍後寫入工作簿。我可以讓它打開一個文件並寫入活動工作簿。但我找不到連接到以前的工作簿並編寫的方法。
我一直在使用Marshal.GetActiveObject
,但我很快就會在打開多個文件的計算機上運行應用程序,並且需要寫入最有可能不是活動文件的應用程序。
我無法找到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");
@ user1892538打開的文件所處的模式。它獲取對已打開的Excel應用程序的引用。 – Slai
這似乎是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中建議的那樣。
試試這種方式。
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());
}
}
}
}
https://msdn.microsoft.com/en-us/library/office/bb448854.aspx –
是Excel應用程序實例的「外部過程」嗎? – Slai
也許這會幫助你,[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 ) –