基于“五步实现系统主页面”系列文章:
本文实现了一个Spread版数据分析系统主页面的简单原型。
在构建以数据分析为核心的系统中,有很多关键环节需注意。如,在控件套装的选型和评估中,务必要考虑3个关键业务需求环节:
数据录入表单数据逐条录入数据、Excel批量导入数据、在线编辑修改数据
数据分析类似Excel模板公式数据分析、类似Excel图表数据分析
数据导出PDF格式、Excel格式、CSV格式等
基于此,本文选择了 Spread for WinForms 表格产品来构建原型系统:
1、全球销量第一的表格控件,全面的中文化:使得系统更加符合中国的国内市场:开发人员和一线用户
2、类似Excel的强大功能: 全面兼容Excel的操作方式,非常符合数据分析行业从业人员的习惯,系统易用性好
3、可视化设计器:极大的方便了二次开发和业务需求人员进行无损的原型设计--业务人员设计UI后存储为XML,开发人员针对XML二次实现数据读取、呈现、持久化,极大的提高了研发各个环节的沟通效能。
开发环境:
1. Window 7 64位英文系统
2. Visual Studio 2012 SP3 英文版 (C#.net) .NetFramework 4.0 (注: Visual Studio 2010可用源码)
3. Spread for WinForms 全球销量第一的表格控件,类似Excel的强大功能
原型系统采用左侧导航菜单,其中分为5个模块进行呈现业务:
报表设计器
财务报表操作
2D图表呈现
Excel数据导入
信息查询表单
Step 1: 报表设计器
Spread是世界上最强大、最畅销的.NET表格控件,它提供了灵活开放的对象模型和50,000个以上的API,使得用户拥有定制几乎所有元素和接口的能力。开发人员通过将Spread表格控件嵌入到.NET应用程序中,可以实现Microsoft Excel的绝大部分功能。
Spread设计器用来设计并快速创建一个表单原型。通过其直观、易用的界面,在设计阶段对表单的外观进行定制,从而缩短开发时间。 Spread 设计器可为表单创建一个快照。当所有的更改完成后,所有可直接应用于工作表单。
Spread 设计器支持打开已有设计文件并将设计更改保存为文件。
针对开发人员超乎想象的便捷,点击按钮,打开报表设计器,仅仅2行代码:
private void button1_Click(object sender, EventArgs e)
{
FarPoint.Win.Spread.Design.FpSpreadDesigner design = new FarPoint.Win.Spread.Design.FpSpreadDesigner();
design.ShowDialog(this.fpSpread1);
}
Step 2: 财务报表操作
为表??增加一个上下文菜单, 通过ContextMenu属性可创建一个ContextMenu, 通过右键菜单可实现很多实用的功能场景,详情见下截图:
支持自定义丰富的单元格类型。通过用Spread提供的单元格类型或定制自己的类型,确定在一个单元格中可以输入什么样的数据、避免程序员不必要的检查和验证,并为用户提供一种自然的输入数据的方式
货币
日期-时间型
普通型
Mask型
数值型
百分比型
常规表达式型
文本型
开关型
按钮型
复选框型
组合框型
超链接型
图形型
多选项型
进度指示条形
Rich Text型
滑块型
注:为了快速呈现原型系统,这里仅列举出了5种数据类型。
改变数据类型代码示例:
private void SetCellType(string menuText)
{
BaseCellType baseType = null;
switch (menuText)
{
case "单元格类型":
break;
case "数字类型":
{
FarPoint.Win.Spread.CellType.NumberCellType objNumCell = new FarPoint.Win.Spread.CellType.NumberCellType();
objNumCell.DecimalPlaces = 0;
objNumCell.MinimumValue = 1;
objNumCell.MaximumValue = 9999;
objNumCell.ShowSeparator = false;
baseType = objNumCell;
}
break;
case "日期类型":
{
FarPoint.Win.Spread.CellType.DateTimeCellType objDateCell = new FarPoint.Win.Spread.CellType.DateTimeCellType();
objDateCell.DateTimeFormat = FarPoint.Win.Spread.CellType.DateTimeFormat.ShortDate;
baseType = objDateCell;
}
break;
case "文本类型":
{
FarPoint.Win.Spread.CellType.TextCellType objTextCell = new FarPoint.Win.Spread.CellType.TextCellType();
objTextCell.MaxLength = 100;
baseType = objTextCell;
}
break;
case "单选框类型":
{
FarPoint.Win.Spread.CellType.CheckBoxCellType objCheckCell = new FarPoint.Win.Spread.CellType.CheckBoxCellType();
objCheckCell.ThreeState = false;
baseType = objCheckCell;
}
break;
case "货币类型":
{
FarPoint.Win.Spread.CellType.CurrencyCellType objCurrCell = new FarPoint.Win.Spread.CellType.CurrencyCellType();
objCurrCell.LeadingZero = FarPoint.Win.Spread.CellType.LeadingZero.Yes;
objCurrCell.NegativeRed = true;
objCurrCell.FixedPoint = true;
baseType = objCurrCell;
}
break;
default:
break;
}
if (baseType != null)
{
fpSpread1.ActiveSheet.ActiveCell.CellType = baseType;
}
}
Step 3: 2D图表呈现
Spread支持85种丰富多彩的图表效果。可以在Spread设计器中基于工作表的数据直接生成图表,操作简单。同时,软件人员还可以在Visual Studio设计环境中定制图表的所有元素,包括标题、序列、轴、样式、图例等。
图表的生成有2种途径
方法一:通过Spread设计器,类似Excel插入图表功能,非常易上手
方法二:通过代码实现,仅需要2步
1 选择数据区域Range
2 插入指定类型的图表:起始x、y坐标,宽度和高度
图表代码生成代码示例:
FarPoint.Win.Spread.Model.CellRange range = new CellRange(38, 2, 5, 4);
fpSpread1.Sheets[0].AddChart(range, typeof(BarSeries), 600, 300, 0, 0, ChartViewType.View2D, true);
fpSpread1.Sheets[0].AddChart(range, typeof(FarPoint.Win.Chart.XYLineSeries), 600, 300, 0, 350, ChartViewType.View2D, true);
Step 4: Excel数据导入
在数据处理系统中,有相当大的一块是做数据采集的,除了固定格式、海量数据可以通过采集系统程序采集外,其他配置数据、工程数据大多需要人工录入系统,但是手工一条一条录入有2点门槛:
系统数据录入权限:数据系统对数据来源要求安全、质量很高,故录入数据权限不是100%开放所有用户
手工录入数据效率低
故业内默认的行规是:批量数据录入是采用Excel模板,通过系统提供的Excel导入功能实现批量数据录入。
Spread会独立安装Excel文件格式的输入输出引擎,在没有安装Excel的环境中也可以进行Excel文件格式的输入输出,开发时设计的图表、图形、图像等都会作为对象输出到Excel文件中。Spread提供多种版本的Excel和多种文件类型的导入导出服务,包括Excel文件(XLS、XLSX)、档案文件(CSV)和文本文件(TXT)。
导入文件类型:
Spread XML 文件
Excel(.xls)文件
Spread 文件
文本文件
Excel数据导入有2个系统分界线:
1 Excel文件到内存: 复杂度大、数据校验、Excel文件格式不同等等,难度较大。 约占开发工作量的60%
2 内存到业务数据库:一旦到内存中,对开发者来说就如鱼得水了。约占开发工作量的30%~40%
本文所说的Spread实现的数据导入,能够实现Excel文件到内存,也就是Excel数据预览功能,后续实现导入的业务逻辑代码,依据不同行业库表规则,写SQL实现insert即可。
代码就一行:
this.fpSpread1.OpenExcel(ExcelFullPath);
Step 5: 信息查询表单
复杂数据录入界面,通过Spread设计器实现复杂商业文档的录入界面,比如复杂的订单、发票、保单、报税表等。本文模拟量一个查询条件的查找表单,其中用到了本周新介绍的《Spread 7 for WinForms 新增的GcTextBoxCellType (水印、自动换行、自动大写、长度限制等)》单元格类型,非常实用。
表单是通过Spread 设计器设计好:背景、颜色、单元格类型、图片、按钮等等。然后保存为XML格式,在程序中通过两行代码加载实现的:
string fullPath = AppDomain.CurrentDomain.BaseDirectory + "..\\..\\ChartSpread.xml";
this.fpSpread1.Open(fullPath);
为了实现按回车进行查询功能,自定义了一个Action:
public class ClickButtonAction : FarPoint.Win.Spread.Action
{
public DataInputSpread mChartSpread;
public override void PerformAction(object source)
{
if (source is SpreadView)
{
SpreadView spreadView = (SpreadView)source;
mChartSpread.fpSpread1_ButtonClicked(spreadView, null);
}
}
}
this.fpSpread1.ButtonClicked += fpSpread1_ButtonClicked;
InputMap im = fpSpread1.GetInputMap(InputMapMode.WhenFocused);
ActionMap am = fpSpread1.GetActionMap();
im.Put(new Keystroke(Keys.Enter, Keys.None), "ClickButtonAction");
am.Put("ClickButtonAction", new ClickButtonAction() { mChartSpread = this });
public void fpSpread1_ButtonClicked(object sender, EditorNotifyEventArgs e)
{
FarPoint.Win.Spread.SheetView sheet1;
if (sender is FarPoint.Win.Spread.FpSpread)
{
sheet1 = (sender as FarPoint.Win.Spread.FpSpread).Sheets[1];
}
else
{
sheet1 = (sender as FarPoint.Win.Spread.SpreadView).Sheets[1];
}
string name = sheet1.Cells["name"].Text;
string phone = sheet1.Cells["phone"].Text;
string date = sheet1.Cells["date"].Text;
string sex = sheet1.Cells["sex"].Text;
string msg = string.Format("搜索内容 姓名:{0}, 电话:{1}, 日期: {2}, 性别: {3}", name, phone, date, sex);
if (e != null)
{
msg = string.Format("{0}, row:{1}, col:{2}", msg, e.Row, e.Column);
}
MessageBox.Show(msg);
}
代码下载:
SpreadJS | 下载试用
纯前端表格控件SpreadJS,兼容 450 种以上的 Excel 公式,具备“高性能、跨平台、与 Excel 高度兼容”的产品特性,备受华为、苏宁易购、天弘基金等行业龙头企业的青睐,并被中国软件行业协会认定为“中国优秀软件产品”。SpreadJS 可为用户提供类 Excel 的功能,满足表格文档协同编辑、 数据填报、 类 Excel 报表设计等业务场景需求,极大的降低企业研发成本和项目交付风险。
如下资源列表,可以为您评估产品提供帮助: