Как динамически добавлять (или) вставлять значения в столбец данных в С#?

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

Мне нужно будет вставить значение каждой ячейки в столбец данных. Как динамически добавлять (или) вставлять значения в столбец данных в С#?

В предположении, что файл Excel имеет 2 строки и 3 столбца.

FirstName LastName Location
---------------------------
Albert     B         Miami
Jackson    C         Tampa

Мне нужно будет заполнить таблицу данных/столбец данных этими значениями ячеек. Итерация цикла Foreach работает нормально и получает значение каждой ячейки. Я застрял при вставке каждого значения ячейки в столбец данных/строку данных.

int iCellCount = 3;  // In this example, i am defining cell count = 3 as static value. In the real time, cell count is picked from the excel file.
var cellValue = string.Empty;
DataTable dt = new DataTable();
foreach (ExcelReportCell excelCell in excelRow) // Iterating the excel cell row by row in the Excel Sheet
{
    cellValue = excelCell.GetText().ToString(); // cellValue is assigned dynamically through excel file cell by cell iteration logic
    for (int i = 1; i <= iCellCount; i++)
    {
        dt.Columns.Add();
        // Expected to assign each column values
    }
}

person goofyui    schedule 18.06.2019    source источник
comment
Когда вы говорите // Expected to assign each column values в своем коде, вы имеете в виду, что вам нужно несколько строк в вашей таблице данных, которые будут представлять ваш файл Excel?   -  person JayV    schedule 18.06.2019
comment
DataRow dr = dt.NewRow(); Затем установите значения dr для каждой ячейки, добавьте их в таблицу: dt.Rows.Add(dr);   -  person LarsTech    schedule 18.06.2019
comment
На основе итерации значения ячеек присваиваются столбцам. Где столбцы назначаются строке данных   -  person goofyui    schedule 18.06.2019
comment
Ну, для начала нужно установить столбцы. Затем вы устанавливаете строки.   -  person LarsTech    schedule 18.06.2019


Ответы (3)


Вам нужно добавить все столбцы (сделайте свой метод независимым от имени столбца, чтобы не было жестко закодированных строк), а затем добавьте все соответствующие значения.

DataTable dt = new DataTable();
List<string> colList = new List<string>();

// Loop through column collection 
// Add all your columns to data table first
foreach (ExcelReportColumn eachColumn in excelColumn)
{
    dt.Columns.Add(eachColumn, typeof(string));
    colList.Add(eachColumn);
}

DataRow newRow;
int currentCol = 0;
// Then add your data rows
foreach (ExcelReportCell excelCell in excelRow)
{
    newRow = dt.NewRow();
    // Magic Method: You need to know the column name for the the current cell
    string columnName = colList[currentCol]; 
    newRow[columnName] = excelCell;
    dt.Rows.Add(newRow);
    currentCol++;
}
person Yash Malla    schedule 18.06.2019
comment
, спасибо.. я согласен с вами.. нам нужно добавить все столбцы перед назначением записей - person goofyui; 19.06.2019
comment
Если у вас есть решение из этого ответа, отметьте его как ответ. Если вам нужна дополнительная информация/помощь, увольняйтесь. - person Yash Malla; 19.06.2019
comment
Имена столбцов не сопоставляются со строкой данных, поэтому я не могу получить столбцы в данных. // Отсутствует добавление столбца в строку. dt.Rows.Добавить (новаяСтрока); - person goofyui; 22.06.2019
comment
Не уверен, что вы имели в виду, но идея состоит в том, чтобы иметь строгий порядок имен столбцов, проиндексированных в массиве. И используйте это при вставке строк. - person Yash Malla; 22.06.2019
comment
Немного изменил ответ, чтобы было легче понять, что я имел в виду в комментарии выше. Примечание. Может быть более простой способ сделать это, если Infragistics.dll может захотеть прочитать их документацию. Но изначально в С# способ, упомянутый в этом ответе, должен справиться с этим. - person Yash Malla; 22.06.2019

Здесь я предполагаю, что ваши столбцы уже добавлены. Вы можете попробовать это.

int iCellCount = 3;  // In this example, i am defining cell count = 3 as static value. In the real time, cell count is picked from the excel file.
var cellValue = string.Empty;
DataTable dt = new DataTable();
DataRow row;  //Create a DataRow
foreach (ExcelReportCell excelCell in excelRow) // Iterating the excel cell row by row in the Excel Sheet
{
                    cellValue = excelCell.GetText().ToString(); // cellValue is assigned dynamically through excel file cell by cell iteration logic
                    for (int i = 1; i <= iCellCount; i++)
                    {
                        row = dt.NewRow();
                        row["Your_Column_Name_Here"] = cellValue;
                        dt.Rows.Add(row);
                     }
}
person Cujoey    schedule 18.06.2019
comment
спасибо Cujoey, я работаю над синтаксисом. .. Спасибо за это ..!! есть некоторое сходство между вашим синтаксисом и синтаксисом алена.. полезно - person goofyui; 18.06.2019

Поскольку вы не можете использовать linq, вот другое решение.

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

var rowIndex =0;
forech (var row in excelrows){
DataRow dtRow= null;
var cellIndex = 0;
foreach (ExcelReportCell cell in row){
if (rowIndex ==0) // generate the columns
{
dt.Columns.Add(new ColumnData(cell.GetText().ToString()));
}else { // the columns has already been generated then generate the row
 dtRow = dtRow?? dt.NewRow();
 dtRow[cellIndex] = cell.GetText(); 
 }
cellIndex++;
}
if (dtRow != null)
  dt.Rows.Add(dtRow);

rowIndex ++;
}
person Alen.Toma    schedule 18.06.2019
comment
спасибо .. я использую существующую логику кода, которая повторяет ячейку за ячейкой. Компоненты Excel взяты из dll Infragistics. Я предполагаю, что мы не сможем использовать запрос linq.. в моем сценарии.. я пробовал, не смог - person goofyui; 18.06.2019
comment
Хорошо, я обновил свой ответ, прочитал его и попытался понять концепцию. Я написал этот код здесь, поэтому вы можете столкнуться с некоторой ошибкой, когда будете вводить его в vs. - person Alen.Toma; 18.06.2019
comment
спасибо, Ален, я работаю над синтаксисом. .. Спасибо за это ..!! - person goofyui; 18.06.2019
comment
Не забудьте отметить это как ответ, если это поможет вам решить проблему - person Alen.Toma; 19.06.2019