请帮我解决这个问题!
在我的新项目中,我需要访问一些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!
答案 0 :(得分: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;