通过excel可识别的xml结构直接生成xls文件

上一片文章演示了如何根据简单的excel文件结构直接生成xls文件,如果涉及到合并,公式之类的复杂操作,可以使用xml结构来直接构造xls文件,比如生成如下所示文件

上图中D列和E列为公式,第4行为公式合计,7、8行为合并过的单元格。完整代码如下:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Xml;
  5. namespace ConsoleApplication17
  6. {
  7. class Program
  8. {
  9. static void Main( string []args)
  10. {
  11. ExcelWriterexcel= new ExcelWriter();
  12. excel.CreateSheet( "XmlData" ); //sheetName
  13. //增加一列,默认可以不加
  14. excel.CreateColumn(5,100);
  15. //新增表头行
  16. excel.CreateRow();
  17. excel.CreateCellString( "Name" );
  18. excel.CreateCellString( "Score1" );
  19. excel.CreateCellString( "Score1" );
  20. excel.CreateCellString( "Score0" );
  21. excel.CreateCellString( "说明" );
  22. //新增两行数据
  23. excel.CreateRow();
  24. excel.CreateCellString( "jinjazz" );
  25. excel.CreateCellNumber(100);
  26. excel.CreateCellNumber(98);
  27. excel.CreateCell(0, "Number" , "RC[-2]+RC[-1]" ,1,1); //公式,-2和-1代表当前cell的水平偏移量
  28. excel.CreateCell(0, "String" , "RC[-4]&\":\"&RC[-1]" ,1,1); //公式
  29. excel.CreateRow();
  30. excel.CreateCellString( "游客" );
  31. excel.CreateCellNumber(33);
  32. excel.CreateCellNumber(14);
  33. excel.CreateCell(0, "Number" , "RC[-2]+RC[-1]" ,1,1);
  34. excel.CreateCell(0, "String" , "RC[-4]&\":\"&RC[-1]" ,1,1);
  35. //新增汇总行
  36. excel.CreateRow();
  37. excel.CreateCellString( "总计" );
  38. excel.CreateCell(0, "Number" , "SUM(R[-2]C:R[-1]C)" ,1,1); //公式,-2和-1代表cell的垂直偏移量
  39. excel.CreateCell(0, "Number" , "SUM(R[-2]C:R[-1]C)" ,1,1);
  40. excel.CreateCell(0, "Number" , "SUM(R[-2]C:R[-1]C)" ,1,1);
  41. //增加三个空行
  42. excel.CreateRow();
  43. excel.CreateRow();
  44. excel.CreateRow();
  45. //增加一个合并过的单元格
  46. excel.CreateCell( "http://blog.csdn.net/jinjazz" , "String" , null ,2,5);
  47. excel.Save(@ "c:\testData.xls" );
  48. }
  49. }
  50. public class ExcelWriter
  51. {
  52. string ssns= "urn:schemas-microsoft-com:office:spreadsheet" ;
  53. string xmlns= "urn:schemas-microsoft-com:office:spreadsheet" ;
  54. XmlDocument_doc= new XmlDocument();
  55. XmlNode_currentSheet= null ;
  56. XmlNode_currentRow= null ;
  57. public ExcelWriter()
  58. {
  59. //excel的xml模版,你需要了解xml的Attributes怎么用
  60. StringBuildersbody= new StringBuilder();
  61. sbody.Append( "<?xmlversion=\"1.0\"?>\n" );
  62. sbody.Append( "<?mso-applicationprogid=\"Excel.Sheet\"?>\n" );
  63. sbody.Append( "<Workbookxmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"\n" );
  64. sbody.Append( "xmlns:o=\"urn:schemas-microsoft-com:office:office\"\n" );
  65. sbody.Append( "xmlns:x=\"urn:schemas-microsoft-com:office:excel\"\n" );
  66. sbody.Append( "xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"\n" );
  67. sbody.Append( "xmlns:html=\"http://www.w3.org/TR/REC-html40\">\n" );
  68. sbody.Append( "<Styles>\n" );
  69. sbody.Append( "<Styless:ID=\"Default\"ss:Name=\"Normal\">\n" );
  70. sbody.Append( "<Alignmentss:Vertical=\"Center\"/>\n" );
  71. sbody.Append( "<Borders/>\n" );
  72. sbody.Append( "<Fontss:FontName=\"宋体\"x:CharSet=\"134\"ss:Size=\"10\"/>\n" );
  73. sbody.Append( "<Interior/>\n" );
  74. sbody.Append( "<NumberFormat/>\n" );
  75. sbody.Append( "<Protection/>\n" );
  76. sbody.Append( "</Style>\n" );
  77. sbody.Append( "</Styles>\n" );
  78. sbody.Append( "</Workbook>\n" );
  79. _doc.LoadXml(sbody.ToString());
  80. }
  81. ///<summary>
  82. ///增加一个工作表
  83. ///</summary>
  84. ///<paramname="sheetName">工作表名称</param>
  85. public void CreateSheet( string sheetName)
  86. {
  87. System.Xml.XmlNodenode=_doc.CreateNode(XmlNodeType.Element, "Worksheet" ,ssns);
  88. System.Xml.XmlAttributexa=_doc.CreateAttribute( "ss" , "Name" ,xmlns);
  89. xa.Value=sheetName;
  90. node.Attributes.Append(xa);
  91. _doc.ChildNodes[2].AppendChild(node);
  92. node.AppendChild(_doc.CreateNode(XmlNodeType.Element, "Table" ,xmlns));
  93. _currentSheet=node;
  94. }
  95. ///<summary>
  96. ///增加一行
  97. ///</summary>
  98. public void CreateRow()
  99. {
  100. System.Xml.XmlNodenode=_doc.CreateNode(XmlNodeType.Element, "Row" ,xmlns);
  101. _currentSheet.ChildNodes[0].AppendChild(node);
  102. _currentRow=node;
  103. }
  104. ///<summary>
  105. ///增加一列
  106. ///</summary>
  107. ///<paramname="index">索引</param>
  108. ///<paramname="width">宽度</param>
  109. public void CreateColumn( int index, float width)
  110. {
  111. System.Xml.XmlNodenode=_doc.CreateNode(XmlNodeType.Element, "Column" ,xmlns);
  112. System.Xml.XmlAttributexa=_doc.CreateAttribute( "ss" , "Index" ,xmlns);
  113. xa.Value=index.ToString();
  114. node.Attributes.Append(xa);
  115. xa=_doc.CreateAttribute( "ss" , "Width" ,xmlns);
  116. xa.Value=width.ToString();
  117. node.Attributes.Append(xa);
  118. _currentSheet.ChildNodes[0].AppendChild(node);
  119. }
  120. ///<summary>
  121. ///增加一个单元格
  122. ///</summary>
  123. ///<paramname="value">值</param>
  124. ///<paramname="Type">类型</param>
  125. ///<paramname="Expression">公式</param>
  126. ///<paramname="rowSpan">跨行</param>
  127. ///<paramname="colSpan">跨列</param>
  128. public void CreateCell( object value, string Type, string Expression, int rowSpan, int colSpan)
  129. {
  130. System.Xml.XmlAttributexa= null ;
  131. System.Xml.XmlNodenodeCell=_doc.CreateNode(XmlNodeType.Element, "Cell" ,xmlns);
  132. _currentRow.AppendChild(nodeCell);
  133. if (! string .IsNullOrEmpty(Expression))
  134. {
  135. xa=_doc.CreateAttribute( "ss" , "Formula" ,xmlns);
  136. xa.Value= "=" +Expression;
  137. nodeCell.Attributes.Append(xa);
  138. }
  139. if (--colSpan>0)
  140. {
  141. xa=_doc.CreateAttribute( "ss" , "MergeAcross" ,xmlns);
  142. xa.Value=colSpan.ToString();
  143. nodeCell.Attributes.Append(xa);
  144. }
  145. if (--rowSpan>0)
  146. {
  147. xa=_doc.CreateAttribute( "ss" , "MergeDown" ,xmlns);
  148. xa.Value=rowSpan.ToString();
  149. nodeCell.Attributes.Append(xa);
  150. }
  151. System.Xml.XmlNodenodeData=_doc.CreateNode(XmlNodeType.Element, "Data" ,xmlns);
  152. xa=_doc.CreateAttribute( "ss" , "Type" ,xmlns);
  153. xa.Value=Type;
  154. nodeData.Attributes.Append(xa);
  155. nodeData.InnerText=value.ToString();
  156. nodeCell.AppendChild(nodeData);
  157. }
  158. ///<summary>
  159. ///增加一个数字单元格
  160. ///</summary>
  161. ///<paramname="value"></param>
  162. public void CreateCellNumber( double value)
  163. {
  164. CreateCell(value, "Number" , null ,1,1);
  165. }
  166. ///<summary>
  167. ///增加一个字符串单元格
  168. ///</summary>
  169. ///<paramname="value"></param>
  170. public void CreateCellString( string value)
  171. {
  172. CreateCell(value, "String" , null ,1,1);
  173. }
  174. ///<summary>
  175. ///保存
  176. ///</summary>
  177. ///<paramname="strFile"></param>
  178. public void Save( string strFile)
  179. {
  180. _doc.Save(strFile);
  181. }
  182. }
  183. }

上面代码基本都是对xml文件的操作,需要你对xml的dom对象比较熟悉,尤其是Attributes的使用。

相关文章

通过文件结构直接生成xls文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值