, пожалуйста, помогите мне с этим!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!
Почему downvote? Разве это не то, что ОП? – Matheno
Извините за предыдущего комментатора, похоже, я случайно удалил его комментарий. в любом случае он был прав - Excel.Application xlapp = (Excel.Application) ExcelDnaUtil.Application; или oXL = (Excel.Application) Marshal.GetActiveObject ("Excel.Application"); дает первое открытое приложение excel. Но для пользователя нет правила открывать только одно приложение. Пользователь по-прежнему может открыть Workbook1 и Workbook4, например, или что-то еще. –