用友华表Cell控件数据 xml 构造器的操作类
using System;
using System.Collections;
using System.Data;
using System.Xml;
/// <summary>
/// 华表数据 xml 构造器。
/// </summary>
public class XmlBuilder
{
// 表页。
private SortedList[] m_Sheets;
private string[] m_Names;
/// <summary>
/// 构造函数,从 xml 构造华表数据。
/// </summary>
/// <param name="xml"> xml 字符串。</param>
public XmlBuilder(string xml)
{
ArrayList sheets=new ArrayList();
ArrayList names=new ArrayList();
try
{
XmlDocument document=new XmlDocument();
document.LoadXml(xml);
foreach(XmlElement sheet in document.DocumentElement.SelectNodes("Worksheet"))
{
SortedList rows=new SortedList();
foreach(XmlElement row in sheet.SelectSingleNode("Table").SelectNodes("Row"))
{
SortedList cells=new SortedList();
foreach(XmlElement cell in row.SelectNodes("Cell"))
{
XmlElement data=cell.FirstChild as XmlElement;
switch(data.GetAttribute("Type").ToLower())
{
case "string":
if (data.InnerText.Trim().Length>0)
cells.Add(int.Parse(cell.GetAttribute("Index")),data.InnerText);
break;
case "number":
cells.Add(int.Parse(cell.GetAttribute("Index")),decimal.Parse(data.InnerText));
break;
}
}
rows.Add(int.Parse(row.GetAttribute("Index")),cells);
}
sheets.Add(rows);
names.Add(sheet.GetAttribute("Name"));
}
m_Sheets=sheets.ToArray(typeof(SortedList)) as SortedList[];
m_Names=names.ToArray(typeof(string)) as string[];
}
catch
{
// 不处理。
}
}
/// <summary>
/// 构造函数,构造空的华表数据(单页)。
/// </summary>
public XmlBuilder():this(1)
{
}
/// <summary>
/// 构造函数,构造空的华表数据(多页)。
/// </summary>
/// <param name="sheets">表页个数。</param>
public XmlBuilder(int sheets)
{
m_Sheets=new SortedList[sheets];
m_Names=new string[sheets];
for(int i=0;i<sheets;i++)
{
m_Sheets[i]=new SortedList();
m_Names[i]=string.Format("第{0}页",i+1);
}
}
/// <summary>
/// 获取单元格数据(单页)。
/// </summary>
/// <param name="x">列号。</param>
/// <param name="y">行号。</param>
/// <returns>数据(string、decimal或null)。</returns>
public object GetCellValue(int x,int y)
{
return GetCellValue(0,x,y);
}
/// <summary>
/// 获取单元格数据(多页)。
/// </summary>
/// <param name="sheet">页号。</param>
/// <param name="x">列号。</param>
/// <param name="y">行号。</param>
/// <returns>数据(string、decimal或null)。</returns>
public object GetCellValue(int sheet,int x,int y)
{
if (sheet>=0 && m_Sheets.Length>sheet && m_Sheets[sheet].Contains(y) && (m_Sheets[sheet][y] as SortedList).Contains(x))
return (m_Sheets[sheet][y] as SortedList)[x];
else
return null;
}
/// <summary>
/// 获取单元格数据(单页)。
/// </summary>
/// <param name="x">列号。</param>
/// <param name="y">行号。</param>
/// <param name="type">类型(Boolean,布尔;Number,数字;String,字符;Time,时间)。</param>
/// <returns>单元格数据(bool、decimal、string、DateTime或null)。</returns>
public object GetCellValue(int x,int y,string type)
{
return GetCellValue(0,x,y,type);
}
/// <summary>
/// 获取单元格数据(多页)。
/// </summary>
/// <param name="sheet">页号。</param>
/// <param name="x">列号。</param>
/// <param name="y">行号。</param>
/// <param name="type">类型(Boolean,布尔;Number,数字;String,字符;Time,时间)。</param>
/// <returns>单元格数据(bool、decimal、string、DateTime或null)。</returns>
public object GetCellValue(int sheet,int x,int y,string type)
{
if (GetCellValue(sheet,x,y) is decimal)
{
try
{
decimal value=(decimal)GetCellValue(sheet,x,y);
switch(type.ToLower())
{
case "boolean":
return value==0?false:true;
case "number":
return value;
case "string":
return value.ToString();
case "time":
return DateTime.FromOADate(Convert.ToDouble(value));
default:
return null;
}
}
catch
{
return null;
}
}
else if (GetCellValue(sheet,x,y) is string)
{
try
{
string value=GetCellValue(sheet,x,y) as string;
switch(type.ToLower())
{
case "boolean":
return bool.Parse(value);
case "number":
return Convert.ToDecimal(value);
case "string":
return value;
case "time":
return DateTime.Parse(value);
default:
return null;
}
}
catch
{
return null;
}
}
else
{
return null;
}
}
/// <summary>
/// 设置单元格数据(单页)。
/// </summary>
/// <param name="x">列号。</param>
/// <param name="y">行号。</param>
/// <param name="value">值(bool、decimal、string、DateTime或null)。</param>
public void SetCellValue(int x,int y,object value)
{
SetCellValue(0,x,y,value);
}
/// <summary>
/// 设置单元格数据(多页)。
/// </summary>
/// <param name="sheet">页号。</param>
/// <param name="x">列号。</param>
/// <param name="y">行号。</param>
/// <param name="value">值(bool、decimal、string、DateTime或null)。</param>
public void SetCellValue(int sheet,int x,int y,object value)
{
if (sheet>=0 && m_Sheets.Length>sheet)
{
SortedList row=m_Sheets[sheet][y] as SortedList;
if (row==null)
{
row=new SortedList();
m_Sheets[sheet][y]=row;
}
if (value==null)
{
row[x]=null;
}
else if (value is bool)
{
row[x]=Convert.ToDecimal((bool)value);
}
else if (value is decimal)
{
row[x]=(decimal)value;
}
else if (value is string)
{
row[x]=value as string;
}
else if (value is DateTime)
{
row[x]=Convert.ToDecimal(((DateTime)value).ToOADate());
}
}
}
/// <summary>
/// 获取行数(单页)。
/// </summary>
/// <returns>行数。</returns>
public int GetRowCount()
{
return GetRowCount(0);
}
/// <summary>
/// 获取行数(多页)。
/// </summary>
/// <param name="sheet">页号。</param>
/// <returns>行数。</returns>
public int GetRowCount(int sheet)
{
int count=0;
if (sheet>=0 && m_Sheets.Length>sheet)
{
foreach(int index in m_Sheets[sheet].Keys)
{
count=Math.Max(count,index);
}
}
return count;
}
/// <summary>
/// 获取表页名称。
/// </summary>
/// <param name="sheet">页号。</param>
/// <returns>表页名称。</returns>
public string GetSheetName(int sheet)
{
if (sheet>=0 && m_Sheets.Length>sheet)
return m_Names[sheet];
else
return null;
}
/// <summary>
/// 设置表页名称。
/// </summary>
/// <param name="sheet">页号。</param>
/// <param name="name">名称。</param>
public void SetSheetName(int sheet,string name)
{
if (sheet>=0 && m_Sheets.Length>sheet)
{
// 华表帮助曰:设置表页页签的时候,一定要注意表页页签的命名规则。
// 规则1,页签名称字符串中不能含有“: ///*![]?”字符;
// 规则2,页签名称字符串的第一个字母不能是数字;
// 规则3,页签名称不能重名。
if (name==null || name.Trim().Length==0)
name="未知表";
else
name=name.Trim();
name=name.Replace(":",":").Replace("/","/").Replace("//","\").Replace("*","*");
name=name.Replace("!","!").Replace("[","(").Replace("]",")").Replace("?","?");
if (name[0]>='0' || name[0]<='9')
name="表"+name;
ArrayList names=new ArrayList(m_Names);
if (names.Contains(name)==false)
{
m_Names[sheet]=name;
}
else
{
for(int i=1;;i++)
{
if (names.Contains(string.Format("{0}{1}",name,i))==false)
{
m_Names[sheet]=string.Format("{0}{1}",name,i);
break;
}
}
}
}
}
/// <summary>
/// 构造 xml 华表数据。
/// </summary>
/// <returns>xml 字符串。</returns>
public string BuilderXml()
{
// Xml 文档
XmlDocument document=new XmlDocument();
// 根 Workbook
XmlElement book=document.CreateElement("Workbook");
// Workbook 的子节点 DocumentProperties
XmlElement property=document.CreateElement("DocumentProperties");
// DocumentProperties 的子节点 Created
XmlElement created=document.CreateElement("Created");
created.InnerText=DateTime.Now.ToString();
property.AppendChild(created);
// DocumentProperties 的子节点 Version
XmlElement version=document.CreateElement("Version");
version.InnerText="03.1015";
property.AppendChild(version);
book.AppendChild(property);
for(int i=0;i<m_Sheets.Length;i++)
{
// Workbook 的子节点 Worksheet
XmlElement sheet=document.CreateElement("Worksheet");
sheet.SetAttribute("Name",m_Names[i]);
// Worksheet 的子节点 Table
XmlElement table=document.CreateElement("Table");
// Table 的子节点 Row
foreach(DictionaryEntry row_entry in m_Sheets[i])
{
XmlElement row=document.CreateElement("Row");
row.SetAttribute("Index",((int)row_entry.Key).ToString());
// Row 的子节点 Cell
foreach(DictionaryEntry cell_entry in (row_entry.Value as SortedList))
{
XmlElement cell=document.CreateElement("Cell");
cell.SetAttribute("Index",((int)cell_entry.Key).ToString());
// Cell 的子节点 Data
XmlElement data=document.CreateElement("Data");
if (cell_entry.Value is string)
{
data.SetAttribute("Type","String");
data.InnerText=cell_entry.Value as string;
}
else if (cell_entry.Value is decimal)
{
data.SetAttribute("Type","Number");
data.InnerText=((decimal)cell_entry.Value).ToString();
}
else
{
continue;
}
cell.AppendChild(data);
row.AppendChild(cell);
}
if (row.ChildNodes.Count>0)
table.AppendChild(row);
}
sheet.AppendChild(table);
book.AppendChild(sheet);
}
document.AppendChild(book);
return document.InnerXml;
}
}
用友华表Cell控件数据 xml 构造器的操作类相关推荐
- 关于使用用友华表Cell控件按需打印行的方法
分享下只需一个cll文件按需打印行的觉得最好的方式: 1.cell文件要打印行的地方最好不要全删了,留一行,设置好单元格样式(字体.对齐方式.折行自适应等),后面会省一些代码: 2.使用CopyRan ...
- 关于用友的CELL控件
最近做到一个项目,客户点名要用华表控件做报表,由于以前没有接触过,所以一开始就遇到了很多困难. 我使用VS2005做开发的,而且是个B/S版本的.在使用华表控件时,就出现问题了.在DoOpenFile ...
- 用友华表Cell一些用法小结(cs.net版本)
//从Color类型得到RGB类型,也可以用ColorTranslator.ToOle()方法 public int GetRGBFromColor(Color color) { byte r = c ...
- 使用c#+(datagrid控件)编辑xml文件
作者Blog:http://blog.csdn.net/ouyang76cn/ 使用c#+(datagrid控件)编辑xml文件 这个源码是我根据网上一个vb.net编辑xml文件的原理用c#重写的. ...
- 利用Aspose.Word控件和Aspose.Cell控件,实现Word文档和Excel文档的模板化导出
我们知道,一般都导出的Word文档或者Excel文档,基本上分为两类,一类是动态生成全部文档的内容方式,一种是基于固定模板化的内容输出,后者在很多场合用的比较多,这也是企业报表规范化的一个体现. 我的 ...
- 使用Aspose.Cell控件实现Excel高难度报表的生成(三)
在之前几篇文章中,介绍了关于Apsose.cell这个强大的Excel操作控件的使用,相关文章如下: 使用Aspose.Cell控件实现Excel高难度报表的生成(一) 使用Aspose.Cell控件 ...
- owc报表控件 数据透视表_将数据透视图标题链接到报表过滤器
owc报表控件 数据透视表 Recently, I enrolled in an online Infographics and data visualization course, and the ...
- 用友华表cell的程序发布
用友华表cell的程序发布 读取cll文件并写入时,存在权限问题.请将cll文件的权限增加写入权限. posted on 2017-03-16 15:59 阿日斯兰 阅读(...) 评论(...) 编 ...
- 写了一段VBA代码后, Excel每次保存时都弹出警告:”此文档中包含宏、Activex控件、XML扩展包信息“(office 2007)
前言:今天在写一段VBA代码之后,遇到一个问题, Excel每次保存时就报一个警告(使用的是office 2007): 此文档中包含宏.Activex控件.XML扩展包信息 用起来很不爽! ----- ...
最新文章
- MATLAB之简谐信号声音的生成及其调制性
- openssl创建CA、申请证书及其给web服务颁发证书
- 七十三、Python | Leetcode数字系列(上篇)
- Bash Shell学习笔记一
- python3中的正则模块
- Excel VBA 怎样为 inputBox 输入框设置星号掩码-密码屏蔽输入框
- Asp.Net ListView 控件的使用
- qtablewidget固定一列滚动_简单易懂,最全滚动轴承基本知识汇总
- java astar_JAVA-Astar算法实现
- 【Web技术】(实验一)HTML静态网页设计
- 平衡二叉树的调整整理
- 如何修复word文档损坏的?
- 百度地图点击城市的出现下钻
- 【2019保研经验】清华贵系、清华软院、北大叉院、中科院自动化所等
- 华为“扫地僧”纯手打《趣谈—网络协议.pdf》,看完只剩一个字:香
- DB2数据库配置db cfg
- Linux: Top命令查询结果参数详解
- Mysql复制表两种方式(复制表结构、复制表结构和数据、复制表中的部分数据、复制表中的部分数据并起别名)
- Spring——DAO层、Spring JDBC、Spring事务控制
- Oracle Database 12c Security - 1. Security for Today’s World
热门文章
- 新型Magecart信用卡读取器能够在多个电子商务平台上窃取付款信息
- 冷热冲击试验-高低温冲击试验国标GB/T2423
- Vue.js:el-input自动获取焦点通过自定义指令实现v-focus
- 程序员究竟是该成为“通才”还是“专才”
- Mac下的几个免费杀毒软件
- oracle数据库imp用法,imp导入数据库的用法
- 按键精灵初步,使用winIO实现驱动级模拟按键
- PostgreSQL实现递归查询
- WPhone7 随笔 (二) -- Grid的刷新
- Linux之FTP文件自动上传