Amr Mohammad Rashad Ответов: 4

Настройка значений конкретных ячеек excel


Приветствия,

Я пытаюсь установить определенные ячейки листа Excel, начиная со столбца а и второй строки листа Excel. Я написал следующий код

if (!File.Exists(AppConfiguration.FilePath))
            {
                throw new FileNotFoundException("File Not Found. The requested template.xlsx was not found on the server");
            }

            Microsoft.Office.Interop.Excel.Application xlsx = new Microsoft.Office.Interop.Excel.Application();
            Workbook workbook = null;

            try
            {
                workbook = xlsx.Workbooks.Open(AppConfiguration.FilePath, ReadOnly: false, Editable: true);
                Worksheet worksheet = workbook.Worksheets[1];
                Microsoft.Office.Interop.Excel.Range cells = worksheet.Cells["$A"];
                List<Analytics> list = (List<Analytics>)data;

                for (int i = 0; i < list.Count; i++)
                {
                    ((Microsoft.Office.Interop.Excel.Range)cells[i + 1, 0]).Value = list[i].ProductShare;
                    ((Microsoft.Office.Interop.Excel.Range)cells[i + 1, 1]).Value = list[i].MarketPotential;
                }

                workbook.Save();

            }
            catch(Exception e)
            {
                throw new Exception("Error while processing file");
            }
            finally
            {
                workbook.Close(SaveChanges: true);
                xlsx.Quit();
                Marshal.ReleaseComObject(workbook);
            }


Однако я всегда получал исключение в
((Microsoft.Office.Interop.Excel.Range)cells[i + 1, 0]).Value = list[i].ProductShare;


Что я уже пробовал:

Я искал в интернете и перепробовал все решения, которые нашел, но все они потерпели неудачу!

Maciej Los

Ну, вы должны признать, что "Я искал в интернете и перепробовал все решения, которые нашел, но все они потерпели неудачу! - это совсем не описательно!

F-ES Sitecore

Если вы получаете исключение, то есть проблема с вашим кодом.

Amr Mohammad Rashad

Да в коде есть ошибка и мне нужно знать как установить значение в ячейку это все что мне нужно

Richard Deeming

Если вы хотите, чтобы кто-то помог вам исправить исключение, то сначала вы должны сказать нам, что это за исключение.

Нажмите зеленую кнопку "улучшить вопрос" и добавьте полную информацию об исключении к вашему вопросу.

Amr Mohammad Rashad

Вы правы, я должен вставить то, что является первоначальным исключением. Тем не менее, я хотел, чтобы люди помогли мне исправить инструкцию setting value, которая является неправильной

4 Ответов

Рейтинг:
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" решение выше работало найти для меня!