当前位置:编程学习 > C#/ASP.NET >>

讨论程序架构设计

--------------------编程问答-------------------- 我曾经做过一个项目,就是生成各种报表,当时就是用的Excel来作为报表文件,可以生成类似于你上面这样的Excel文件。
不过跟你的需求相反,你是读取这些excel,然后导入到数据库中。

给你两点建议,权当开拓一下思路:
1、数据库设计,以业务为单位。将excel里面的数据根据情况分成多张表,而不是放到一张表里面。需要查询的时候可以关联组合查询。
2、把excel的格式尽量固定下来,这样程序相对好写的多。 --------------------编程问答-------------------- 如果excel格式是你确定的,可以使用适配器模式。

excel那里格式经常变化,约定好接口,设计一个宏,在处理之前先标准化一下。 --------------------编程问答-------------------- 企业里边使用Excel自助地开发简易管理信息系统的人,往往都是业务主管,因此他们手中的Excel表的格式自然就会经常变化,而且这些变化几乎全都是“有道理”的。这正好适合企业“小步快跑”地提高管理探索的进程。而程序员往往不懂企业。


回到你这个问题。假设数据不多,那么可以把Excel直接丢给服务器。我记的Excel2007以后就已经支持160万行数据了,更何况你是一个月才一个工作簿。将Excel作为数据库载体,那么显然地,Excel上的表间公式也就自动化的对报表进行汇总了。

如果达到一定的阶段,也许需要抽取数据,使得你的服务器“根本不知道Excel工作簿的存在”。这样的好处也很明显,是可以跨各种前端应用程序(而不仅仅是Excel工作簿界面或者web界面)。那么你就应该首先学习“无模式的NoSQL数据管理理念”。例如同样是“进出口猫腻分类统计”这个数据集合,其中一条记录写成json格式可能是这样的


  "填表年":2013,
  "填表月":4,
  "单位":"万美元",
  "交叉数据":
    [ {
        "x方向标题":["贸易方式","一般贸易"],
        "y方向标题":["出口","累计"],
        "值":936393.0
      },
      ........  这里是其它的交叉数据对象
     ]
}


这样你可以看到,对于Excel上的独立的单元数据,你可以使用Excel的“命名”机制来读取单元格,例如将 J3 单元命名为“计量单位”,那么你就按照 Worksheet.Names 中的命名找到对应的单元格抽取这“名称、值”就行了;而对于位于 C6:J11 的交叉表,Excel的这类表都是x-y方向二维表,并没有三维或者更多维,你就可以读取其左面两列作为x标题,读取其上面两行作为y标题,(可以在一个参数表中说明一下x、y方向各有几层标题),然后逐一读取 C6:J11 区域上的单元格数据。正如json格式上表示的,交叉表包含单元格对象的数组;而每一个单元格生成一个独立对象,包括“x方向标题、y方向标题、值”三个属性。

作为NoSql数据库的,例如MongoDb,它可以对json文档中的内嵌的属性也进行高效率的索引,因此你完全不用担心上述这种json格式的数据进行索引查询(例如单独查询和汇总y方向标题“出口”的值)。并且也支持文档的无模式存储和编程(不像关系数据库那样,固定死了字段)。 --------------------编程问答-------------------- 扔掉关系数据库概念,学习文档数据库(或者至少是NoSQL数据库)概念,这是前提。

你就不会纠结在“如何设计数据库”上,对于“程序架构”的自由地把握也就可以开始了。 --------------------编程问答-------------------- 实际上除了交叉表数据,Excel上常见的还有一种“多行”数据。例如你首先将发票的明细部分(比如说C2:H9)命名为“发票明细”,并且在参数表中说明其“y方向标题只有一层(行)”,那么将Excel发票中的数据抽取到数据保存时,其明细部分,其实类似于这样的文档结构(属性)
"发票明细":
    [  {"货品名称":"笔记本电脑", "规格型号":"联想Yoga-13(橙)", "单位":"台", "数量":1, "金额":6783.0},
       ......其它的明细行
     ]
它其实就是一个简单的数组。 --------------------编程问答-------------------- 就是一个EXCEL表取值问题,说程序架构概念有点大 --------------------编程问答-------------------- 如果你认识到这整个推翻了传统的关系数据库概念,也许就可以承认这也算是一种“程序架构”。

也许不是我们自己认为的“程序架构概念”,但是也许我们自己根本没有想象到这种“推翻”将带来多少代码、多么丰富的功能设计、多么巨大的用户体验改变。 --------------------编程问答-------------------- 要牢记一点:

用的表格设计规范是经常变化的。因此你不可能在所谓的数据库中预先写死字段定义!用户只要修改Excel模板(后缀为.xltx或者.xltm的文件),就能开始录入新的摸板下的数据了,不需要系统维护人员去设计什么数据库字段,更不需要给软件产品升级。

因为这种通用的表格系统,你不能“见到一个Excel模板就去开发一次程序”。你需要支持Excel所能够完成的大多数“自助开发小型管理信息系统”功能,而且你不能要求用户先把所谓业务表格“固定了”才买你的表格处理系统。 --------------------编程问答--------------------
引用 7 楼 sp1234 的回复:
如果你认识到这整个推翻了传统的关系数据库概念,也许就可以承认这也算是一种“程序架构”。

也许不是我们自己认为的“程序架构概念”,但是也许我们自己根本没有想象到这种“推翻”将带来多少代码、多么丰富的功能设计、多么巨大的用户体验改变。

真的颠覆了,我准备看下通过VSTO对Excel开发。 --------------------编程问答-------------------- 统计系统我有现成的案例!可QQ联系:342376306 --------------------编程问答-------------------- --------------------编程问答-------------------- 请问如何设计数据库,程序架构. --------------------编程问答-------------------- 类似于数据仓库,几个维度创建数据立方。。按照业务对象,分别建立OLTP数据库也可以
补充:.NET技术 ,  分析与设计
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,