用C#分析华表插件表格数据
using System.Collections;
using System.Data;
using System.Xml;
/// 华表数据 xml 构造器。
/// </summary>
public class XmlBuilder
{
// 表页。
private SortedList[] m_Sheets;
private string[] m_Names;
}
/// 构造函数,从 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>
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>
/// <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>
/// <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>
/// <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>
/// <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>
/// <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;
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;
}
}
}
}
}
/// 构造 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;
}
用C#分析华表插件表格数据相关推荐
- 前端导出excel(element+xlsx+filesaver插件),表格数据重复问题解决
纯前端导出excel,表格数据渲染重复 业务需求 页面有table表格里的多条数据,并且没有分页.需求希望不调用接口,纯前端生成excel文件实现导出功能. 效果图 1.安装依赖(xlsx 和 fil ...
- python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc
利用Python处理和分析Excel表中数据实战 [利用python进行数据分析--基础篇]利用Python处理和分析Excel表中数据实战 原创 2017年06月28日 15:09:32 标签: p ...
- 32-Figma-谷歌表格插件替换数据方法
32-Figma-谷歌表格插件替换数据方法 主要利用Google Sheets Sync插件 效果 1.准备一个谷歌表格 需要注意格式 2.共享表格 需要知道链接的所有人可以看 3.修改组件的图层的名 ...
- vue2+element使用插件导出全部表格数据
1.下载这俩个插件xlsx 和file-saver npm i xlsx file-saver -S 2.在需要导出表格数据的页面导入 import FileSaver from 'file-save ...
- 人口普查分析:利用python+百度文字识别提取图片中的表格数据
今天发布了最新的人口普查结果,笔者拿到的文件是pdf格式(网上应该有).之前就一直想实现从pdf提取表格数据,输出为excel.正好这次有公开数据,因此打算用来练个手. 尝试了两种方法: 1.pyth ...
- jQuery表格数据导出成Excel插件
下载地址 一款能将网页上的Table表格数据导出成Excel文件的插件,这个导出插件使用jQuery代码实现的,很实用的导出Excel插件. dd:
- Spring Boot+MybatisPlus使用JQuery DataTables表格插件展示数据、实现分页和模糊查询等功能
Spring Boot+MybatisPlus使用JQuery DataTables表格插件展示数据.实现分页和查询功能 一.部分技术选型 二.项目结构 三.功能需求和效果展示 四.关键代码 4.1页 ...
- python提取表里数据_python提取分析表格数据
#/bin/python3.4 # -*- coding: utf-8 -*- import xlrd def open_excel(file="file.xls"): try: ...
- 前端使用插件导出表格数据到Excel
1.安装 vue-json-excel 依赖 npm install vue-json-excel 2.初始化 vue-json-excel import Vue from 'vue' import ...
- wps js宏开发表格数据归类拆分和excel文件合并的xlam加载宏插件
前言 用wps js宏编辑器开发的表格数据拆分与合并的加载宏工具,写好代码把工作簿另存为xlam加载宏文件,然后添加到加载项即可使用.xlam文件你可以理解为没有工作表的工作簿,先看动画演示效果: 主 ...
最新文章
- IOS6.0 应用内直接下载程序 不需跳转AppStore
- Android 事件分发面试题2
- extjs 页面打开时表格自动加载后台传来的json数据
- 华为轮值董事长徐直军:AI发展十大改变
- 58 - 算法 -分治问题 - 循环 二分查找 OpenJudge 百练 4143和为给定数
- linux批量创建和删除用户
- 关于int main(int argc,char* argv[])详解
- android错误 the currently displayed page contains invalid values
- sql plus能登录 plsqldev 登录提示 无法解析指定的连接标识符/PLSQL Developer的安装目录不能带括号/win10安装Oracle PLSQL Developer不能登录
- SQL Server 监视(Monitoring)体系架构
- css+html投票系统,网上在线投票系统的设计与实现.doc
- 俄亥俄大学计算机科学系,俄亥俄大学课程及专业设置
- 便宜SSL证书购买攻略:comodo,geotrust,rapidssl证书为例
- 将电脑输入法关闭只留我们经常用的输入法
- 哇呼IM即时通讯系统——技术解析
- 【linux】利用ssh、sshpass和rsync命令,实现免密同步文件,指定非22端口
- python实现新冠疫情各国人数动态图
- PCBA加工波峰焊空焊原因及对策
- 【Unity Shader编程】之十五 屏幕高斯模糊(Gaussian Blur)后期特效的实现
- uniapp中手持机激光扫描