C#打开xml无法读取字符串值

问题描述 投票:0回答:1

嗨,我正在使用 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;
}

上述方法的问题是,如果单元格中有任何字符串数据,那么它会读取为某个整数。我不知道为什么会发生这种情况。整数值读取正确。仅字符串/文本字段存在问题。我可以知道我在这里缺少什么吗?有人可以帮我解决这个问题吗?任何帮助,将不胜感激。谢谢

c# excel asp.net-core openxml iformfile
1个回答
0
投票

在 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.