Я хочу открыть файл excel и ждать, пока пользователь отредактирует и сохранит его, а затем я использую данные.
Я использую этот код:
string tempFileName = "test.xlsx";
MemoryStream ms = DocumentFormat.OpenXml.Extensions.SpreadsheetReader.Create();
DocumentFormat.OpenXml.Extensions.SpreadsheetWriter.StreamToFile(tempFileName, ms);
var psi = new ProcessStartInfo(tempFileName);
var p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
p.Close();
// use the data
и все выглядит нормально. но проблема в том, что если перед запуском этого блока есть открытый файл excel, у меня будет ошибка на p.WaitForExit(); строка "Invalid Operation Exception".
Я думаю, что причина в том, что если есть уже процесс с именем "excel.exe", мой код не создаст другого, ожидающего его выхода, и объединит процессы или что-то в этом роде. я могу заставить пользователя закрыть все открытые документы excel, а затем запустить этот код, или я сам запустил excel.exe и снова запустил его из моего кода. которые я не хочу использовать в этих решениях.
пожалуйста, помогите мне найти выход! большое спасибо
Когда Excel имеет электронную таблицу, Excel сохраняет файл в той же папке, что и электронная таблица, и этот файл существует до тех пор, пока у пользователя открыта электронная таблица Excel. Имя файла (Excel 2007) совпадает с именем вашего файла электронной таблицы, но с префиксом "~ $", просто опросите этот существующий файл или используйте FileSystemWatcher в папке электронной таблицы, чтобы найти его, исчезнув - это означает, что пользователь прекратил использование таблицу и закрыл ее.
Слишком поздно, чтобы помочь OP на этот раз, очевидно, но, надеюсь, это поможет кому-то в будущем. В моем случае использование принятого ответа (с "~ $" в имени файла) выглядело немного проблематичным, если оно было функциональным. В качестве альтернативы вам просто нужно установить имя ProcessStartInfo.FileName в "EXCEL.EXE" и указать путь к файлу в качестве аргумента.
var psi = new ProcessStartInfo()
psi.FileName = "EXCEL.EXE";
psi.Arguments = tempFileName;
var p = new Process();
p.StartInfo = psi;
p.Start();
p.WaitForExit();
p.Close();
Отлично работает для меня (с Excel 2013, по крайней мере), когда экземпляры Excel уже открыты и т.д. Ваш опыт может отличаться в зависимости от вашей версии Excel.