当前位置: 首页 > 编程日记 > 正文

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

相关文章:

Integer 和 int 比较的特殊之处

2019独角兽企业重金招聘Python工程师标准>>> 第一个例子&#xff1a; 假设我们同时定义 int a 3; int b 3; 编译器先处理int a 3&#xff1b; 首先它会在栈中创建一个变量为a的引用&#xff0c;然后查找栈中是否有3这个值&#xff0c;如果没找到&#xff0c;就…

偷偷mark下一个

java书单thinking in java java战 Effective Java 深入了解JVM虚拟机 java性能优化权威指南 JSR133 Google Guava官方教程版权声明&#xff1a;本文博主原创文章&#xff0c;博客&#xff0c;未经同意不得转载。 转载于:https://www.cnblogs.com/hrhguanli/p/4915607.html

unix odbc php 连接sqlserver,Ubuntu下通过unixODBC连接MS SqlServer2005

一、下载相关软件 unixODBC、freetds(1) Linux系统的ODBC unixODBC-2.2.8.tar.gz (http://www.unixodbc.org)(2) 连接SQLServer或Sybase的驱动 freetds-0.62.4.tar.gz (http://www.freetds.org)二、安装和配置(1) 安装unixODBC# tar vxzf unixODBC-2.2.8.tar.gz# cd un…

Apache htpasswd命令

一、简介 htpasswd是apache的一个工具&#xff0c;该工具主要用于建立和更新存储用户名、密码的文本文件&#xff0c;主要用于对基于http用户的认证。 二、语法 Usage:htpasswd [-cimBdpsDv] [-C cost] passwordfile usernamehtpasswd -b[cmBdpsDv] [-C cost] passwordfile use…

l2-22(重排链表)

题目链接&#xff1a;https://pintia.cn/problem-sets/994805046380707840/problems/994805057860517888 题意&#xff1a;给定链表L1->L2->...->Ln&#xff0c;要求按Ln->L1->Ln-1->L2->...的格式输出。 思路&#xff1a;水模拟&#xff0c;按照要求做就…

深入研究敏捷的成功因素

Scott W. Ambler针对Dr. Dobbs网站上发布的敏捷成功因素进行了一些分析讨论&#xff0c;那些敏捷成功因素来自2011年11月的敏捷现状调查结果。据此文所说&#xff0c;此次调查的两个目标是&#xff1a; 为了探索与敏捷项目成功有关的实施策略&#xff0c;例如对单一敏捷团队的行…

php 多条数据更新数据类型,PHPdoc @param中的两个或多个数据类型

好的,我有这个phpdoc上面的我的类方法/*** this a function that translates the text* param string|boolean $lang if string the string given in the parameter will be the language code that will represent the language desired, if true, this will translate based …

快速构建Spring Cloud工程

spring cloud简介 spring cloud为开发人员提供了快速构建分布式系统的一些工具&#xff0c;包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单&#xff0c;可以在开发人员的电脑上跑。另外说明spring cloud是基于spr…

win10红色警戒黑屏解决

相信很多80&#xff0c;90后的同学们都喜欢在代码之余打打红色警戒 但是苦于win10差劲兼容性&#xff0c;每次下个红色警戒or尤里复仇不是弹框就是黑屏 今天笔者给出一个完美究极解决方案 请注意&#xff1a; 1&#xff01;红色警戒中把Ra2.exe和Game.exe右键兼容性调到Win XP …

html超链接button

1.如果让本页转向新的页面则用&#xff1a; <input typebutton οnclick"window.location.href(连接)"> 2.如果需要打开一个新的页面进行转向&#xff0c;则用&#xff1a; <input typebutton οnclick"window.open(连接)">转载于:https://www…

低版本jdbc连接高版本oracle,转:oracle11g的JDBC连接 URL和之前的版本有一定的区别...

今天安装了oracle11g后&#xff0c;写了JDBC测试程序&#xff0c;一直都连接不上&#xff01;一直找不到原因后来读了一下安装文件中的Readme.txt文档&#xff0c;汗啊&#xff01;这个版本居然把url的访问方式改变了&#xff1a;Some Useful Hints In Using the JDBC Drivers-…

Android studio 获取每次编译apk时的日期

项目中需要获取apk的编译日期&#xff0c;首先肯定是用手动的方式获取&#xff0c;但这样容易遗忘&#xff0c;怎么样通过代码的方式获取呢&#xff1f; 其实android 为我们提供了一个BuildConfig的类&#xff0c;android 每次编译的时候都会自动生成 一次BuildConfig 类&#…

明文存密码成惯例?Facebook 6 亿用户密码可被 2 万员工直接看

近日&#xff0c;外媒发布了一份互联网安全的调研报告&#xff0c;报告中称Facebook曾将6亿用户的账号密码使用明文存储&#xff0c;且可以被Facebook内部员工随意搜索查看。据Facebook方面的消息人士称&#xff0c;纯文本存档的用户密码可追溯到2012年&#xff0c;在这期间有超…

pthreads 的学习

多线程学习参考的网站&#xff1a; http://www.ibm.com/developerworks/cn/linux/l-pthred/ 初探线程——pthread_create http://www.cnblogs.com/huangwei/archive/2010/05/19/1739593.html 转载于:https://www.cnblogs.com/nemo2011/archive/2012/05/02/2479163.html

Oracle不加IP无法登录,Oracle 无法通过IP连接问题

1.安装目录:D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN2.listener.ora(里面的localhost或127.0.0.1改成机器名)# listener.ora Network Configuration File: D:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora# Generated by Oracle…

巧用gh-pages分支发布自己的静态项目

大家都知道可以通过github pages 发布自己的静态博客&#xff0c;然后通过 username.github.io 可以访问。例如我的博客可以通过 nqmysb.github.io 访问&#xff0c;不过我的已经绑定域名 https://liaocan.top &#xff0c;所以会直接跳转到域名显示。但是我们通常有很多其他的…

【读书笔记】iOS-网络-解析响应负载

Web Service可以通过多种格式返回结构化数据&#xff0c; 不过大多数时候使用的是XML与JSON。也可以让应用只接收HTML结构的数据。实现了这些Web Service或是接收HTML文档的应用必须能解释这种结构化数据并将其转换为对于应用上下文有意义的对象。 一&#xff0c;XML 使用原生解…

What Are Words(一诺千金)

曲名&#xff1a;What Are Words&#xff08;一诺千金&#xff09;Anywhere you are, I am near Anywhere you go, Ill be there Anytime you whisper my name, youll see How every single promise I keep Cause what kind of guy would I be If I was to leave when you need…

oracle 插入 基准测试,oracle proc 插入操作性能优化实践

场景&#xff1a;student 表中 10万条数据。从 student 表中取出所有数据&#xff0c;插入到 student_his 表中优化方法&#xff1a;1.批量插入(效果明显)2.批量查询(效果不明显)3.批量提交(效果不明显)4.预编译 sql 语句(效果不明显)效果&#xff1a;10万条数据&#xff0c;普…

240个jquery插件

240个jquery插件 http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/File upload Ajax File Upload.jQUploader.Multiple File Upload plugin.jQuery File Style.Styling an input type file.Progress Bar Plugin. Form Validation jQuery Valida…

sql 优化 tips

索引就是排序 outer join笛卡儿积, inner join看情况。 可以用临时表加update的方式把outer join 替换成inner join提高性能。用union代替where中的or 和join(不同表时)join的列有索引&#xff0c;select 中的列能被索引覆盖到&#xff0c;消除执行计划中的lookup(lookup有时会…

第24课 《前端之路,以不变应万变》

今天的内容有些借鉴于业内大佬的内容&#xff0c;由于本人技术实在太渣&#xff0c;几乎没有可以用来演讲的素材。抱歉 大家好&#xff0c;我是来自存勖科技的Rocken。我今天演讲的内容是&#xff1a;前端的未来。大家都知道&#xff0c;前端所依托的基础直到上世纪九十年代才出…

php hasattribute,PHP DOMElement hasAttribute()用法及代码示例

DOMElement::hasAttribute()函数是PHP中的内置函数&#xff0c;用于了解具有特定名称的属性是否作为元素的成员存在。用法:bool DOMElement::hasAttribute( string $name )参数&#xff1a;该函数接受单个参数$name&#xff0c;该参数保存属性的名称。返回值&#xff1a;如果成…

搭建turnserver

参考文件&#xff1a; http://blog.csdn.net/kl222/article/details/20145423 为什么要搭建TURN服务器&#xff1f; 因为我们编写的sip客户端再和南瑞的sip服务器进行通信的时候&#xff0c;中间经过一个安全平台&#xff0c;这个安全平台具有NAT和防火墙功能。RTP和RTCP包传递…

【Android开发】:在任意目录执行NDK编译

2019独角兽企业重金招聘Python工程师标准>>> 文以简单的例子讲述如何在任意目录把自己写的C代码使用NDK提供的交叉编译该工具来编译成Android可使用的静态库/动态库。 1. 准备环境 首先&#xff0c;你得安装了Android的NDK编译工具&#xff0c;假设你的NDK的根目录在…

SurfaceView 间取得焦点

在SurfaceView中我们的onKeyDown虽然重写了view的函数&#xff0c; 但一定需要我们在初始化的时候去声明焦点 //添加这个来取得按健事件this.setFocusable(true);this.setFocusableInTouchMode(true);this.requestFocus();如果这些方法&#xff0c;会造成按键无效&#xff0c;提…

Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf

利用Java的多线程技术实现数据库的访问.pdf第 卷第 期 计算机应用22 12 Voi .22 , No . 12年 月2002 12 Computer Appiications Dec . , 2002文章编号&#xff1a; ( )1001 - 9081 2002 12 - 0121 - 03利用Java 的多线程技术实现数据库的访问刘 巍&#xff0c;唐学兵(武汉大学 …

Linux音频设备驱动

在Linux中&#xff0c;先后出现了音频设备的两种框架OSS和ALSA&#xff0c;本节将在介绍数字音频设备及音频设备硬件接口的基础上&#xff0c;展现OSS和ALSA驱动的结构。17.1&#xff5e;17.2节讲解了音频设备及PCM、IIS和AC97硬件接口。17.3节阐述了Linux OSS音频设备驱动的组…

japid-controller自动绑定的数据类型

参考文献&#xff1a;http://www.playframework.org/documentation/1.2.3/controllers 当参数名和HTTP请求中的参数名&#xff08;即界面中的name&#xff09;相同时&#xff0c;后台Controller可以直接获取该变量的值。变量分两大类&#xff1a; 1. Simple types 所有的基本数…

NAT,Easy IP

R3配置 [V200R003C00] #snmp-agent local-engineid 800007DB03000000000000snmp-agent #clock timezone Indian Standard Time minus 05:13:20clock daylight-saving-time Day Light Saving Time repeating 12:32 9-1 12:32 11-23 00:00 2005 2005 #drop illegal-mac alarm #…