Accessing an open Excel Workbook in C#

前端 未结 5 1108
情话喂你
情话喂你 2020-12-09 06:51

I need to access an excel file that is already open. I thought just inspecting the .Workbooks property that it would be there but it isn\'t. What is the right w

相关标签:
5条回答
  • 2020-12-09 07:26
    // creating Excel Application
    Microsoft.Office.Interop.Excel._Application app = new Microsoft.Office.Interop.Excel.Application();
    
    // creating new WorkBook within Excel application
    Microsoft.Office.Interop.Excel._Workbook workbook = app.Workbooks.Add(Type.Missing);
    
    // creating new Excelsheet in workbook
    Microsoft.Office.Interop.Excel._Worksheet worksheet = null;
    
    // see the excel sheet behind the program
    app.Visible = true;
    
    // get the reference of first sheet. By default its name is Sheet1.
    // store its reference to worksheet
    worksheet = workbook.Sheets["Sheet1"];
    worksheet = workbook.ActiveSheet;
    
    // changing the name of active sheet
    worksheet.Name = "Exported from gridview";
    
    try
    {
        // storing header part in Excel
        for (int i = 1; i < dgvRESULTS.Columns.Count + 1; i++)
        {
            worksheet.Cells[1, i] = dgvRESULTS.Columns[i - 1].HeaderText;
            worksheet.Cells[1, i].Interior.Color = System.Drawing.Color.LightYellow;
        }
    
        // storing Each row and column value to excel sheet
        for (int i = 0; i < dgvRESULTS.Rows.Count - 1; i++)
        {
            for (int j = 0; j < dgvRESULTS.Columns.Count; j++)
            {
                if (dgvRESULTS.Rows[i].Cells[j].Value != null)
                {
                    worksheet.Cells[i + 2, j + 1] = dgvRESULTS.Rows[i].Cells[j].Value.ToString();
                    //worksheet.Cells[i + 2, j + 1].Interior.Color = System.Drawing.ColorTranslator.ToOle(dgvRESULTS.Rows[i].DefaultCellStyle.BackColor);
                }
                else
                {
                    worksheet.Cells[i + 2, j + 1] = "";
                }
            }
        }
    }
    catch(NullReferenceException ne)
    {
    }
    string filePath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
    // save the application
    workbook.SaveAs(filePath +"\\output.xls", Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    
    // Exit from the application
    app.Quit();
    
    0 讨论(0)
  • 2020-12-09 07:31

    The first function IsXlFileOpen will tell you whether the excel file is open or not.

    The second function GetXlSheet will get you the Excel application, workbook and worksheet output, from where you can start coding.

    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using wf = System.Windows.Forms;
    using xl = Microsoft.Office.Interop.Excel;
    
    public static class ExcelTest
    {   
        public xl.Application xlApp = null;
        public xl.Workbook xlWb = null;
        public xl.Worksheet xlWs = null;
    
        public static bool IsXlFileOpen(string xlFileName)
        {       
            try
            {       
                if (!File.Exists(xlFileName))
                {
                    wf.MessageBox.Show("Excel File does not exists!");
                    return false;
                }
    
                try
                {
                    xlApp = (xl.Application)Marshal.GetActiveObject("Excel.Application");
                }
                catch (Exception ex)
                {
                    return false;
                }
    
                foreach (xl.Workbook wb in xlApp.Workbooks)
                {
                    if (wb.FullName == xlFileName)
                    {
                        xlWb = wb;
                        return true;
                    }
                }
    
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    
        public static void GetXlSheet(string xlFileName,
                                        string xlSheetName)
        {
            try
            {
                if (!File.Exists(xlFileName))
                {
                    wf.MessageBox.Show("Excel File does not exists!");
                    return false;
                }
    
                xlApp = (xl.Application)Marshal.GetActiveObject("Excel.Application");
                foreach (xl.Workbook wb in xlApp.Workbooks)
                {
                    if (wb.FullName == xlFileName)
                    {
                        if (!xlWb
                            .Sheets
                            .Cast<xl.Worksheet>()
                            .Select(s => s.Name)
                            .Contains(xlSheetName))
                        {
                            wf.MessageBox.Show("Sheet name does not exist in the Excel workbook!");
                            return;
                        }
                        xlWs = xlWb.Sheets[xlSheetName];
                    }
                }
            }
            catch (Exception ex)
            {
                // catch errors
            }
        }   
    }
    
    0 讨论(0)
  • 2020-12-09 07:35

    Try this code:

    using Excel = Microsoft.Office.Interop.Excel;
    
    public Excel.Application xlApp;
    public Excel.Workbook xlWorkBook;
    public Excel.Worksheet xlWorkSheet;
    
    public void ExcelTransferData()
    {
       xlApp = new Microsoft.Office.Interop.Excel.Application();
       xlApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    
       foreach (Excel.Workbook item in xlApp.Workbooks)
       {
            //Select the excel target 'NAME'
            if (item.Name == "Template.xlsx")
            {
                xlWorkBook = item; 
                break;
            }
    
            //Select the target workbook
            xlWorkSheet = xlWorkBook.Sheets[1] as Excel.Worksheet;
            //Set cell value
            xlWorkSheet.Cells[5, 1] = "davinceleecode";
       }
    }
    
    0 讨论(0)
  • 2020-12-09 07:40

    Instead of instantiating a new instance, check for an existing one:

    try
    {
      Microsoft.Office.Interop.Excel.Application app = 
          System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    }
    catch
    {
      // Excel is not running.
    }
    
    0 讨论(0)
  • 2020-12-09 07:44
     String constr = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+txtSourceFile.Text+";Extended Properties='Excel 8.0;HDR=YES;';";
            String constr2 = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + txtLibrary.Text + ";Extended Properties='Excel 8.0;HDR=YES;';";
    
            OleDbConnection con = new OleDbConnection(constr);
            OleDbConnection con2 = new OleDbConnection(constr2);
            OleDbConnection con3 = new OleDbConnection(constr);
    
            OleDbCommand oconn = new OleDbCommand("Select * From [eudra$]", con);
            OleDbCommand oconn2 = new OleDbCommand("Select * From [Sheet1$]", con2);
            OleDbCommand oconn3 = new OleDbCommand("Select * From [eudra$] where EXAMPARM in ('with one or more serious adverse events','with one or more non-serious adverse events that met the incidence cutoff')", con);
    
            if (txtSourceFile.Text != "")
            {
                con.Open();
                con2.Open();
                con3.Open();
    
                OleDbDataAdapter sda = new OleDbDataAdapter(oconn);
                OleDbDataAdapter sda2 = new OleDbDataAdapter(oconn2);
                OleDbDataAdapter sda3 = new OleDbDataAdapter(oconn3);
    
    
                DataTable data = new DataTable();
                sda.Fill(data);
    
                DataTable data2 = new DataTable();
                sda2.Fill(data2);
    
                DataTable data3 = new DataTable();
                sda3.Fill(data3);
    
                var test = JoinDataTables(data, data2, (row1, row2) => (row1.Field<string>("BODY_SYS").ToUpper() == row2.Field<string>("Term").ToUpper() ));
    
                data3.Merge(test, true);
    
                dgvImp.DataSource = data3;
                con.Close();
            }
    
    0 讨论(0)
自定义标题
段落格式
字体
字号
代码语言
提交回复
热议问题