rohit gaikwad11 Ответов: 1

исключение из hresult:0x800a01a8 при попытке экспортировать данные из представления сетки в Excel


Microsoft.Office.Interop.Excel.ApplicationClass Excelapp = new Microsoft.Office.Interop.Excel.ApplicationClass();
           Excelapp.Application.Workbooks.Add();

           int IndiceColumn = 0;
           foreach (DataGridViewColumn col in table.Columns)
           {

               IndiceColumn++;
               Excelapp.Cells[1, IndiceColumn] = col.Name;
           }

           int IndeceFile = 0;

           foreach (DataGridViewRow r in table.Rows)
           {
               {
                   IndeceFile++;
                   IndiceColumn = 0;
                   foreach (DataGridViewColumn col in table.Columns)
                   {
                       IndiceColumn++;
                       Excelapp.Cells[IndeceFile + 1, IndiceColumn] = r.Cells[col.Name].Value;
                   }
               }
              // Excelapp.Visible = true;
               Excelapp.ActiveWorkbook.SaveCopyAs(saveFileDialog1.FileName.ToString());

               Excelapp.ActiveWorkbook.Saved = true;
               Excelapp.Quit();

Он работает нормально до первой строки, но не попадает на 2-ю, но падает с ошибкой исключение из hresult:0x800a01a8 для Xls и исключение из hresult:0x800a01C8 для Xlsx файлов
Я думаю мне нужно установить диапазон но может ли кто нибудь помочь мне в том как это сделать

1 Ответов

Рейтинг:
10

Maciej Los

Модель приложения Excel такова:
Excel->Workbooks[index]->Worksheets[index]->Cells[index, index]

Это означало, что вы не можете получить доступ ни к одной ячейке непосредственно из приложения Excel.

Взглянуть здесь[^Есть масса примеров.


ZurdoDev

На самом деле ты можешь, http://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.application_members(v=office.15).aspx

Cells является членом Excel.Приложение.

Maciej Los

О, вы правы и неправы одновременно...
Вы не можете писать в ячейку, когда ни одна из книг не открыта. Это плохая практика-использовать неконтекстуальный код. Проверьте это!

ZurdoDev

Правильный. Он будет использовать активный рабочий лист, если таковой имеется.

Maciej Los

Серьезно... - Нет!
Правильный способ-использовать что-то похожее на:
Excel ExApp = New Excel;
Workbook wbk = ExApp.Workbooks.Add();
Worksheet wsh = wbk.Worksheets["WorksheetName"];
wsh.Cells[index, index] = "StringValue";

ZurdoDev

Нет. Нисколько. Твое упрямство становится немного чересчур. Я указал вам на официальную документацию, которая показывает, что вы можете попасть в ячейки через приложение. Вы можете с этим не поспоришь. Вам это может не понравиться, и это справедливо, но это можно сделать.

На самом деле ActiveCell может быть очень часто использован, особенно в тех случаях, когда пользователь много взаимодействует с вашим приложением. Вы можете позволить пользователю выбрать ячейку, и тогда ваше приложение будет делать то, что ему нужно, основываясь на том, какую ячейку выбрал пользователь.

Maciej Los

Извиняюсь... Нужна ли OP функциональность для выбора какой-либо ячейки? Нет, он хочет сохранить данные DataGridView. ;)
Согласно моей практике, я вообще не рекомендую использовать ActveCell, Но... да, вы правы, иногда (написано big S) это полезно.
Овации,
Мацей

ZurdoDev

А если бы он хотел сохранить его в существующей выбранной ячейке пользователя, чтобы пользователь мог выбрать, куда он идет? Просто говорю.

rohit gaikwad11

И даже этот код работает с библиотекой Microsoft Excel 15 для версии 2010 года
Так что я не думаю, что это проблема с доступом к ячейкам

Maciej Los

Итак... в чем проблема?