通过excel可识别的xml结构直接生成xls文件
2008-08-04 14:37
579 查看
上一片文章演示了如何根据简单的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的使用。
相关文章
通过文件结构直接生成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的使用。
相关文章
通过文件结构直接生成xls文件
相关文章推荐
- 通过excel可识别的xml结构直接生成xls文件收藏
- 通过excel可识别的xml结构直接生成xls文件
- 通过excel可识别的xml结构直接生成xls文件
- 直接通过excel可以识别的文件结构生成xls文件的方法,这样就可以不引用麻烦的ole了 (转)
- C# 通过文件结构直接生成xls(Excel)文件
- 通过文件结构直接生成xls文件
- 通过文件结构直接生成xls文件 java
- 通过文件结构直接生成xls文件
- 通过文件结构直接生成xls文件
- 通过文件结构直接生成xls文件
- 通过文件结构直接生成xls文件的VB.Net和Java两个版本
- 通过文件结构直接生成xls文件的VB.Net和Java两个版本
- 通过文件结构直接生成xls文件-Java版
- 导出 Excel 模板内部 XML 结构文件(相对标准,存为XML或XLS)
- 通过文件结构生成xls
- 使用PHPExcel生成excel、xls的格式文件
- Hibernate使用自定义脚本替换注解或者xml文件中的自动生成表结构
- Android学习笔记_31_通过后台代码生成View对象以及动态加载XML布局文件到LinearLayout
- 直接通过ODBC读写Excel表格文件
- Winform合并多个Excel文件到一个文件中(源文件.xls,实际是.xml)