«Возникло исключение: 'System.Runtime.InteropServices.COMException'. Дополнительная информация: документ не сохранен». выдается при сохранении файла Excel - PullRequest
0 голосов
/ 05 августа 2020

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

            objExcel = new Excel.Application();
            objWorkbook = objExcel.Workbooks.Open(path);
            col_num = columnNumber(columnName);
            int sheetId = 0;
            Excel.Worksheet objSheet = objWorkbook.Worksheets[1];


            int rows = objSheet.UsedRange.Rows.Count;

            int rowCount = 2;
            FileInfo fi = new FileInfo(path);
            List<string> tempTxtlist = new List<string>();
            InputFileInfo tempInputFileInfo = new InputFileInfo();
            tempInputFileInfo.Id = (sheetId + 1).ToString();
            tempInputFileInfo.DocxFile = fi.Name;
            tempInputFileInfo.TextFile = Path.GetFileNameWithoutExtension(path) + ".txt";
            tempInputFileInfo.SubDir = fi.Directory.Name;
            for (int r = rowCount; r <= rows; r++)
            {
                    tempTxtlist.Add(objSheet.Cells[r, col_num].Text);
                    Excel.Range rng = (Excel.Range)objSheet.Cells[r, col_num];
                    rng.ClearFormats();
                    rng.WrapText = true;
                    rng.Font.Bold = false;
                    rng.Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Black);
                    string cellTxt = objSheet.Cells[r, col_num].Text;
                    cellTxt = cellTxt.Replace('\u00A0', ' ');
                    string[] arrayOfWords = cellTxt.Split(' ');

                    foreach (string word in arrayOfWords)
                    {
                        bool isCorrectSent = objExcel.CheckSpelling(word.ToString());
                        if (!isCorrectSent)
                        {
                            int startIndex = cellTxt.IndexOf(word);
                            int length = word.Length + 1;
                            if (word.Contains("?") || word.Contains(",") || word.Contains("!"))
                                continue;
                            rng.Characters[startIndex, length].Font.Bold = true;
                            rng.Characters[startIndex, length].Font.Color = System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.Red);
                        }
                    }
            }

            tempInputFileInfo.inputTxt = tempTxtlist;

            tempInputFileInfoList.Add(tempInputFileInfo);
            objWorkbook.Save();
            objWorkbook.Close();
            objExcel.Quit();
        }
        catch
        {
            objWorkbook.Saved = true;
            objWorkbook.Close();
            objExcel.Quit();
        }
        finally
        {
            Marshal.ReleaseComObject(objWorkbook);
            Marshal.ReleaseComObject(objExcel);
            GC.Collect();
            GC.WaitForPendingFinalizers();

        }
        columnNumberParam = col_num;
        return tempInputFileInfoList;

    }

Исключение вызывается в objWorkbook.Save () после записи в excel.

Я попытался отладить его. Сначала я удалил "rng.ClearFormats (); " и попытался запустить код, он работал для 2 файлов Excel, но для остальных он выдал такое же исключение.

Затем я сделал Excel видимым, чтобы увидеть, что происходит внутри, в некоторых случаях он записывает в нежелательном формате Например - Что это должно быть - Желаемое Что я получаю - Нежелательное

Примечание: этот нежелательный результат случается только с несколькими ячейками, другие записываются правильно.

Теперь я не понимаю, в чем причина этого исключения? Это потому, что Excel не пишется должным образом? , играет ли в этом роль форматирование Excel? или в коде ошибка? Или что-то еще?

Может ли обработка диапазона быть проблемой в коде?

Любая помощь будет принята с благодарностью. Если у вас есть сомнения по поводу вопроса, дайте мне знать.

...