[攒分贴]通过excel可识别的xml结构直接生成xls文件

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


演示代码如下,调用相当简单。
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的使用。
通过增加xml的style相关节点可以设置单元格样式,这个留给大家来做吧。

...全文
1566 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
xymclone 2009-05-08
  • 打赏
  • 举报
回复
蛮好
qingzhouli 2009-05-07
  • 打赏
  • 举报
回复
请问使用xml结构来直接构造xls文件,支持Excel图表吗?
火星 2008-10-29
  • 打赏
  • 举报
回复
谢谢楼主分享

谢谢

拿来研究研究
taijixiaozi2006 2008-08-21
  • 打赏
  • 举报
回复
我顶贴了,学习一下
lake_cx 2008-08-20
  • 打赏
  • 举报
回复
既然是在.NET下弄,为什么不用Office2003XMLSchema生成代码然后再封装呢?这样更可以保证XML的正确性吧
hainandao 2008-08-19
  • 打赏
  • 举报
回复
huoyanhuo 2008-08-19
  • 打赏
  • 举报
回复
谢谢,学习这个方法了
huangjiant 2008-08-09
  • 打赏
  • 举报
回复
虚心学习~~~
qxshcg 2008-08-08
  • 打赏
  • 举报
回复
厉害!
CloneCenter 2008-08-07
  • 打赏
  • 举报
回复
多谢剪刀分享,这个东西用起来真不错。
aaaa9813 2008-08-06
  • 打赏
  • 举报
回复
做个记号
zhengrong822 2008-08-06
  • 打赏
  • 举报
回复
牛B啊
tian8908 2008-08-06
  • 打赏
  • 举报
回复
web报表开发新思路

SOAExcel在服务器端编程把数据导入到客户端的Excel中,并在浏览器中显示Excel。

SOAExcel是一种Web富客户端设计制作平台,把强大的微软EXCEL直接作为WEB录入、呈现工具。
SOAExcel是在web浏览器中显示和控制Excel的,但是编程者只需在服务器端编程调用SOAExcel即可驱动

Excel,完全符合Jsp和Asp.net倡导的we

b服务器端编程架构。
SOAExcel支持Windows技术平台,Java技术平台,两大技术阵营均可无缝自由驱动微软EXCEL。

微软EXCEL是社会公认的最好的本地计算机(单机)电子表格编辑工具软件,中国式复杂报表再复杂,

Excel都是可以制作的。但是在web网页里

却无法利用它的强大功能。使用SOAExcel只需要很少的编程工作即可实现在web网页里充分利用强大的

EXCEL制作报表,通过SOAExcel不仅能够

完美显示中国式复杂报表,并且还能够录入中国式复杂表单数据。

大量节约软件开发的工作量,提高生产效率。
SOAExcel节省工作量的原理:
1. 使用EXCEL格式、公式、透视等简单设置即可取代大部分复杂逻辑计算和数据有效性检测的编程工作量

。例如复杂的求和计算,求平均计算

,自动生成人民币的大写,在录入表单里可以使用Excel设置用户录入错误数据时的错误提示对话框,以

及设置使用下拉框录入数据等等,这些

都无需编程,只需在Excel中设置一下即可实现,这样就利用了微软Excel本身的强大功能辅助实现以往

web客户端难以实现的功能。
2.

微软Excel的界面表现能力很强,例如多彩的表格界面,复杂的统计图表等等,这些是html很难表现或者

几乎不能实现的功能,通过SOAExcel可

以完全借用Excel的表现能力,用户界面几乎完全等同于用户所熟悉的Excel界面的,显著降低软件开发中

客户端界面设计开发的工作量。
3. Excel 的开发帮助与资料是非常多的,我们可以利用大量现有的Excel解决方案。

SOAExcel和服务器端自动化EXCEL、仿EXCEL类产品的区别及优势:
即可作为web数据录入窗口,又可以自由灵活的在web页面上同时显示数据报表+统计图表;由于微软Excel

公认的强大功能,利用SOAExcel实现

