sudhakarthikeyan Ответов: 1

Индекс находился за пределами границы массива


Из вышесказанного я хочу получить следующий результат

В таблице у меня есть запись следующим образом

Фермер код FarmDetailsdata FarmerName

1 TestA "Área de Milho":"1","Área de Mandioca":"2","Área de
Feijão":"2","Plantou alogdao no ano?":"Nao"

2 TestB "Área de Milho":"2","Área de Mandioca":"3","Área de
Feijão":"4","Plantou alogdao no ano?":"да"


Я хочу получить нижеприведенный вывод следующим образом

Farmerid NameArea de Milho Area de Mandioca Area de Feijao Plantou alogdao no ano?

1 TestA 1 2 2 Nao
2 Тестб 2 3 4 Да

Мой код aspx выглядит следующим образом

if (filterCriteria == "2" && dataFormat == "3")
{
если (!Directory.Exists(HttpContext.Current.Сервер.MapPath("~/") + "отчеты"))
{
Каталог.CreateDirectory(HttpContext.Current.Сервер.MapPath("~/") + "отчеты");
}
ВАР имя = "FarmerReportsSurveyQuestions" + Датавремя.Сейчас.Метод toString("ыыыы_ММ_ДД__АА") + ".XLSX-файл";
var outputDir = HttpContext.Current.Сервер.MapPath("~") + "\\отчеты\\";


var file = new FileInfo(outputDir + fileName);

пробовать
{
использование (var package = new ExcelPackage(file))
{

ExcelWorksheet worksheet = пакет.Рабочая тетрадь.Worksheets.Add("отчеты фермера/фермы");
рабочий лист.TabColor = Цвет.Зеленый;
рабочий лист.DefaultRowHeight = 12;
рабочий лист.HeaderFooter.Первостатейный.LeftAlignedText = строка.Формат("Generated: {0}", DateTime.Now.ToShortDateString());

DataTable dtFarmerFarmReports = dal.DAL_GetFarmer_FarmReports_All_Forexcel(originname, hdnSeasonalYear.Value.Метод toString());

var othercols = dtFarmerReports.Методом asenumerable().Метода SelectMany(х => У Х.Поле в<строка> У("farm_detailsdata").Split(новая строка[] { ":", "," },
StringSplitOptions.RemoveEmptyEntries).Где((y, i) => i % 2 == 0)).Различны().Выберите(х =&ГТ; новый datacolumn(х, вызова typeof(строка))).ToList(); //добавлено


foreach (DataColumn oc в othercols)
dtFarmerReports.Столбцы.Добавить(oc);

по каждому элементу (объекта datarow Dr в dtFarmerReports.Строк)
{
foreach (DataColumn oc в othercols)
dr.SetField(oc, dr.Field<string>("farm_detailsdata").Расщеплять(',')
.Где(г =&ГТ; г.Содержит(ОС.Имя_столбца)).Select(z => z.Split(':')[1]).FirstOrDefault());
}

dtFarmerReports.Столбцы.Удалить(dtFarmerReports.Столбцы["farm_detailsdata"]);

for (int r = 0; r < dtFarmerReports.Rows.Count; r++)
{
DataRow dr = dtFarmerReports.Ряды[Р];
for (int c = 0; c < dr.таблица.Столбцы.Count; c++)
рабочий лист.Ячейки[r + 2, c + 1].Значение = dr[c];
}


если (dtFarmerReports.Строк.Count > 0)
{
использование (var range = worksheet.Клетки[2, 1, 2, 11])
{
диапазон.Стиль.Шрифт.Жирный = истина;
диапазон.Стиль.Border.Top.Style = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Граница.Правильно.Стиль = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Border.Left.Style = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Граница.Дно.Стиль = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Заполнить.Шаблонтип = ExcelFillStyle.Твердый;
диапазон.Стиль.Шрифт.Цвет.SetColor(Цвет.Черный);
диапазон.Стиль.Заполнить.Фоновый цвет.SetColor(Цвет.Зеленый);
диапазон.AutoFitColumns();
}

рабочий лист.Ячейки["A1:AY1"].Merge = true;
рабочий лист.Ячейки["A1:AY1"].Value = "данные фермера/фермы";
рабочий лист.строка(1).Высота = 35 см;
использование (var range = worksheet.Ячейки[1, 1, 1, 11])
{
диапазон.Стиль.Шрифт.Жирный = истина;
диапазон.Style.Font.Size = 22;
диапазон.Стиль.Border.Top.Style = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Граница.Правильно.Стиль = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Граница.Дно.Стиль = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Border.Left.Style = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Заполнить.Шаблонтип = ExcelFillStyle.Твердый;
диапазон.Стиль.Заполнить.Фоновый цвет.SetColor(Цвет.LightSeaGreen);
диапазон.Стиль.Шрифт.Цвет.SetColor(Цвет.Черный);
диапазон.Стиль.Поле HorizontalAlignment = ExcelHorizontalAlignment.Центр;
диапазон.Стиль.Имеет = ExcelVerticalAlignment.Центр;
диапазон.Стиль.ShrinkToFit = false;
}

рабочий лист.Ячейки[2, 1].Значение = "идентификатор фермера";
рабочий лист.Ячейки[2, 2].Значение = "имя";
рабочий лист.Ячейки[2, 3].Значение = "нет. ФЕРМЕРСКИХ ХОЗЯЙСТВ";
рабочий лист.Ячейки[2, 4].Value = "оценка производства";
рабочий лист.Ячейки[2, 5].Значение = "ферма нет";
рабочий лист.Ячейки[2, 6].значение = "район";
рабочий лист.Ячейки[2, 7].значение = "СУБРАЙОН";
рабочий лист.Ячейки[2, 8].значение = "секция";
рабочий лист.Ячейки[2, 9].значение = "зона";
рабочий лист.Ячейки[2, 10].Value = "полевой персонал";
рабочий лист.Ячейки[2, 11].Value = "сведения о ферме";

for (int j = 0; j < dtFarmerReports.Rows.Count; j++)
{
int j1 = (j + 3);
farmerid = dtFarmerReports.Строки[j]["farmer_id"].Метод toString();
рабочий лист.Ячейки[(j1), 1].Значение = dtFarmerReports.Строки[j]["farmer_id"].Метод toString();
рабочий лист.Ячейки[(j1), 2].Значение = dtFarmerReports.Строки[j]["farmer_name"].Метод toString();
рабочий лист.Ячейки[(j1), 3].Значение = dtFarmerReports.Строки[j]["nooffarms"].Метод toString();
рабочий лист.Ячейки[(j1), 4].Значение = dtFarmerReports.Строки[j]["produtionestimation"].Метод toString();
рабочий лист.Ячейки[(j1), 5].Значение = dtFarmerReports.Строки[j]["farm_no"].Метод toString();
рабочий лист.Ячейки[(j1), 6].значение = dtFarmerReports.Строки[j]["districtname"].Метод toString();
рабочий лист.Ячейки[(j1), 7].значение = dtFarmerReports.Строки[j]["subdistrictname"].Метод toString();
рабочий лист.Ячейки[(j1), 8].значение = dtFarmerReports.Строки[j]["имя раздела"].Метод toString();
рабочий лист.Ячейки[(j1), 9].значение = dtFarmerReports.Строк[Дж]["имя_зоны"].Метод toString();
рабочий лист.Ячейки[(j1),10].Value = dtFarmerReports.Строки[j]["fieldstaffname"].Метод toString();
рабочий лист.Ячейки[(j1),11].Value = dtFarmerReports.Строки[j]["farm_detailsdata"].Метод toString();
}

рабочий лист.Ячейки["A2:AY2"].автофильтр = true;
}
еще
{
рабочий лист.Клетки["A1:I1"].Слияние = true;
рабочий лист.Ячейки["A1:I1"].Value = "нет данных фермера/фермы";
рабочий лист.строка(1).Высота = 35 см;
использование (var range = worksheet.Ячейки[1, 1, 1, 11])
{
диапазон.Стиль.Шрифт.Жирный = истина;
диапазон.Style.Font.Size = 18;
диапазон.Стиль.Border.Top.Style = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Граница.Правильно.Стиль = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Граница.Дно.Стиль = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Border.Left.Style = ExcelBorderStyle.Тонкий;
диапазон.Стиль.Заполнить.Шаблонтип = ExcelFillStyle.Твердый;
диапазон.Стиль.Заполнить.Фоновый цвет.Функции Setcolor(Цвет.Красный);
диапазон.Стиль.Шрифт.Цвет.SetColor(Цвет.Черный);
диапазон.Стиль.Поле HorizontalAlignment = ExcelHorizontalAlignment.Центр;
диапазон.Стиль.Имеет = ExcelVerticalAlignment.Центр;
диапазон.Стиль.ShrinkToFit = false;
}
}

рабочий лист.Ячейки.AutoFitColumns();
пакет.Рабочая тетрадь.Свойства.Название = "Отчеты Фермера";
пакет.Рабочая тетрадь.Свойства.Автор = "Олам";
пакет.Рабочая тетрадь.Свойства.Компания = "Olam";
пакет.Сохранить();
modalPopupExport.Скрыть();
}
Ответ.Четкий();
Ответ.Значение ContentType = Значение ContentType;
Ответ.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name);
Ответ.WriteFile(outputDir + fileName);
Свойство HttpContext.Тока.ApplicationInstance.CompleteRequest();
Ответ.Конец();
}
поймать (исключение бывший)
{
BindDetails();
это.modalPopupExport.Скрыть();
showStatusTrue.Стиль.Добавить("дисплей", "никто");
showStatusTrue.свойство innerHTML = "";
showStatusWarning.Стиль.Добавить("дисплей", "никто");
showStatusWarning.свойство innerHTML = "";
showStatusAlready.Стиль.Добавить("дисплей", "никто");
showStatusAlready.свойство innerHTML = "";
showStatusFalse.Style.Add("display", "block");
showStatusFalse.InnerHtml = "что-то пошло не так при экспорте";
farmerid = "" + farmerid;
Элемента управления scriptmanager.RegisterStartupScript(это.Пейдж, это.Метод gettype(), "ТММ", "myfunction () с;", ложные);
Logger log = новый регистратор();
бревно.WriteToErrorLog("FARMER REPORTS EXCEL", "EX", ex.Message.Метод toString(), "", "");
}
}


