EXCEL-XML 代码相对行列转换绝对

这段时间因为工作的要求,需要在程序中处理xml 格式的excel 文档。但是在期间遇到了一个问题就是Row 和 Cell 的index 属性相对绝对的问题。

之前在bing 找了一下没找到介绍相对转换成绝对的资料。在经过多次的尝试和对比在空白的文档中不同的cell 中输入值后的XML文件的代码。

终于找到了,在什么情况下 Row 和Cell  的index属性的时显时隐的问题。

总结:

1.在空白的文档中第一次在一个单元格中输入值。如果是A行,那么Row 就没有index 属性,如果是1 列,那么Cell 就没有Index 属性。(如果不是第一次输入的话,有可能其他单元格就保存了之前的相对或者是绝对的index,就不一定了)

2.如果在第一次在文档中输入值,连续的输入有值的单元格总是以相对属性表示(即没有显示index属性),Row则是依赖最左边带有绝对Index属性的单元格,或者是第一行(A)。Cell 的也类似(方向向上)。

3.如果在文档中一个单元格设值并且与其相邻的单元格没有值,那这个单元格的Row Cell 的index都是绝对属性的(即显示有index="x")

如图,A1,A2,A3 Row Cell都是没有index 属性,因为A1 是第一行第一列,默认两个属性都是1,A2,A3 则是Row属性依赖A1,而他们是第一列默认也是没有Cell 的index 属性。 D5 相对来说独立它的Row Cell 的index属性都是绝对的。 其他的就不说了,直接给xml 代码更好理解。

xml 源码
  1 <?xml version="1.0"?>
  2 <?mso-application progid="Excel.Sheet"?>
  3 <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  4  xmlns:o="urn:schemas-microsoft-com:office:office"
  5  xmlns:x="urn:schemas-microsoft-com:office:excel"
  6  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  7  xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet"
  8  xmlns:html="http://www.w3.org/TR/REC-html40">
  9  <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
 10   <Author>user</Author>
 11   <LastAuthor>user</LastAuthor>
 12   <Created>2008-10-27T07:49:59Z</Created>
 13   <LastSaved>2008-10-27T08:20:37Z</LastSaved>
 14   <Version>14.00</Version>
 15  </DocumentProperties>
 16  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office">
 17   <AllowPNG/>
 18  </OfficeDocumentSettings>
 19  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
 20   <WindowHeight>10005</WindowHeight>
 21   <WindowWidth>10005</WindowWidth>
 22   <WindowTopX>120</WindowTopX>
 23   <WindowTopY>135</WindowTopY>
 24   <ProtectStructure>False</ProtectStructure>
 25   <ProtectWindows>False</ProtectWindows>
 26  </ExcelWorkbook>
 27  <Styles>
 28   <Style ss:ID="Default" ss:Name="Normal">
 29    <Alignment ss:Vertical="Center"/>
 30    <Borders/>
 31    <Font ss:FontName="宋体" x:CharSet="134" ss:Size="11" ss:Color="#000000"/>
 32    <Interior/>
 33    <NumberFormat/>
 34    <Protection/>
 35   </Style>
 36   <Style ss:ID="s62">
 37    <Alignment ss:Vertical="Bottom"/>
 38    <Borders/>
 39    <Font ss:FontName="Arial" x:Family="Swiss"/>
 40    <Interior/>
 41    <NumberFormat/>
 42    <Protection/>
 43   </Style>
 44  </Styles>
 45  <Worksheet ss:Name="Sheet1">
 46   <Table ss:ExpandedColumnCount="11" ss:ExpandedRowCount="5" x:FullColumns="1"
 47    x:FullRows="1" ss:StyleID="s62" ss:DefaultColumnWidth="54">
 48    <Column ss:Index="2" ss:StyleID="s62" ss:AutoFitWidth="0" ss:Width="42.75"/>
 49    <Column ss:Index="9" ss:StyleID="s62" ss:AutoFitWidth="0" ss:Width="65.25"/>
 50    <Column ss:Index="11" ss:StyleID="s62" ss:AutoFitWidth="0" ss:Width="51.75"/>
 51    <Row ss:AutoFitHeight="0" ss:Height="13.5">
 52     <Cell><Data ss:Type="String">A1</Data></Cell>
 53    </Row>
 54    <Row ss:AutoFitHeight="0" ss:Height="13.5">
 55     <Cell><Data ss:Type="String">A2</Data></Cell>
 56     <Cell><Data ss:Type="String">B2</Data></Cell>
 57     <Cell><Data ss:Type="String">C2</Data></Cell>
 58     <Cell ss:Index="5"><Data ss:Type="String">E2</Data></Cell>
 59    </Row>
 60    <Row ss:AutoFitHeight="0" ss:Height="13.5">
 61     <Cell><Data ss:Type="String">A3</Data></Cell>
 62    </Row>
 63    <Row ss:Index="5">
 64     <Cell ss:Index="4"><Data ss:Type="String">D5</Data></Cell>
 65    </Row>
 66   </Table>
 67   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
 68    <Selected/>
 69    <Panes>
 70     <Pane>
 71      <Number>3</Number>
 72      <ActiveRow>4</ActiveRow>
 73      <ActiveCol>3</ActiveCol>
 74     </Pane>
 75    </Panes>
 76    <ProtectObjects>False</ProtectObjects>
 77    <ProtectScenarios>False</ProtectScenarios>
 78    <x:ViewableRange>R1:R262144</x:ViewableRange>
 79    <x:Selection>R10C6</x:Selection>
 80   </WorksheetOptions>
 81   <c:WorksheetOptions/>
 82  </Worksheet>
 83  <Worksheet ss:Name="Sheet2">
 84   <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
 85    x:FullRows="1" ss:StyleID="s62" ss:DefaultColumnWidth="54">
 86   </Table>
 87   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
 88    <ProtectObjects>False</ProtectObjects>
 89    <ProtectScenarios>False</ProtectScenarios>
 90    <x:ViewableRange>R1:R262144</x:ViewableRange>
 91    <x:Selection>R1C1</x:Selection>
 92   </WorksheetOptions>
 93   <c:WorksheetOptions/>
 94  </Worksheet>
 95  <Worksheet ss:Name="Sheet3">
 96   <Table ss:ExpandedColumnCount="1" ss:ExpandedRowCount="1" x:FullColumns="1"
 97    x:FullRows="1" ss:StyleID="s62" ss:DefaultColumnWidth="54">
 98   </Table>
 99   <WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">
