通常的代码生成器都是根据字段来生成代码的,例如为表生成相应的实体类代码,不过今天我要生成的并非实体类,而是表中的内容,生成相应的常量定义。
例如某个表有三个字段:ID,主键,整型;Name:字符串;Description,字符串。
我现在想让Name作为变量名称,ID为值,Description为注释,如果把这个表的内容导到Excel工作表里,那么就可以再加一列,用公式生成代码,假设当前行为2,并且字段按上述顺序排列,那么生成代码的公式如下:
="public const int " & UPPER(B2) & " = " & A2 & ";  // " & C2
假设这三列的内容分别是:100,Can_Edit_Post,是否允许修改帖子内容,那么用以上公式计算的结果以下:
public const int CAN_EDIT_POST = 100; // 是否允许修改帖子内容
然后用填充柄把所有行的公式一次搞定,复制到代码文件中就搞定了,确实很方便,但这样算不上太完美,如果可以生成下面这样的形式就更完美了:
/// <summary>
/// 是否允许修改帖子内容
/// </summary>
public const int CAN_EDIT_POST = 100;
如果把上面的公式修改一下来生成这样的文字也是可以的,不过会马上感觉到失望,因为生成之后的代码如果复制并粘贴到代码文件中,每个单元格的内容都会被自动加上一对双引号。原因嘛,我估计就是换行了,我试着到网上去寻求解决方案,不过可惜的是没有。那怎么办呢,我好好想了想,可以变通变通,把每一行内容在另一个工作表里拆分到四行里,分别对应四行代码,这样再复制粘贴就没有问题了。
可是,新的问题又来了,原先一对一行的时候,单元格的引用是非常方便的,直接用一个相对地址就可以了,可是一对四就不能直接这样引用了,必须进行一点转换。做这样一个假设,源数据从第2行开始,而代码就直接从第1行开始,因为是1:4,所以在第二个表里只要将当前行号除以4再加上2就是相应源数据里的行号了。下面列出涉及到的几个公式:
ROW() - 获取当前行号。
ADDRESS() - 根据行-列的整型数值生成相应单元格地址的字符串表达式,例如ADDRESS(2,1)生成"$A$2"。
INDIRECT() - 根据单元格地址的字符串表达式获取相应单元格的地址,例如INDIRECT("$A$2")与直接使用$A$2的效果是一样的。
有了以上三个公式的帮忙,问题可以得到圆满的解决,以生成第二行注释为例说明一下公式的使用:
= "/// " & INDIRECT(ADDRESS(INT(ROW() / 4) + 2, 3))
虽然可以生成这样的代码,但可能还有许多更复杂的需求可能是达不到的,除非另外编程。
posted on 2009-08-27 22:21  一风  阅读(1323)  评论(0编辑  收藏  举报