Рейтинг:
26
Maciej Los
Прежде всего, пожалуйста, прочтите это: Как для автоматизации приложения Microsoft Excel из пакета Microsoft визуальный C#.NET[^]
Вы должны использовать Псевдоним пространства имен[^] как сокращение имени, чтобы избежать повторения всего пространства имен. Видеть:
Excel = Microsoft.Office.Interop.Excel;
Не забудьте привести себя в порядок. Это означает, что вы должны повторно использовать все com-объекты, созданные в коде! Взгляните на приведенный ниже пример:
//Using section:
//Excel=Microsoft.Office.Interop.Excel;
//System.Runtime.InteropServices;
Excel.Application xlApp = new Excel.Application();
string sFileName = @"D:\ConflictData.xls";
Excel.Workbook xlBook = (Excel.Workbook)xlApp.Workbooks.Open(sFileName);
Excel.Worksheet xlSheet = (Excel.Worksheet)xlBook.Worksheets[2];
for(int i =1; i<=10; i++)
{
xlSheet.Range["A" + i.ToString()].Value = i;
}
xlApp.Visible = true;
//clean up
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.ReleaseComObject(xlSheet);
Marshal.ReleaseComObject(xlBook);
Marshal.ReleaseComObject(xlApp);
Amr Mohammad Rashad
Большое спасибо, что ваше решение сработало для меня идеально! :) Спасибо за ваше время и внимание. Спасибо всем людям, которые пытались помочь! оказывая мне положительную или отрицательную помощь!
Maciej Los
Всегда пожалуйста.
Рейтинг:
1
Richard MacCutchan
catch(Exception e)
{
throw new Exception("Error while processing file");
}
Это действительно хороший способ скрыть проблему, которая есть в вашем коде. Вы замаскировали фактическое исключение и создали новое, которое не предоставляет никакой информации, чтобы помочь вам диагностировать проблему. Избавьтесь от этого кода и отобразите тип и детали исходного исключения, чтобы узнать, что не так с вашим кодом.
Maciej Los
Некоторые очевидные вещи не очевидны для всех...
5ed!
Amr Mohammad Rashad
Как видите, я могу поймать исходное исключение. Однако вы не можете создать фактическое исключение для пользователя. Я надеюсь, что вы не бросаете свои реальные исключения пользователю :). Я могу передать arg (e) во внутреннее свойство исключения нового исключения, которое я бросаю
Richard MacCutchan
Вы, очевидно, не понимаете, как обрабатывать пойманные исключения. Объект исключения, который вы ловите, содержит ценную информацию о возникшей ошибке, но вы просто выбрасываете ее в корзину.
Amr Mohammad Rashad
Опять же Г-Н Ричард во время отладки наверняка информация об исключении полезна, но вы не хотите показывать конечному пользователю исключение, сообщающее ему, что индекс был вне диапазона, например, потому что он не поймет, что означает индекс вне диапазона, вместо этого я должен показать ему сообщение об ошибке, которое он может понять, как то, что я написал в своем брошенном исключении "ошибка при обработке файла", но, как вы можете видеть, я написал блок catch с исключением e, чтобы при отладке я мог наблюдать переменную e и знать детали исключения.
Richard MacCutchan
Я никогда не говорил, что вы должны показывать пользователю какое-то непонятное сообщение. Я сказал, что вы должны обращаться с исключением должным образом.
Amr Mohammad Rashad
Что вы подразумеваете под правильной обработкой исключения? Я отлаживаю, что означает, что когда я войду в блок catch, я смогу наблюдать переменную исключения "e" и точно знать исключение.
Richard MacCutchan
Ну, если ты не понимаешь сейчас, то никогда не поймешь.
Рейтинг:
0
#realJSOP
Ваша обработка исключений скрывает фактическое исключение, которое выбрасывается. Измените его на:
throw new Exception("blah bah", e);
Кроме того, я *думаю*, что строки и столбцы являются 1-индексированными, а не 0-индексированными.
Richard MacCutchan
Э-э, вы видели его блок улов?
Amr Mohammad Rashad
Опять же, реальное исключение не должно быть брошено пользователю, который является 100% плохим пользовательским опытом, вместо этого вы должны бросить другое сообщение пользователю, которое приемлемо для него, и он может понять!
Прав я или нет?
Рейтинг:
0
Patrice T
Попробуй
for (int i = 0; i < list.Count; i++)
{
((Microsoft.Office.Interop.Excel.Range)cells[i + 1, 1]).Value = list[i].ProductShare;
((Microsoft.Office.Interop.Excel.Range)cells[i + 1, 2]).Value = list[i].MarketPotential;
}
Ячейка А1-это ячейка(1,1).
Amr Mohammad Rashad
Я попробовал ячейки[rowindex, columnindex], но ничего не вышло! Я нахожу много решений, имеющих множество методов для объектов рабочей книги или рабочего листа, которые я не нахожу, а также которые включают использование индекса строки/столбца, но это тоже не сработало. "Maciej Los" решение выше работало найти для меня!