100    <ProtectObjects>False</ProtectObjects>
101    <ProtectScenarios>False</ProtectScenarios>
102    <x:ViewableRange>R1:R262144</x:ViewableRange>
103    <x:Selection>R1C1</x:Selection>
104   </WorksheetOptions>
105   <c:WorksheetOptions/>
106  </Worksheet>
107  <c:ComponentOptions>
108    <c:Label>
109     <c:Caption>Microsoft Office Spreadsheet</c:Caption>
110    </c:Label>
111    <c:MaxHeight>80%</c:MaxHeight>
112    <c:MaxWidth>80%</c:MaxWidth>
113    <c:NextSheetNumber>1</c:NextSheetNumber>
114   </c:ComponentOptions>
115  <x:WorkbookOptions>
116    <c:OWCVersion>12.0.0.6502</c:OWCVersion>
117    <x:Height>8811</x:Height>
118    <x:Width>22093</x:Width>
119   </x:WorkbookOptions>
120 </Workbook>


因为我在已经被编辑过的文档中在特定的地方插入值,所以之前就因为这个Index 的问题。我自己就写了一个根据这个规律写了一个补满所有属性的方法。

View Code
 1  XmlDocument doc = new XmlDocument();
 2         doc.LoadXml(xmlreport);
 3         //XmlNodeList nodeList;
 4         XmlElement root = doc.DocumentElement;
 5         const string nmgstring = "urn:schemas-microsoft-com:office:spreadsheet";
 6         XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
 7         nsmgr.AddNamespace("ss", nmgstring);
 8         XmlNode Temnode = root.SelectNodes("/ss:Workbook/ss:Worksheet/ss:Table", nsmgr)[0];
 9 
10        //调用方法。得到这个字典就可以按照自己的来如何操作了
11             Dictionary<int, int> RowIndexs = SelectAllIndex(Temnode, nsmgr, true);

 

View Code
 1  /// <summary>
 2     /// 查找所有的index 信息,包含相对(-1)绝对(index 值)。如果不存在使用0作为其值 0425 liuhua
 3     /// </summary>
 4     /// <param name="TemRowNode">ss:table </param>
 5     /// <param name="nsmgr"></param>
 6     /// <returns></returns>
 7     private Dictionary<int, int> SelectAllIndex(XmlNode TemRowNode, XmlNamespaceManager nsmgr, bool IsRow)
 8     {
 9         Dictionary<int, int> TemResult = new Dictionary<int, int>();
10         XmlNodeList TemnodeList;
11         int TemTotal = 0;
12         if (IsRow)
13             TemnodeList = TemRowNode.SelectNodes("ss:Row", nsmgr);
14         else
15             TemnodeList = TemRowNode.SelectNodes("ss:Cell", nsmgr);
16 
17         TemTotal = TemnodeList.Count+1;
18         int temno = 0;
19         for (int i = 1; i < TemTotal; i++)
20         {
21             int tindex = -1;
22             XmlNode temnode = TemnodeList[temno++];
23             if (temnode != null)
24             {
25                 XmlNode ar = temnode.Attributes.GetNamedItem("ss:Index");
26                 if (ar != null)
27                 {
28                     tindex = int.Parse(ar.Value);
29                     if (tindex > i)
30                     {
31                         // 如果当前的Index 比当前位置的应该的值大,那么在其之前应该没有显示写出缺少的index
32                         //在此补充修改循环总次数,确保包含最大index (绝对和相对) 
33                         TemTotal += tindex - i;
34                         for (; i < tindex; i++)
35                             TemResult.Add(i, 0);
36                         TemResult.Add(tindex, i);
37                     }
38                     else if (tindex == i)
39                     { TemResult.Add(i, tindex); }
40                     else
41                     { /* 这个情况是不合法的格式。不做考虑*/ }
42                 }
43                 else
44                 {
45                     TemResult.Add(i, tindex);
46                 }
47             }
48             else
49             {
50                 TemResult.Add(i, 0);
51             }
52 
53         }
54         return TemResult;
55     }

 

因为没有做有dome .只上传了这点代码。

算是个简单的分享,记录学习的点滴。如果有什么写错的,还请指出!谢谢。。

转载于:https://www.cnblogs.com/fxam/archive/2012/04/26/xml.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值