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 代码更好理解。
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 的问题。我自己就写了一个根据这个规律写了一个补满所有属性的方法。
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);
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