Net core, и я пытаюсь прочитать Excel, открыв XML. Я пытаюсь получить значение ячейки, передавая определенные сведения о строках и столбцах.
Ниже моя реализация.
private DataTable ConvertExcelToDataTable(IFormFile uploadRegistration)
{
//Create a new DataTable.
var table = new DataTable();
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(uploadRegistration.OpenReadStream(), false))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
string relationshipId = sheets.First().Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
foreach (Cell cell in rows.ElementAt(0))
{
table.Columns.Add(GetCellValue(spreadSheetDocument, cell));
}
foreach (Row row in rows)
{
DataRow tempRow = table.NewRow();
for (int i = 0; i < row.Descendants<Cell>().Count(); i++)
{
// tempRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i));
Console.WriteLine(GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i))); // Here i am able to display cell value but not row and column details
}
table.Rows.Add(tempRow);
}
}
table.Rows.RemoveAt(0);
return table;
}
У меня есть метод, который пытается получить информацию о строках и столбцах, как показано ниже.
public static (int row, int col) ParseCellAddress(string s)
{
StringBuilder stringBuilderCol = new StringBuilder();
StringBuilder stringBuilderRow = new StringBuilder();
foreach (char c in s)
{
if (char.IsLetter(c))
{
if (stringBuilderRow.Length > 0)
{
throw new ArgumentException($"Invalid Cell adress {s}.");
}
stringBuilderCol.Append(c);
}
else if (char.IsDigit(c))
{
if (stringBuilderCol.Length < 1)
{
throw new ArgumentException($"Invalid Cell adress {s}.");
}
stringBuilderRow.Append(c);
}
else
{
throw new ArgumentException($"Invalid Cell adress {s}.");
}
}
if (stringBuilderRow.Length == 0 || stringBuilderCol.Length == 0)
{
throw new ArgumentException($"Invalid Cell adress {s}.");
}
int rowIdx = int.Parse(stringBuilderRow.ToString());
// calc column index from column name
string columnName = stringBuilderCol.ToString();
int colIdx = 0;
int pow = 1;
for (int i = columnName.Length - 1; i >= 0; i--)
{
colIdx += (columnName[i] - 'A' + 1) * pow;
pow *= 26;
}
return (rowIdx, colIdx);
}
В приведенном выше методе я могу получить информацию о строках и столбцах.
Теперь я смотрю: если я передам конкретную строку и детали, например, столбец 4 строки 2, тогда я хотел бы получить значение ячейки. Я ищу какой-то метод, который будет принимать строку и столбец в качестве входных данных и получать значение ячейки.
private string GetCellValue(int row, int column){
//return data for this particular row and column
}
Может кто-то помочь мне с этим. Любая помощь будет оценена по достоинству. Спасибо
Вы можете попытаться получить конкретную ячейку в определенной строке, используя ниже
private static Cell GetCell(Worksheet worksheet, string columnName, uint rowIndex)
{
Row row = worksheet.GetFirstChild<SheetData>().Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
if (row != null)
{
return row.Elements<Cell>().FirstOrDefault(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0);
}
return null;
}
Пример кода (имена столбцов: A, B, C и т. д.)
Cell cell = GetCell(worksheetPart.Worksheet, "A", 3);// Gets value for Column A at row#3
Имена столбцов @Niranjan — это столбцы таблицы Excel, т. е. A, B, C.
Привет @zahid Mustafa, в приведенном выше методе я столкнулся с одной проблемой. Если есть какое-либо строковое значение, оно представляет собой целое число и некоторое случайное значение. Могу ли я узнать, в чем может быть причина?
Привет @zaid mustafa, могу ли я узнать, какое имя столбца и индекс строки мне следует отправить? например, если я хочу прочитать данные из строки 20 и столбца 4, что мне следует передать вышеуказанному методу?