Я хочу открыть файл Excel и ждать, пока пользователь отредактирует и сохранит его

1

Я хочу открыть файл 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
process

2 ответа

3
Лучший ответ

Когда Excel имеет электронную таблицу, Excel сохраняет файл в той же папке, что и электронная таблица, и этот файл существует до тех пор, пока у пользователя открыта электронная таблица Excel. Имя файла (Excel 2007) совпадает с именем вашего файла электронной таблицы, но с префиксом "~ $", просто опросите этот существующий файл или используйте FileSystemWatcher в папке электронной таблицы, чтобы найти его, исчезнув - это означает, что пользователь прекратил использование таблицу и закрыл ее.

  • 0
    Большое спасибо, это сработало!
  • 0
    Но у меня была небольшая странная проблема! отлично работает отлично, но когда файл слова хочет создать свой временный файл (~ $) T, если имя файла больше 6 и 7 символов, он удалит первый и второй символы исходного имени файла, что я ограничил размер имени файла не более 6 символов, чтобы решить эту проблему.
0

Слишком поздно, чтобы помочь 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню