XML单元格不正确地显示为SharedStrings

时间:2014-08-07 15:56:52

标签: c# asp.net excel openxml openxml-sdk

我正在通过Excel电子表格进行解析并且在某些值上遇到了一些问题,所以根据stackoverflow成员的建议,我将它们评估为共享字符串。但是,现在,某些单元格值不是共享字符串,而我的条件仍然计算为true,这意味着它们是SharedStrings。所以我想知道我的评估代码是否正确,或者我使用过的Excel电子表格是否有问题。这是一个示例条件,在这种情况下应该评估false,因为SerialNumber列不是共享字符串,但它被评估为共享字符串,因此导致程序崩溃。

bool isSharedString = (((Cell)r.ChildElements[0]).DataType.Value == CellValues.SharedString);

row["SerialNumber"] = isSharedString ? stringTable.SharedStringTable.ElementAt(int.Parse(r.ChildElements[0].InnerText)).InnerText : r.ChildElements[0].InnerText;

这是我正在使用的行的内部外部xml代码。唯一不共享字符串的是A2和G2。

<x:row r="2" spans="1:14" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
    <x:c r="A2"><x:v>20000001</x:v></x:c>
    <x:c r="B2" t="s"><x:v>14</x:v></x:c>
    <x:c r="C2" s="1" t="s"><x:v>19</x:v></x:c>
    <x:c r="D2" t="s"><x:v>19</x:v></x:c>
    <x:c r="E2" t="s"><x:v>19</x:v></x:c>
    <x:c r="F2" t="s"><x:v>19</x:v></x:c>
    <x:c r="G2"><x:v>0</x:v></x:c>
    <x:c r="H2" t="s"><x:v>19</x:v></x:c>
    <x:c r="I2" t="s"><x:v>19</x:v></x:c>
    <x:c r="J2" t="s"><x:v>20</x:v></x:c>
    <x:c r="K2" t="s"><x:v>22</x:v></x:c>
    <x:c r="L2" t="s"><x:v>20</x:v></x:c>
    <x:c r="M2" t="s"><x:v>22</x:v></x:c>
    <x:c r="N2" t="s"><x:v>19</x:v></x:c>
</x:row>

1 个答案:

答案 0 :(得分:0)

在petelids告诉我从excel电子表格中查看XML之后,我想出来了。即使特定的excel单元格没有使用SharedStrings,我原来的程序也一直在崩溃,因为我觉得三元条件始终是正确的。但是,xml显示虽然具有t =&#34; s&#34;的单元格,但没有SharedStrings的单元格没有,这意味着非sharedString单元格没有相应的DataType。因此,代码失败了,因为DataType的{​​{1}}属性实际上是空的,因此尝试获取它的(((Cell)r.ChildElements[0])会导致空指针异常。为了解决这个问题,我最终只是检查Value是否为空。当它是,那么我只是得到了内部的xml内容。如果不是,那么我使用xml内容作为SharedStringsTable索引来查找实际的字符串。结案!

相关问题