嗨,我正在使用 open xml 在我的 .Net 应用程序中读取 excel。我有一个方法,它接受行和列作为输入参数并返回该特定单元格的值。下面是我的实现。
public List<ServicePortDto> GetServicePorts(IFormFile formFile, Dictionary<string, int> starRowForPorts)
{
using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(formFile.OpenReadStream(), false))
{
WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
List<int> portRows = new();
int counter = 0;
IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
foreach (var sheet in sheets)
{
int startRowPort = starRowForPorts.Where(x=>x.Key == sheet.Name.Value).Select(x => x.Value).FirstOrDefault();
string relationshipId = sheet.Id.Value;
WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
Worksheet workSheet = worksheetPart.Worksheet;
SheetData sheetData = workSheet.GetFirstChild<SheetData>();
IEnumerable<Row> rows = sheetData.Descendants<Row>();
rows = rows.Where(x=>x.RowIndex >= startRowPort);
foreach (Row row in rows)
{
if(row.RowIndex >= startRowPort)
{
string portName = GetCell(workSheet, "B", startRowPort).InnerText;
if (portName != null)
{
counter = counter + 1;
}
else
{
break;
}
}
}
}
}
return new List<ServicePortDto>();
}
下面是GetCell方法。
private static Cell GetCell(Worksheet worksheet, string columnName, int 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;
}
上述方法的问题是,如果单元格中有任何字符串数据,那么它会读取为某个整数。我不知道为什么会发生这种情况。整数值读取正确。仅字符串/文本字段存在问题。我可以知道我在这里缺少什么吗?有人可以帮我解决这个问题吗?任何帮助,将不胜感激。谢谢
在 Open XML 中,单元格值存储为共享字符串或直接存储为内联字符串,您需要相应地处理它们。
private static string GetCellValue(WorkbookPart workbookPart, Cell cell, SharedStringTablePart stringTablePart)
{
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
{
if (stringTablePart != null)
{
SharedStringItem sharedStringItem = stringTablePart.SharedStringTable.Elements<SharedStringItem>().ElementAt(int.Parse(cell.InnerText));
return sharedStringItem.Text?.Text;
}
}
else if (cell.CellValue != null)
{
return cell.CellValue.Text;
}
return null;
}