"Боги" С#  
Автор Сообщение

0
Сообщение "Боги" С#

ObjExcel.Cells[x + 2, 2] = "=СУММПРОИЗВ(C:C;D:D)";

 

Компилятор ругается и не хочет выводить эту строчку, все остальное в Excel выводит исправно. Полазил в гугле, ничего полезного не нашел Fool Выдает вот такую ошибку: Исключение из HRESULT: 0x800A03EC.

 

Вопрос лоховский как мне кажется, но я с интеграцией в Excel столкнулся только сегодня и вообще случайно :D Так что помощь не помешает. Заранее благодарю откликнувшихся Drink



15 сен 2013, 17:51
Профиль Skype

0
Сообщение "Боги" С#

я не шарю в Ц+ но 2 раза = это ок?

мне кажется = перед СУММПРОИЗВ лишнее.

либо что то не так в [x+2, 2] между двойками отсутствует что то важное

 

 



15 сен 2013, 18:08
Профиль

0
Сообщение "Боги" С#

Первое равно знак присвоения, а второе должно идти как обычный символ. Я вообще не понимаю с чего ему ругаться если это вывод обычной строки которая уже в Excel'е является формулой, но c шарп должен видеть ее как рядовую строку.



15 сен 2013, 18:10
Профиль Skype

0
Сообщение "Боги" С#

Попробуй

 

objExcel.Cells(6, 1).Formula = "=SUM(A1:A4)"


15 сен 2013, 18:42
Профиль

0
Сообщение "Боги" С#

Код:
                       

    Microsoft.Office.Interop.Excel.Application XlApp = new Microsoft.Office.Interop.Excel.Application();   
    Microsoft.Office.Interop.Excel.Workbook XlWorkbook = XlApp.Workbooks.Add(System.Reflection.Missing.Value);
    Microsoft.Office.Interop.Excel.Worksheet XlWorksheet =(Microsoft.Office.Interop.Excel.Worksheet)XlWorkbook.Worksheets.get_Item(1);

// всякие открытия екселя, книги, страницы

     for (int i = 0; i < count_rows; i++) {
           XlApp.Cells[i + 1, 1] = "=СУММПРОИЗВ(C:C;D:D)"; // сама запись в таблицу


     ((Microsoft.Office.Interop.Excel.Range)XlWorksheet.Columns[i + 1, Type.Missing]).EntireColumn.ColumnWidth = 30;
     ((Microsoft.Office.Interop.Excel.Range)XlWorksheet.Rows[i + 1, Type.Missing]).EntireRow.RowHeight = 25;

//2 строки выше делают таблицу читаемой (увеличивают отступ по высоте и ширине), иначе будет непонятная каша
     }
     XlWorkbook.SaveAs(filename, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
                                "", "", false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive,
                                Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, false,
                                false, false, false);
//filename - полный путь к файлы, C:\qwe123.xls
      XlWorkbook.Close(true, filename, false);
      XlApp.Quit();

//закрытие



15 сен 2013, 18:54
Профиль

0
Сообщение "Боги" С#

http://www.gotdotnet.ru/forums/4/122190/


Еще пишут, что индексация ячеек в экселе начинается с 1, а не 0. Отсюда может быть такой эксепшен.



15 сен 2013, 18:57
Профиль

0
Сообщение "Боги" С#
Не знаток с#, но данная формула в экселе вызовет ворнинг на пустые ячейки, может проблема в этом. Попробуй локализовать столбцы, например: (С1:С5;D1:D5) --- Ну и если дело в этом, то всегда убеждайся, что в ячейках есть значения перед тем, как писать формулу для их расчёта.


15 сен 2013, 19:37
Профиль

0
Сообщение "Боги" С#

В экселе она как раз таки работает не смотря на пустые строки. Размер меняется динамечески поэтому по конкретным строкам я написать не могу.

 

2deromik из твоего примера помогло только изменение ширины и высоты столбцов. Правда когда я пытаюсь изменить размер только одного столбца то выдает ошибку, а в цикле все нормально. Формула все так же ругается. В любом случае всем спасибо. Жду еще каких нибудь советов если кто сталкивался. Может проблема в кривом дотнете или офисе. Я уже не знаю.



15 сен 2013, 20:13
Профиль Skype

0
Сообщение "Боги" С#
Еще раз - в экселе она не работает идеально, на неё идёт warning. Этот warning может являться причиной того, что ты не можешь её записать. Ты попробовал то, что я сказал? Какие результаты? Надеюсь C1:C5 и D1:D5 ты значениями предварительно заполнил.


15 сен 2013, 21:01
Профиль

0
Сообщение "Боги" С#

может у теб x может равнятся -2?

Я так понял метод Cells не может иметь индексы = 0



15 сен 2013, 22:16
Профиль

0
Сообщение "Боги" С#

#391

Никаких варнингов нет. Формулу вставил "от руки" через excel. Компилятор все так же ругается. С индексацией все в порядке:

ObjExcel.Cells[x + 2, 1] = "Итог:";
ObjExcel.Cells[x + 2, 2].Formula = "=СУММПРОИЗВ(C:C;D:D)";

 

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



16 сен 2013, 13:44
Профиль Skype

0
Сообщение "Боги" С#

http://тт/C_Sharp/comexcel.html#53

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


Если кому интересно решение

Код:

Немного переделал метод:


private int iOutputExcelF(int b, ref int x, int c, int d, int e, int f, string sValue)
{
Microsoft.Office.Interop.Excel.Range rg = null;
rg = ObjWorkSheet.get_Range(vsS[b] + Convert.ToString(x), Type.Missing);
rg.Select();
rg.Formula = "="+sValue+"("+vsS[c] + Convert.ToString(d)+":"+vsS[e] + Convert.ToString(f)+")";
return 0;
}


Вывод:


ObjExcel.Cells[x + 2, 1] = "Итог:";
x += 2;
int z = x - 2;
iOutputExcelF(1, ref x, 2, z, 3, z, "СУММПРОИЗВ");
x -= 2;

Не разрешал внутри скобочек прибавлять 2 к х поэтому пришлось обходить так.

Получился быдлокод, но когда сроки поджимают, то и так сойдет :D Спасибо всем откликнувшимся.



16 сен 2013, 14:46
Профиль Skype

0
Сообщение "Боги" С#
Решение, про которое я и говорил, что ячейки из-за пустых ренджей перебрать надо, а не писать (D:D;E:E). Вместо того, чтобы проверить то, что я предлагал сразу, провёл в интернете несколько дней.


17 сен 2013, 07:36
Профиль
Начать новую тему Ответить на тему


Перейти:  

cron
На сайте использованы материалы, принадлежащие Blizzard Entertainment. Копирование материалов возможно только c разрешения портала. В противном случае это будет называться уже другим словом.
Рейтинг@Mail.ru