我的程序需要扫描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语句用于确定单元格是否为空,然后将单元格返回为空字符串(如果是)。
所有帮助表示赞赏。
答案 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;
}
}