HRESULT: 0x800A03EC - работает на моей машине при создании файлов Excel - PullRequest
3 голосов
/ 16 марта 2011

Я создаю отчет Excel, используя данные, поступающие с сервера mssql в моем приложении asp.net. Вот мой метод:

[WebMethod]
public static string ExportToExcel(string sourcetype)
{
    Microsoft.Office.Interop.Excel.Application oXL;
    Microsoft.Office.Interop.Excel._Workbook oWB;
    Microsoft.Office.Interop.Excel._Worksheet oSheet;
    Microsoft.Office.Interop.Excel.Range oRng;

    try
    {
        oXL = new Microsoft.Office.Interop.Excel.Application();
        oXL.Visible = false;

        oWB = (Microsoft.Office.Interop.Excel._Workbook)(oXL.Workbooks.Add(Missing.Value));
        oSheet = (Microsoft.Office.Interop.Excel._Worksheet)oWB.ActiveSheet;

        List<ExcelReport> dataToExport = APIClient.GetExcelReportData(Utility.getCurrentFilterId(), sourcetype);

        oSheet.Cells[1, 1] = "Source";
        oSheet.Cells[1, 2] = "UserName";
        oSheet.Cells[1, 3] = "Name";
        oSheet.Cells[1, 4] = "Message";
        oSheet.Cells[1, 5] = "Title";
        //oSheet.Cells[1, 6] = "Date";

        int activeRow = 2;

        for (int i = 0; i < dataToExport.Count; i++)
        {
            oSheet.Cells[activeRow, 1] = dataToExport[i].Source;
            oSheet.Cells[activeRow, 2] = dataToExport[i].UserName;
            oSheet.Cells[activeRow, 3] = dataToExport[i].Name;
            oSheet.Cells[activeRow, 4] = dataToExport[i].Message;
            oSheet.Cells[activeRow, 5] = dataToExport[i].MessageTitle;
            //oSheet.Cells[activeRow, 6] = dataToExport[i].EntityDate;

            activeRow++;
        }

        oSheet.get_Range("A1", "Z1").Font.Bold = true;
        oSheet.get_Range("A1", "Z1").VerticalAlignment = Microsoft.Office.Interop.Excel.XlVAlign.xlVAlignCenter;
        oRng = oSheet.get_Range("A1", "Z1");
        oRng.EntireColumn.AutoFit();
        oXL.Visible = false;
        oXL.UserControl = false;

        string strFile = "report" + System.DateTime.Now.Ticks.ToString() + ".xls";
        string strCurrentDir = HttpContext.Current.Server.MapPath(".") + "\\ExcelReports\\";
        oWB.SaveAs(strCurrentDir + strFile, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, null, null, false,
            false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, false, false, null, null, null);
        //oWB.SaveCopyAs(strCurrentDir + strFile);
        oWB.Close(null, null, null);
        oXL.Workbooks.Close();
        oXL.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(oRng);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(oXL);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(oSheet);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(oWB);
        oSheet = null;
        oWB = null;
        oXL = null;
        GC.Collect();  // force final cleanup!

        //errLabel.Text = "<A href=http://" + strMachineName + "/ExcelGen/" + strFile + ">Download Report</a>";
        //string result = "<a href=\"~/ExcelReports/" + strFile + ">Raporu İndir</a>";
        string result = "ExcelReports/" + strFile;
        return result;
    }
    catch (Exception theException)
    {
        String errorMessage;
        errorMessage = "Error: ";
        errorMessage = String.Concat(errorMessage, theException.Message);
        errorMessage = String.Concat(errorMessage, " Line: ");
        errorMessage = String.Concat(errorMessage, theException.Source);

        return errorMessage;
    }

}

Он отлично работает на моей машине и на сервере, на котором опубликовано приложение, когда я открывал исходный код в версии 2010 и нажимал клавишу F5. Но если я пытаюсь получить доступ к своему приложению с помощью браузера через IIS, я получаю сообщение об ошибке HRESULT: 0x800A03EC.

Я попробовал следующую команду:

appcmd set config -section:asp -enableParentPaths:true

Я пытался дать разрешения на запись в мою папку.

Я пытался изменить настройки приложения MS Excel из Служб компонентов.

Но ни за что! Я не мог заставить это работать. Есть ли у вас какие-либо идеи? Я делаю ошибку в конфигурации?

Заранее спасибо,

Ответы [ 3 ]

12 голосов
/ 16 марта 2011

Я воспроизвел вашу проблему .. попробовал все: oWB.SaveAs / oWB._SaveAs / ( oXL.ActiveSheet as Microsoft.Office.Interop.Excel.Worksheet ).SaveAs / oWB.Application.ActiveWorkbook.SaveAs все исключения исключения: HRESULT: 0x800A03EC ...

Но я вижу, что вы пробовали сoWB.SaveCopyAs (strCurrentDir + strFile);и это работает, если я установлю следующее:

oWB.Saved = true;
oWB.SaveCopyAs( strCurrentDir + strFile );

Почему вы не используете SaveCopyAs?

0 голосов
/ 24 мая 2019

Если вызов взаимодействия Excel происходит в том же потоке, что и ASP.NET, т. Е. В ответ на ваш пользовательский интерфейс, то для работы Excel необходим какой-то профиль пользователя.IIS не предоставляет этого по умолчанию, но пока некоторые папки существуют с правильными разрешениями, он может работать.

  • C: \ Windows \ SysWOW64 \ config \ systemprofile \ Desktop (только для 64-разрядных серверов)
  • C: \ Windows \ System32 \ config \ systemprofile \ Desktop (для обоих32-разрядные и 64-разрядные серверы)

Из последнего раздела https://www.ryadel.com/en/office-interop-dcom-config-windows-server-iis-word-excel-access-asp-net-c-sharp/#0x800A03EC_Cannot_access_the_file

0 голосов
/ 22 ноября 2015

Создайте папку «Рабочий стол», как показано ниже

C:\Windows\SysWOW64\config\systemprofile\Desktop
C:\Windows\System32\config\systemprofile\Desktop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...