的界面效果是服务器端自动化EXCEL方案以及其他仿EXCEL类产品无法比拟的。

演示连接:http://www.kehansoft.com/soaexcel/login.asp
田小姐

北京科翰软件有限公司
手机:15810217283 01086815053
办公:010-58696133-103
传真:010-58693320
Q Q :453789292
MSN :khsoft001@126.com
E-mail: zwtwj1982@126.com tianwenjuan@khsoft.com

地址:北京市朝阳区建国路88号现现代城5号楼7层
邮编:100022
tian8908 2008-08-06
  • 打赏
  • 举报
回复
web报表开发新思路

SOAExcel在服务器端编程把数据导入到客户端的Excel中,并在浏览器中显示Excel。

SOAExcel是一种Web富客户端设计制作平台,把强大的微软EXCEL直接作为WEB录入、呈现工具。
SOAExcel是在web浏览器中显示和控制Excel的,但是编程者只需在服务器端编程调用SOAExcel即可驱动

Excel,完全符合Jsp和Asp.net倡导的we

b服务器端编程架构。
SOAExcel支持Windows技术平台,Java技术平台,两大技术阵营均可无缝自由驱动微软EXCEL。

微软EXCEL是社会公认的最好的本地计算机(单机)电子表格编辑工具软件,中国式复杂报表再复杂,

Excel都是可以制作的。但是在web网页里

却无法利用它的强大功能。使用SOAExcel只需要很少的编程工作即可实现在web网页里充分利用强大的

EXCEL制作报表,通过SOAExcel不仅能够

完美显示中国式复杂报表,并且还能够录入中国式复杂表单数据。

大量节约软件开发的工作量,提高生产效率。
SOAExcel节省工作量的原理:
1. 使用EXCEL格式、公式、透视等简单设置即可取代大部分复杂逻辑计算和数据有效性检测的编程工作量

。例如复杂的求和计算,求平均计算

,自动生成人民币的大写,在录入表单里可以使用Excel设置用户录入错误数据时的错误提示对话框,以

及设置使用下拉框录入数据等等,这些

都无需编程,只需在Excel中设置一下即可实现,这样就利用了微软Excel本身的强大功能辅助实现以往

web客户端难以实现的功能。
2.

微软Excel的界面表现能力很强,例如多彩的表格界面,复杂的统计图表等等,这些是html很难表现或者

几乎不能实现的功能,通过SOAExcel可

以完全借用Excel的表现能力,用户界面几乎完全等同于用户所熟悉的Excel界面的,显著降低软件开发中

客户端界面设计开发的工作量。
3. Excel 的开发帮助与资料是非常多的,我们可以利用大量现有的Excel解决方案。

SOAExcel和服务器端自动化EXCEL、仿EXCEL类产品的区别及优势:
即可作为web数据录入窗口,又可以自由灵活的在web页面上同时显示数据报表+统计图表;由于微软Excel

公认的强大功能,利用SOAExcel实现

的界面效果是服务器端自动化EXCEL方案以及其他仿EXCEL类产品无法比拟的。

演示连接:http://www.kehansoft.com/soaexcel/login.asp
田小姐

北京科翰软件有限公司
手机:15810217283 01086815053
办公:010-58696133-103
传真:010-58693320
Q Q :453789292
MSN :khsoft001@126.com
E-mail: zwtwj1982@126.com tianwenjuan@khsoft.com

地址:北京市朝阳区建国路88号现现代城5号楼7层
邮编:100022
smartstar2005 2008-08-05
  • 打赏
  • 举报
回复
Mark
net205 2008-08-05
  • 打赏
  • 举报
回复

我关心的是在哪儿看的资料,哪儿有资料学习???
dt168 2008-08-05
  • 打赏
  • 举报
回复
up,学习
shilei41193 2008-08-05
  • 打赏
  • 举报
回复
超级收藏一下!
Code従業員 2008-08-05
  • 打赏
  • 举报
回复
收藏先!
JavaPeak 2008-08-05
  • 打赏
  • 举报
回复
有时间看
加载更多回复(25)

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