C#OpenXML确定值是数字还是在sharedstringtable中

时间:2016-09-09 17:19:24

标签: c# excel openxml

我的程序需要扫描excel文档并获取特定单元格中的值并将它们放在列表中。

然而,电子表格中的数据都被格式化为常规数据,并且总是在SST中查找值,无论如何,并且不会将任何数字值放在列表中的电子表格中。

如何告诉我的程序数据是数字而不是对SST的引用?

foreach (Cell cell in row.Elements<Cell>())
{
    try
    {
        cellvalue1 = cell.CellValue.InnerText;
        if (cell.DataType == CellValues.SharedString && cellvalue2.Any(char.IsDigit))
        {
            cellvalue2 = ssT.ElementAt(Int32.Parse(cellvalue1)).InnerText;
        }
        else 
        {
            cellvalue2 = cell.CellValue.ToString();
        }
    }
    catch (Exception)
    {
        cellvalue2 = " ";
    }                                    

    switch (cellvalue2)
    {
        case ("WELL NAME and NUMBER"):
            WellnameCol = GetColumnName(cell.CellReference);                                                                                                           
            break;
        case ("FLOWING PRESSURE"):
            FlowpCol = GetColumnName(cell.CellReference);
            break;
        case ("SHUT-IN PRESSURE"):
            ShutpCol = GetColumnName(cell.CellReference);
            break;
        default:
            if (GetColumnName(cell.CellReference) == WellnameCol)
            {
                if (cellvalue2.Contains("#"))
                {
                    Wellname.Add(cellvalue2);
                    inRow = true;
                }
                else
                {
                    inRow = false;
                }                                                                                                
            }    
            else if (GetColumnName(cell.CellReference) == FlowpCol)
            {   
                 if (!cellvalue2.Contains("#") && inRow)
                     Flowp.Add(cellvalue2);
            }
            else if (GetColumnName(cell.CellReference) == ShutpCol)
            {   
                 if (inRow)
                 {
                     ShutP.Add(cellvalue2);
                 }
            }
            break;                                           
    }                                                                       
}

Try Catch语句用于确定单元格是否为空,然后将单元格返回为空字符串(如果是)。

所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

我创建了一个小型Excel文件,其格式为字符串的单元格为“1234”,第二个单元格的文本内容为“abcd”。

通过检查xlsx文件的内容,我看到了他们的xml代码。

<c r="A1" s="1"><v>1234</v></c>
<c r="A2" t="s"><v>0</v></c>

在第二个单元格中t="s"表示共享字符串。对于第一个,没有给出明确的数据类型(t属性)。这种区分也用于该MSDN样本中。 https://msdn.microsoft.com/de-de/library/office/hh298534.aspx以下是您问题的有趣部分:

        value = theCell.InnerText;
        if (theCell.DataType != null)
        {
            switch (theCell.DataType.Value)
            {
                case CellValues.SharedString:
                    var stringTable = 
                        wbPart.GetPartsOfType<SharedStringTablePart>()
                        .FirstOrDefault();                        
                    if (stringTable != null)
                    {
                        value = 
                            stringTable.SharedStringTable
                            .ElementAt(int.Parse(value)).InnerText;
                    }
                    break;
            }
        }

希望这有帮助。

答案 1 :(得分:0)

我过去做过类似的事情,从excel电子表格中提取数据是我用来检索单元格值的具体代码:

public static string GetCellValue(SharedStringTable sharedStringTable, Cell cell)
{
    string value = cell.CellValue.InnerText;

    if (cell.DataType != null
        && cell.DataType.Value == CellValues.SharedString)
    {
        return sharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
    }
    else
    {
        return value;
    }
}