2014-10-24 5 views
1

, пожалуйста, помогите мне с этим!C# Как получить доступ к открытому файлу Excel?

В моем новом проекте мне нужно получить доступ к некоторым файлам Excel. Имена всех из них известны. Легко открыть эти файлы и записать данные. Если объекты excel хранятся в списке, тогда легко повторно получить доступ к уже открывшимся файлам, пока программа все еще запущена. Пожалуйста, взгляните на приведенный ниже пример.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using Excel = Microsoft.Office.Interop.Excel; 

namespace ExcelTutorial 
{ 
    public partial class Form1 : Form 
    { 
     List<TextBox> textToExcel = new List<TextBox>(); 
     List<string> s_excelFiles = new List<string> { "Workbook1.xlsx", "Workbook2.xlsx", "Workbook3.xlsx", "Workbook4.xlsx", "Workbook5.xlsx" }; 
     List<Excel.Application> l_excelApplication = new List<Excel.Application>(); 
     List<Excel.Workbook> l_excelWorkbook = new List<Excel.Workbook>(); 
     List<Excel.Worksheet> l_excelWorksheet = new List<Excel.Worksheet>(); 
     bool fileOpened = false; 

     public Form1() 
     { 
      InitializeComponent(); 
      textToExcel.Add(textBox1); textToExcel.Add(textBox2); textToExcel.Add(textBox3); 
      textToExcel.Add(textBox4); textToExcel.Add(textBox5); 

     } 

     private void btn_Unopened_Click(object sender, EventArgs e) 
     { 

      string path = System.IO.Path.GetDirectoryName(Application.ExecutablePath); 

      if (fileOpened != true) 
      { 

       foreach (var item in s_excelFiles) 
       { 
        Excel.Application newExcelApp = new Excel.Application(); 
        Excel.Workbook workbook = newExcelApp.Workbooks.Open(path + "\\" + item 
               , ReadOnly: false, Editable: true); 
        Excel.Worksheet worksheet = (Excel.Worksheet)workbook.ActiveSheet; 
        newExcelApp.Visible = true; 
        ((Excel.Range)worksheet.Cells[1, 1]).Value = textToExcel[s_excelFiles.IndexOf(item)].Text; 
        l_excelApplication.Add(newExcelApp); 
        l_excelWorkbook.Add(workbook); 
        l_excelWorksheet.Add(worksheet);  
       } 
       fileOpened = true; 
      } 
      else 
      { 
       foreach (var item in l_excelWorksheet) 
       { 
        ((Excel.Range)item.Cells[1, 1]).Value = textToExcel[l_excelWorksheet.IndexOf(item)].Text; 

       } 
      } 
     } 

     private void btn_Opened_Click(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Однако есть возможность того, что у пользователя есть рабочая книга, которая уже открыта в момент запуска программы. Очевидно, Excel отправляет сообщение пользователю, запрашивающему повторное открытие книги. Это может привести к потере данных. Конечно, я могу проверить, если файл открыт перед доступом к ней, как это было описано here со следующим кодом:

try 
{ 
    stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
} 

А потом просто попросить пользователя, чтобы закрыть этот файл. Но я считаю, что есть еще один способ сделать это лучше.

Итак, мой вопрос: КАК получить доступ к файлу, который уже был открыт пользователем?

Решение ExcelTutorial доступно here!

ответ

1

Вы можете попробовать этот код, например, чтобы получить доступ к текущей активной рабочей книги:

//Gets Excel and gets Activeworkbook and worksheet 
    Excel.Application oXL; 
    Excel.Workbook oWB; 
    Excel.Worksheet oSheet; 
    oXL = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
    oXL.Visible = true; 
    oWB = (Excel.Workbook)oXL.ActiveWorkbook; 

    docProps = oWB.CustomDocumentProperties 

Или, может быть, лучше решение:

using Excel = Microsoft.Office.Interop.Excel; 
using ExcelDna.Integration; 

// Get the currect application instance 
Excel.Application xlapp = (Excel.Application)ExcelDnaUtil.Application; 

// Get active workbook 
Excel.Workbook wbook = xlapp.ActiveWorkbook; 

Подробнее здесь: Get the current Workbook Object in C#

+0

Почему downvote? Разве это не то, что ОП? – Matheno

+0

Извините за предыдущего комментатора, похоже, я случайно удалил его комментарий. в любом случае он был прав - Excel.Application xlapp = (Excel.Application) ExcelDnaUtil.Application; или oXL = (Excel.Application) Marshal.GetActiveObject ("Excel.Application"); дает первое открытое приложение excel. Но для пользователя нет правила открывать только одно приложение. Пользователь по-прежнему может открыть Workbook1 и Workbook4, например, или что-то еще. –

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