Ошибка при сохранении файла Excel с использованием worksheet.save()

#c# #asp.net #excel

#c# #asp.net #excel

Вопрос:

Ошибка заключается:

Исключение из HRESULT: 0x800A03EC.

Комментарии:

1. дайте нам больше информации о том, что вы делаете перед сохранением?

Ответ №1:

Я испытал это однажды. Я открывал файл Excel, когда писал свой лист Excel. Итак, я решил ее, отложив открытие файла до завершения операции сохранения.

Ответ №2:

Это всего лишь предположение, но в прошлом это огорчало меня…

В Excel (и, возможно, в других продуктах office) есть ошибка, которая выдает этот код ошибки при вызове методов, использующих язык, отличный от английского.

Правильный способ справиться с этим — изменить культуру:

 CultureInfo oldCulture = Thread.CurrentThread.CurrentCulture;
try {
  // use excel here
} finally { // restore culture
  Thread.CurrentThread.CurrentCulture = oldCulture;
}
  

Я написал класс, чтобы помочь с этим. Вы можете использовать это как:

 using(new RunInCulture.English) {
  // use excel here
}
  

И вот код:

 public class RunInCulture : IDisposable
{
    CultureInfo _oldCulture;

    public RunInCulture(string culture)
        : this(CultureInfo.GetCultureInfo(culture))
    {
    }

    public RunInCulture(CultureInfo culture)
    {
        _oldCulture = Thread.CurrentThread.CurrentCulture;
        Thread.CurrentThread.CurrentCulture = culture;
    }

    public static RunInCulture Invariant
    {
        get
        {
            return new RunInCulture(CultureInfo.InvariantCulture);
        }
    }

    public static RunInCulture English
    {
        get
        {
            return new RunInCulture("en-US");
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (disposing)
            Thread.CurrentThread.CurrentCulture = _oldCulture;
    }

    ~RunInCulture()
    {
        Dispose(false);
    }

}

public class EnglishCulture : RunInCulture
{
    public EnglishCulture()
        : base("en-US")
    {
    }
}
  

Ответ №3:

Я решил эту проблему, изменив способ ссылки на книгу, которую необходимо сохранить.

Способ 1

 var wkb = excelInstance.Workbooks[1];
wkb.SaveAs(targetReportPath);
// This works
  

Способ 2

 excelInstance.ThisWorkbook.SaveAs(targetReportPath);
// This fails...