上一片文章演示了如何根据简单的excel文件结构直接生成xls文件,如果涉及到合并,公式之类的复杂操作,可以使用xml结构来直接构造xls文件,比如生成如下所示文件
上图中D列和E列为公式,第4行为公式合计,7、8行为合并过的单元格。完整代码如下:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Xml;
- namespace ConsoleApplication17
- {
- class Program
- {
- static void Main( string [] args)
- {
- ExcelWriter excel = new ExcelWriter();
- excel.CreateSheet( "XmlData" ); //sheetName
- //增加一列,默认可以不加
- excel.CreateColumn(5, 100);
- //新增表头行
- excel.CreateRow();
- excel.CreateCellString( "Name" );
- excel.CreateCellString( "Score1" );
- excel.CreateCellString( "Score1" );
- excel.CreateCellString( "Score0" );
- excel.CreateCellString( "说明" );
- //新增两行数据
- excel.CreateRow();
- excel.CreateCellString( "jinjazz" );
- excel.CreateCellNumber(100);
- excel.CreateCellNumber(98);
- excel.CreateCell(0, "Number" , "RC[-2]+RC[-1]" ,1,1); //公式,-2和-1代表当前cell的水平偏移量
- excel.CreateCell(0, "String" , "RC[-4]&/":/"&RC[-1]" , 1, 1); //公式
- excel.CreateRow();
- excel.CreateCellString( "游客" );
- excel.CreateCellNumber(33);
- excel.CreateCellNumber(14);
- excel.CreateCell(0, "Number" , "RC[-2]+RC[-1]" , 1, 1);
- excel.CreateCell(0, "String" , "RC[-4]&/":/"&RC[-1]" , 1, 1);
- //新增汇总行
- excel.CreateRow();
- excel.CreateCellString( "总计" );
- excel.CreateCell(0, "Number" , "SUM(R[-2]C:R[-1]C)" , 1, 1); //公式,-2和-1代表cell的垂直偏移量
- excel.CreateCell(0, "Number" , "SUM(R[-2]C:R[-1]C)" , 1, 1);
- excel.CreateCell(0, "Number" , "SUM(R[-2]C:R[-1]C)" , 1, 1);
- //增加三个空行
- excel.CreateRow();
- excel.CreateRow();
- excel.CreateRow();
- //增加一个合并过的单元格
- excel.CreateCell( "http://blog.csdn.net/jinjazz" , "String" , null ,2,5);
- excel.Save(@ "c:/testData.xls" );
- }
- }
- public class ExcelWriter
- {
- string ssns = "urn:schemas-microsoft-com:office:spreadsheet" ;
- string xmlns = "urn:schemas-microsoft-com:office:spreadsheet" ;
- XmlDocument _doc = new XmlDocument();
- XmlNode _currentSheet = null ;
- XmlNode _currentRow = null ;
- public ExcelWriter()
- {
- //excel的xml模版,你需要了解xml的Attributes怎么用
- StringBuilder sbody = new StringBuilder();
- sbody.Append( "<?xml version=/"1.0/"?>/n" );
- sbody.Append( "<?mso-application progid=/"Excel.Sheet/"?>/n" );
- sbody.Append( "<Workbook xmlns=/"urn:schemas-microsoft-com:office:spreadsheet/"/n" );
- sbody.Append( "xmlns:o=/"urn:schemas-microsoft-com:office:office/"/n" );
- sbody.Append( "xmlns:x=/"urn:schemas-microsoft-com:office:excel/"/n" );
- sbody.Append( "xmlns:ss=/"urn:schemas-microsoft-com:office:spreadsheet/"/n" );
- sbody.Append( "xmlns:html=/"http://www.w3.org/TR/REC-html40/">/n" );
- sbody.Append( "<Styles>/n" );
- sbody.Append( "<Style ss:ID=/"Default/" ss:Name=/"Normal/">/n" );
- sbody.Append( "<Alignment ss:Vertical=/"Center/"/>/n" );
- sbody.Append( "<Borders/>/n" );
- sbody.Append( "<Font ss:FontName=/"宋体/" x:CharSet=/"134/" ss:Size=/"10/"/>/n" );
- sbody.Append( "<Interior/>/n" );
- sbody.Append( "<NumberFormat/>/n" );
- sbody.Append( "<Protection/>/n" );
- sbody.Append( "</Style>/n" );
- sbody.Append( "</Styles>/n" );
- sbody.Append( "</Workbook>/n" );
- _doc.LoadXml(sbody.ToString());
- }
- /// <summary>
- /// 增加一个工作表
- /// </summary>
- /// <param name="sheetName">工作表名称</param>
- public void CreateSheet( string sheetName)
- {
- System.Xml.XmlNode node = _doc.CreateNode(XmlNodeType.Element, "Worksheet" , ssns);
- System.Xml.XmlAttribute xa = _doc.CreateAttribute( "ss" , "Name" , xmlns);
- xa.Value = sheetName;
- node.Attributes.Append(xa);
- _doc.ChildNodes[2].AppendChild(node);
- node.AppendChild(_doc.CreateNode(XmlNodeType.Element, "Table" , xmlns));
- _currentSheet = node;
- }
- /// <summary>
- /// 增加一行
- /// </summary>
- public void CreateRow()
- {
- System.Xml.XmlNode node = _doc.CreateNode(XmlNodeType.Element, "Row" , xmlns);
- _currentSheet.ChildNodes[0].AppendChild(node);
- _currentRow = node;
- }
- /// <summary>
- /// 增加一列
- /// </summary>
- /// <param name="index">索引</param>
- /// <param name="width">宽度</param>
- public void CreateColumn( int index, float width)
- {
- System.Xml.XmlNode node = _doc.CreateNode(XmlNodeType.Element, "Column" , xmlns);
- System.Xml.XmlAttribute xa = _doc.CreateAttribute( "ss" , "Index" , xmlns);
- xa.Value = index.ToString();
- node.Attributes.Append(xa);
- xa = _doc.CreateAttribute( "ss" , "Width" , xmlns);
- xa.Value = width.ToString();
- node.Attributes.Append(xa);
- _currentSheet.ChildNodes[0].AppendChild(node);
- }
- /// <summary>
- /// 增加一个单元格
- /// </summary>
- /// <param name="value">值</param>
- /// <param name="Type">类型</param>
- /// <param name="Expression">公式</param>
- /// <param name="rowSpan">跨行</param>
- /// <param name="colSpan">跨列</param>
- public void CreateCell( object value, string Type, string Expression, int rowSpan, int colSpan)
- {
- System.Xml.XmlAttribute xa = null ;
- System.Xml.XmlNode nodeCell = _doc.CreateNode(XmlNodeType.Element, "Cell" , xmlns);
- _currentRow.AppendChild(nodeCell);
- if (! string .IsNullOrEmpty(Expression))
- {
- xa = _doc.CreateAttribute( "ss" , "Formula" , xmlns);
- xa.Value = "=" + Expression;
- nodeCell.Attributes.Append(xa);
- }
- if (--colSpan > 0)
- {
- xa = _doc.CreateAttribute( "ss" , "MergeAcross" , xmlns);
- xa.Value = colSpan.ToString();
- nodeCell.Attributes.Append(xa);
- }
- if (--rowSpan > 0)
- {
- xa = _doc.CreateAttribute( "ss" , "MergeDown" , xmlns);
- xa.Value = rowSpan.ToString();
- nodeCell.Attributes.Append(xa);
- }
- System.Xml.XmlNode nodeData = _doc.CreateNode(XmlNodeType.Element, "Data" , xmlns);
- xa = _doc.CreateAttribute( "ss" , "Type" , xmlns);
- xa.Value = Type;
- nodeData.Attributes.Append(xa);
- nodeData.InnerText = value.ToString();
- nodeCell.AppendChild(nodeData);
- }
- /// <summary>
- /// 增加一个数字单元格
- /// </summary>
- /// <param name="value"></param>
- public void CreateCellNumber( double value)
- {
- CreateCell(value, "Number" , null , 1, 1);
- }
- /// <summary>
- /// 增加一个字符串单元格
- /// </summary>
- /// <param name="value"></param>
- public void CreateCellString( string value)
- {
- CreateCell(value, "String" , null , 1, 1);
- }
- /// <summary>
- /// 保存
- /// </summary>
- /// <param name="strFile"></param>
- public void Save( string strFile)
- {
- _doc.Save(strFile);
- }
- }
- }
上面代码基本都是对xml文件的操作,需要你对xml的dom对象比较熟悉,尤其是Attributes的使用。
相关文章