Когда я запускаю приведенный выше код показывает ошибку следующим образом

Индекс находился за пределами массива.

Ошибка отображается в следующей строке следующим образом


dr.SetField(oc, dr.Field<string>("farm_detailsdata").Расщеплять(',').Где(y => y.содержит(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());

пожалуйста, помогите мне, в чем ошибка в моем приведенном выше коде строки

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

From the above i want output as follows

  In table i have record as follows

Farmer id   FarmerName     FarmDetailsdata

1             TestA     "Área de Milho":"1","Área de Mandioca":"2","Área de 
                         Feijão":"2","Plantou alogdao no ano?":"Nao"

2             TestB     "Área de Milho":"2","Área de Mandioca":"3","Área de 
                         Feijão":"4","Plantou alogdao no ano?":"Yes"


I want to get the below output as follows

Farmerid NameArea de Milho  Area de Mandioca  Area de Feijao   Plantou alogdao no ano?

1       TestA             1           2                 2                 Nao
2      TestB              2           3                 4                 Yes

My aspx code as follows

if (filterCriteria == "2" && dataFormat == "3")
{
if (!Directory.Exists(HttpContext.Current.Server.MapPath("~/") + "reports"))
{
Directory.CreateDirectory(HttpContext.Current.Server.MapPath("~/") + "reports");
}
var fileName = "FarmerReportsSurveyQuestions" + DateTime.Now.ToString("yyyy_MM_dd__hh") + ".xlsx";
var outputDir = HttpContext.Current.Server.MapPath("~") + "\\reports\\";


var file = new FileInfo(outputDir + fileName);

 try
                        {
                            using (var package = new ExcelPackage(file))
                            {

                                ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("FARMER/FARM REPORTS");
                                worksheet.TabColor = Color.Green;
                                worksheet.DefaultRowHeight = 12;
                                worksheet.HeaderFooter.FirstFooter.LeftAlignedText = string.Format("Generated: {0}", DateTime.Now.ToShortDateString());

                                DataTable dtFarmerFarmReports = dal.DAL_GetFarmer_FarmReports_All_ForExcel(originname, hdnSeasonalYear.Value.ToString());

                                 var othercols = dtFarmerReports.AsEnumerable().SelectMany(x => x.Field<string>("farm_detailsdata").Split(new string[] { ":", "," },
                                StringSplitOptions.RemoveEmptyEntries).Where((y, i) => i % 2 == 0)).Distinct().Select(x => new DataColumn(x, typeof(string))).ToList(); //added


                                foreach (DataColumn oc in othercols)   
                                    dtFarmerReports.Columns.Add(oc);   

                                foreach (DataRow dr in dtFarmerReports.Rows) 
                                {
                                    foreach (DataColumn oc in othercols)
                                        dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',')
                                                .Where(y => y.Contains(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());
                                } 

                                dtFarmerReports.Columns.Remove(dtFarmerReports.Columns["farm_detailsdata"]); 

                                for (int r = 0; r < dtFarmerReports.Rows.Count; r++) 
                                {
                                    DataRow dr = dtFarmerReports.Rows[r];
                                    for (int c = 0; c < dr.Table.Columns.Count; c++)
                                        worksheet.Cells[r + 2, c + 1].Value = dr[c];
                                } 

                                
                                if (dtFarmerReports.Rows.Count > 0)
                                {
                                    using (var range = worksheet.Cells[2, 1, 2, 11])
                                    {
                                        range.Style.Font.Bold = true;
                                        range.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Right.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                                        range.Style.Fill.PatternType = ExcelFillStyle.Solid;
                                        range.Style.Font.Color.SetColor(Color.Black);
                                        range.Style.Fill.BackgroundColor.SetColor(Color.Green);
                                        range.AutoFitColumns();
                                    }

                                    worksheet.Cells["A1:AY1"].Merge = true;
                                    worksheet.Cells["A1:AY1"].Value = "FARMER/FARM DATA";
                                    worksheet.Row(1).Height = 35;
                                    using (var range = worksheet.Cells[1, 1, 1, 11])
                                    {
                                        range.Style.Font.Bold = true;
                                        range.Style.Font.Size = 22;
                                        range.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Right.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                                        range.Style.Fill.PatternType = ExcelFillStyle.Solid;
                                        range.Style.Fill.BackgroundColor.SetColor(Color.LightSeaGreen);
                                        range.Style.Font.Color.SetColor(Color.Black);
                                        range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                                        range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                                        range.Style.ShrinkToFit = false;
                                    }

                                    worksheet.Cells[2, 1].Value = "FARMER ID";
                                    worksheet.Cells[2, 2].Value = "NAME";
                                    worksheet.Cells[2, 3].Value = "NO. OF FARMS";
                                    worksheet.Cells[2, 4].Value = "PRODUCTION ESTIMATION";
                                    worksheet.Cells[2, 5].Value = "FARM NO";
                                    worksheet.Cells[2, 6].Value = "DISTRICT";
                                    worksheet.Cells[2, 7].Value = "SUB DISTRICT";
                                    worksheet.Cells[2, 8].Value = "SECTION";
                                    worksheet.Cells[2, 9].Value = "ZONE";
                                    worksheet.Cells[2, 10].Value = "FIELD STAFF";
                                    worksheet.Cells[2, 11].Value = "FARM DETAILS DATA";

                                    for (int j = 0; j < dtFarmerReports.Rows.Count; j++)
                                    {
                                        int j1 = (j + 3);
                                        farmerid = dtFarmerReports.Rows[j]["farmer_id"].ToString();
                                        worksheet.Cells[(j1), 1].Value = dtFarmerReports.Rows[j]["farmer_id"].ToString();
                                        worksheet.Cells[(j1), 2].Value = dtFarmerReports.Rows[j]["farmer_name"].ToString();
                                        worksheet.Cells[(j1), 3].Value = dtFarmerReports.Rows[j]["nooffarms"].ToString();
                                        worksheet.Cells[(j1), 4].Value = dtFarmerReports.Rows[j]["produtionestimation"].ToString();
                                        worksheet.Cells[(j1), 5].Value = dtFarmerReports.Rows[j]["farm_no"].ToString();
                                        worksheet.Cells[(j1), 6].Value = dtFarmerReports.Rows[j]["districtname"].ToString();
                                        worksheet.Cells[(j1), 7].Value = dtFarmerReports.Rows[j]["subdistrictname"].ToString();
                                        worksheet.Cells[(j1), 8].Value = dtFarmerReports.Rows[j]["sectionname"].ToString();
                                        worksheet.Cells[(j1), 9].Value = dtFarmerReports.Rows[j]["zonename"].ToString();
                                        worksheet.Cells[(j1),10].Value = dtFarmerReports.Rows[j]["fieldstaffname"].ToString();
                                        worksheet.Cells[(j1),11].Value = dtFarmerReports.Rows[j]["farm_detailsdata"].ToString();
                                    }

                                    worksheet.Cells["A2:AY2"].AutoFilter = true;
                                }
                                else
                                {
                                    worksheet.Cells["A1:I1"].Merge = true;
                                    worksheet.Cells["A1:I1"].Value = "NO FARMER/FARM DATA";
                                    worksheet.Row(1).Height = 35;
                                    using (var range = worksheet.Cells[1, 1, 1, 11])
                                    {
                                        range.Style.Font.Bold = true;
                                        range.Style.Font.Size = 18;
                                        range.Style.Border.Top.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Right.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Bottom.Style = ExcelBorderStyle.Thin;
                                        range.Style.Border.Left.Style = ExcelBorderStyle.Thin;
                                        range.Style.Fill.PatternType = ExcelFillStyle.Solid;
                                        range.Style.Fill.BackgroundColor.SetColor(Color.Red);
                                        range.Style.Font.Color.SetColor(Color.Black);
                                        range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
                                        range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                                        range.Style.ShrinkToFit = false;
                                    }
                                }

                                worksheet.Cells.AutoFitColumns();
                                package.Workbook.Properties.Title = "Farmer Reports";
                                package.Workbook.Properties.Author = "Olam";
                                package.Workbook.Properties.Company = "Olam";
                                package.Save();
                                modalPopupExport.Hide();
                            }
                            Response.Clear();
                            Response.ContentType = ContentType;
                            Response.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name);
                            Response.WriteFile(outputDir + fileName);
                            HttpContext.Current.ApplicationInstance.CompleteRequest();
                            Response.End();
                        }
                        catch (Exception ex)
                        {
                            BindDetails();
                            this.modalPopupExport.Hide();
                            showStatusTrue.Style.Add("display", "none");
                            showStatusTrue.InnerHtml = "";
                            showStatusWarning.Style.Add("display", "none");
                            showStatusWarning.InnerHtml = "";
                            showStatusAlready.Style.Add("display", "none");
                            showStatusAlready.InnerHtml = "";
                            showStatusFalse.Style.Add("display", "block");
                            showStatusFalse.InnerHtml = "Something went wrong while export";
                            farmerid = "" + farmerid;
                            ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "tmp", "myFunction();", false);
                            Logger log = new Logger();
                            log.WriteToErrorLog("FARMER REPORTS EXCEL", "EX", ex.Message.ToString(), "", "");
                        }
                    }


          When i run the above code shows error as follows
       
             Index was outside the bounds of the array.
  
        The error shows in below line as follows


     dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',').Where(y => y.Contains(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());

       please help me what is the mistake in my above line code

Richard MacCutchan

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

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

1 Ответов

Рейтинг:
1

OriginalGriff

dr.SetField(oc, dr.Field<string>("farm_detailsdata").Split(',').Where(y => y.Contains(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());

Простая причина заключается в том, что строка, которую вы разделяете, не содержит символа': '- поэтому возвращаемый массив Split не содержит двух или более элементов, поэтому ваш доступ к элементу 1 завершится неудачей.

Мы ничего не можем сделать, чтобы исправить это: это проблема с данными в какой-то форме, и вам нужно выяснить, как данные без вашего двоеточия попали в вашу систему.


[no name]

я уже проверил мы разделили нижнюю линию

var othercols = dtFarmerReports.Методом asenumerable().Метода SelectMany(х => У Х.Поле в<строка> У("farm_detailsdata").Split(новая строка[] { ":", "," },

Тогда опять же зачем нужна нижеприведенная строка

dr.SetField(oc, dr.Field<string>("farm_detailsdata").Расщеплять(',').Где(y => y.содержит(oc.ColumnName)).Select(z => z.Split(':')[1]).FirstOrDefault());

OriginalGriff

Не забывайте, что Split с массивом символов разбивается на все эти символы: он генерирует три строки из этого: "aaa,bbb:ccc". Если ваши данные изначально содержат "aaa:bbb,ccc", то ваше первое разделение создает
aaa:bbb
КТС
И ваш второй раскол затем потерпит неудачу на втором из них и даст вам ошибку, которую вы получите.
Проверьте свои данные! :смеяться: