none
ячейки в Excel RRS feed

  • Вопрос

  • Добрый день!

    Тема моя распространенная, но немного непонятна для меня. Прошу немного объяснить по возможности.

    Экспорт из GridView в Excel файл. Точнее мой вопрос как произвести экспорт, не могу понять саму суть. В GridView подгружаю таблицу с БД Oracle и оттуда должна быть возможность экспортирования в Excel. Основная задача в том чтобы, запись началась в Excel  файле с определенной строки, допустим с 15-ой (А15). 

    Привожу мой нерабочий код

     string FileName = "Book1.xls";
    
                Excel.ApplicationClass ExcelApp = new Excel.ApplicationClass();
                ExcelApp.Application.Workbooks.Add(Type.Missing);
    
                for (int i = 0; i < GV1.Rows.Count; i++)
                {
                    for (int j = 0; j < GV1.Columns.Count; j++)
                    {
                        ExcelApp.Cells[i, j] = GV1.Rows[i].Cells[j].Text.ToString();
                    }
                }
    
                ExcelApp.ActiveWorkbook.SaveCopyAs(FileName);
                ExcelApp.ActiveWorkbook.Saved = true;
                ExcelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
                ExcelApp = null;

    Экспортирует по умолчанию в "Документы", файл создается, Но не заполняется... пустой. 

    Указывал i=15, начиная с 15 строки, тоже самое. 


    • Изменено Kioto 18 февраля 2013 г. 10:03
    18 февраля 2013 г. 10:02

Ответы

  • Доброе утро! Ночь бессонного сна, и маленькое изменение в коде, проблему решил,.

    Прикладываю рабочий код может кому еще пригодиться :)

    string FileName = "NewBook.xls";
    
                Excel.ApplicationClass ExcelApp = new Excel.ApplicationClass();
                ExcelApp.Application.Workbooks.Add(Type.Missing);
    
                for (int i = 0; i <= GV1.HeaderRow.Cells.Count - 1; i++)
                {
                    for (int j = 0; j <= GV1.Rows.Count - 1; j++)
                    {
                        ExcelApp.Cells[j + 15, i + 1] = GV1.Rows[j].Cells[i].Text;
                    }
                }
    
                ExcelApp.ActiveWorkbook.SaveCopyAs(FileName);
                ExcelApp.ActiveWorkbook.Saved = true;
                ExcelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
                ExcelApp = null;
    Yatajga, спасибо за совет :) Проблема оказалось в начале цикла


    • Изменено Kioto 19 февраля 2013 г. 2:31
    • Помечено в качестве ответа ulcerModerator 19 февраля 2013 г. 4:50
    19 февраля 2013 г. 2:06

Все ответы

  • В первую очередь посмотрите в отладчике на

    GV1.Rows[i].Cells[j].Text


    есть ли там значение или что это не пустая строка. Если нет, т.е. там что-то есть, посмотрим дальше.

    • Изменено YatajgaEditor 18 февраля 2013 г. 12:26
    18 февраля 2013 г. 12:26
    Модератор
  • Доброе утро! Ночь бессонного сна, и маленькое изменение в коде, проблему решил,.

    Прикладываю рабочий код может кому еще пригодиться :)

    string FileName = "NewBook.xls";
    
                Excel.ApplicationClass ExcelApp = new Excel.ApplicationClass();
                ExcelApp.Application.Workbooks.Add(Type.Missing);
    
                for (int i = 0; i <= GV1.HeaderRow.Cells.Count - 1; i++)
                {
                    for (int j = 0; j <= GV1.Rows.Count - 1; j++)
                    {
                        ExcelApp.Cells[j + 15, i + 1] = GV1.Rows[j].Cells[i].Text;
                    }
                }
    
                ExcelApp.ActiveWorkbook.SaveCopyAs(FileName);
                ExcelApp.ActiveWorkbook.Saved = true;
                ExcelApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
                ExcelApp = null;
    Yatajga, спасибо за совет :) Проблема оказалось в начале цикла


    • Изменено Kioto 19 февраля 2013 г. 2:31
    • Помечено в качестве ответа ulcerModerator 19 февраля 2013 г. 4:50
    19 февраля 2013 г. 2:06
  • Спасибо, что не забыли и выложили решение проблемы. Оно может пригодиться в будущем другим.
    19 февраля 2013 г. 5:43
    Модератор
  • Прошу прощения...проблема за проблемой... выложил весь свой файл на сервер IIS (2008 x64, без офиса), вышла ошибка 

    Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. The system cannot find the file specified. 
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
    
    Exception Details: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. The system cannot find the file specified.
    
    Source Error: 
    
    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  
    
    Assembly Load Trace: The following information can be helpful to determine why the assembly 'Microsoft.Office.Interop.Excel, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' could not be loaded.
    
    
    WRN: Assembly binding logging is turned OFF.
    To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
    Note: There is some performance penalty associated with assembly bind failure logging.
    To turn this feature off, remove the registry value [HKLM\Software\Microsoft\Fusion!EnableLog].
    
     

    Выдает ошибку в именно при создании Excel файла 

    Excel.ApplicationClass ExcelApp = new Excel.ApplicationClass();

    Поискал ответы, везде. Писали что необходимо установить PIA для office 2010, устанавливал, не помогло.

    Пробовал поставить сам Office 2010 на сервер, но тогда выходит ошибка 

    Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.
    
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
    
    Exception Details: System.UnauthorizedAccessException: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005. 
    
    ASP.NET is not authorized to access the requested resource. Consider granting access rights to the resource to the ASP.NET request identity. ASP.NET has a base process identity (typically {MACHINE}\ASPNET on IIS 5 or Network Service on IIS 6) that is used if the application is not impersonating. If the application is impersonating via <identity impersonate="true"/>, the identity will be the anonymous user (typically IUSR_MACHINENAME) or the authenticated request user. 
    
    To grant ASP.NET access to a file, right-click the file in Explorer, choose "Properties" and select the Security tab. Click "Add" to add the appropriate user or group. Highlight the ASP.NET account, and check the boxes for the desired access.
    
    Source Error: 
    
    An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.


    Искал везде свою ошибку, пишут только что в dcomcnfg выделить права Network Service. Не помогло, выходит тоже самое...

    Удалил офис, и первая ошибка снова сияет во всей красе... Есть у кого идеи?

    Характеристики клиента: VisualStudio 2010, MS Win7 x86,  office 2010
    Характеристики сервера: Win2008 server x64, IIS

    P.S. Может быть где то в настройках IIS? У меня включено Windows Authentication - Enable и Anonymos Authentication -Disable в Authentication, т.к. при загрузке странице идет поиск доменной учетки
    • Изменено Kioto 20 февраля 2013 г. 4:55
    20 февраля 2013 г. 4:43
  • Посмотрите сюда, может установкой этого решится проблема. Вот ещё ссылка.
    20 февраля 2013 г. 8:33
    Модератор
  • Хотя насколько я понял, установкой решается проблема. Тут у вас проблема с правами, от имени какого пользователя запускается пул приложения ASP.NET?
    20 февраля 2013 г. 8:38
    Модератор
  • Хотя насколько я понял, установкой решается проблема. Тут у вас проблема с правами, от имени какого пользователя запускается пул приложения ASP.NET?
    Вообще на сервер захожу удаленно через RDP, моя доменная учетная запись входит в группу администраторов. И все другие пользователи должны получать только ссылку на выгрузку Excel файла. 

    • Изменено Kioto 20 февраля 2013 г. 8:56
    20 февраля 2013 г. 8:54
  • Сделал различные методы.. пока сижу на старой ошибке...

    Server Error in '/' Application.

    Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005.

    • Изменено Kioto 20 февраля 2013 г. 10:58
    20 февраля 2013 г. 9:56
  • Добрый день товарищи! Спешу поделиться решением, т.к. пострадавших таких как я прилично, нашел на одном сайте его решение:


    Сегодня опишу общно и без детальных картинок проблематику взаимодействия с документами MS Office 2007 из веб-сайта при помощи поставляемых в комплекте библиотек-прослоек Office.Interop. Эта история интересна тем, что ее решение содержит кучу проблем, но нигде я не видел целостного описания их преодоления.
    • Во-первых, вам понадобится установить на сервер офис. 
    • После того как в программе сделали Reference, написали нужны код, скопировали на сервер у вас появится: Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005Решение - запускаем DCOMCNFG, выставляем пользователю NetworkServices права на запуск компонентов MicrosoftOffice(Word/Excel) или для того пользователя от лица которого работает ApplicationPool.
    • Запускаем повторно, вылезает (0x800A03EC): Microsoft Office cannot open or save any more documents because there is not enough available memory or disk Решение - Создать системные папки
      C:\Windows\SysWOW64\config\systemprofile\Desktop (для x64) C:\Windows\System32\config\systemprofile\Desktop (для x86)
      и выставить права для NetworkServices на папку - systemprofile.
    • На этом квест не заканчивает. При повторном запуске программа выдаст (0x80028018): Old format or invalid type library. (Exception from HRESULT: 0x80028018 (TYPE_E_INVDATAREAD)) http://support.microsoft.com/kb/320369 Что говорит о разнице в локализации вашего кода и компонента. Решается переключением локализации вызывающего потока перед вызовов функций COM объекта
      System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); //вызовы Office.Interop

    P.S: ВАЖНО!  только везде где пишет пользователя ASP.NET я добавлял IIS_IUSRS. Желаю всем программистам попутного кода :)




    • Изменено Kioto 26 февраля 2013 г. 2:04
    21 февраля 2013 г. 9:10