制表软件的横排、表头、并行的自动化的制作方法

文档序号:6637358阅读:593来源:国知局
制表软件的横排、表头、并行的自动化的制作方法
【专利摘要】本发明,涉及制表软件的横向排版、多层表头、同一列相邻单元格内容相同时的合并等的自动化。分别为:1.以字符为单位横向安排。超出部分另页打印。2.可多栏时,自动多栏。3.可以,以纸张的横向利用率自动确定纸张方向。4.以列名框分隔线高,自动确定多层表头。5.单元格的输出,延迟到同一列次行单元格内容的到来时;并由次行内容决定是直接输出还是合并输出。应用本发明编写的制表软件,用户可以不用干预或极少的干预,即能自动安排好版面。
【专利说明】制表软件的横排、表头、并行的自动化

【技术领域】
[0001]本发明,涉及通用制表软件设计。包括以下具体发明:
1.横向自主排版;
2.用列名框高表达多层表头;
3.延迟输出式并行显示。
技术背景
[0002]表格,包括两大要素:数据与数据展示方式。为叙述方便,称数据展示方式为样式。样式除包括各单元格外观,还包括:①由原始数据计算得到的新单元格值、新列、统计结果;②排序、过滤;③分栏、分页等版面控制分组。
[0003]跟制表软件系统打交道的人,可分为两类:设计者与使用者。
[0004]制表软件系统,可分为专用与通用两类。通用类,指:一个制表软件系统处理的表格的样式,可由使用者修改,而不是要设计者修改。
[0005]通用制表软件,日前,主要有电子表格类软件。Excel是电子表格类软件的代表。
[0006]本发明,要解决当前的制表软件,以下三个不足:
1.横向排版:
横向排版,有两个工作要做:
I)确定页面的方向:
Excel,在页面设置中,可选择页面方向为:纵向或横向。
[0007]这虽然简单且直接。但,在要改变页面方向时,需人为干预。
[0008]2)在页面的横向安排好表格:
横向安排表格,分两种情形:
a)横向分页:
当表格的宽与纸张的打印区的宽比较,更宽。我们应该将表的横向拆分开。放到多张纸上。这叫横向分页。
[0009]Excel,会自动横向分页。
[0010]如图01。是一个正在用Excel编辑的表格。它有五列。列1、列2、列3,各宽2字节。列4,宽70字节。列5,宽4字节。用16号字显示着。
[0011]在页面设置中,指定A4纸,纵向。则在列3与列4、列4与列5间,出现竖虚线。这就是分页线。
[0012]打印预览,效果如图02_1、02_2、02_3。
[0013]图02_1可看出:表格列依次打印。至某列,在本页不能完全打印,则另起一页。
[0014]图02_2可看出:只打印一列且超览,该列在本页不能完全打印。图中显不,列4只打印了 59字节。少了 11字节。
[0015]图02_3可看出:该页从第5列开始打印。即从前一面打印了的列的后一列开始打印。
[0016]从图02_2与图02_3可看出,列4少打的11字节,被放弃了。
[0017]这样的分页方式,缺点是明显的:纸张利用率降低,还可能丢失内容。且各页要拼粘成大页,以方便读表时,还要剪掉一些纸张。
[0018]b)分栏:
当表格的宽与纸张的打印区的宽比较,小很多。我们可在纸的横向并列安排多个表格。这叫横向分栏。简称:分栏。
[0019]图03为正在用Excel编辑的表格。它由图01的表格删除宽70字节那列而得。图中第三十三行与第三十四行之间。有一条横虚线。它为纵向分页线。表达第一页的纵向,只能安排第三十三行以前的内容。其后的内容,将另页打印。
[0020]图04为打印效果。约五十条记录。被分成两页打印。该图,把两页并排放在一起了。左边是第一页。右边是第二页。图中可见,第一页右边,有很多空白。但Excel并不使用。说明Excel,无分栏。
[0021]可分栏时不分栏。不美观。也浪费。
[0022]有些表格软件,自动增加字号。使横向填满,以求美观。但,字号一大。纵向占纸更多。浪费更大。
[0023]有些有分栏的制表软件,用指定一个分栏数,进行分栏。这也要人为干预。不方便。
[0024]2.多层表头:
Excel软件,做多层表头的方法是:在图05_1的表格的表头行(第一行)点右键。弹出菜单中,点插入。弹出窗中,再点整行。结果如图05_2。
[0025]再将图05_2中虚线两边的单元格,做块。再合并做块中单元格。得如图05_3示的多层表头。
[0026]从所述过程看出,除要合并多层表头的单元格:列3、列5外。还要合并不做多层表头的全部列。即图05_2中的单元格“列I”、单元格“列2”。显得很麻烦。尤其在表格列数多时。
[0027]另,注意列5中,内容为“eOOl”的单元格。插行前,它在第2行(见图05_1 )。插行后,它在第3行(见图05_2)。事实是,插行后,全部内容,对应的行号都要加I。这就带来,对单元格的引用时,其引用的表达式中,要对单元表达式加I。Excel设计了自动对引用单元格表达式中的单元格变量加I。因此,用户不会感觉这个麻烦。但,设计制表系统时,有麻烦。
[0028]3.并行显示:
注意图06_1和图06_2。图06_1与图06_2,内容相同。但,图06_2,可容易的看出,哪些同学是同一个班的。这种效果,是因为做了“将同一列相邻行内容相同的单元格,显示为一个大单元格”。为叙述方便,简称为“并行”。
[0029]Excel软件,达到并行效果,有以下方法:
I)手动:
把要并行的单元格,手动拉成一个块。再执行合并单元格命令。很简单。只是数据多时,可能让要并行的内容,多到无法做。
[0030]2)代码:
Excel宏代码,当然可以解决这个问题。但,有难度。一般人,写不来。
[0031]3)分类汇总
该法大致有以下步骤:
a)选中要并行的列,点:数据/分类汇总。会在该列左边出现新列。称之辅助列
b)选择辅助列,点:编辑/定位/空值
c)则自动选中空值。点:合并单元格
d)再次选中辅助列,点:编辑/定位/常量
e)点:删除/整行
f)再选择辅助列,点:复制。在要并行的列,点:选择性粘贴/格式
g)删除辅助列
本法不是太难。但,还是复杂了些。
[0032]综上,Excel现在有的方法,都不太理想。


【发明内容】

[0033]1.横向自主排版:
本发明的排版,分三步:
I)指定页面意向:
程序提供一个菜单,包括三子项:竖向、横向、自动。由用户指定希望的页面方向。
[0034]2)安排表格位置:
指定了或竖或横的页面方向。安排表格位置,和Excel似。也分为两种情形:
a)横向分页:
当表格宽大于纸张的打印区域宽。要横向分页安排。
[0035]如图07_1。依次安排表格各列。致某列安排不下。将该列的余下部分。放到下一页。如图07_2。再依次打完其它列。
[0036]图07_1看到。超出纸张的打印区域宽的部分。打印在右空边处了。而图07_2中,左侧是左边空部分。可把第一张即图07_1表达的那张的右边,贴到图07_2的左边空处。成为一张大纸。即得完整的表格。方便阅读表格内容。
[0037]这样的分页方法,优点是明显的:不会丢内容。且各页要拼粘成大页时,不用剪掉纸张。
[0038]b)分栏:
当表格的宽,小于或等于纸张页面的打印区域宽时。我们依次安排表格各列。
[0039]当表格的宽,比纸张页面的打印区域宽小很多时。我们可在纸的横向打印多个表格,即打印多栏。规则为:排完一栏后。空出一个栏间距宽。再排其它栏。直到不能排新的栏。
[0040]图08是分栏打印效果示意。
[0041]3)确定页面方向:
当用户在指定页面方向的菜单上,选择的是“竖向”或“横向”。到第二步,表格就安排好了。
[0042]当用户在指定页面方向的菜单上,选择的是“自动”项。则程序自主确定页面方向。方法是:先竖放纸张,再横放纸张,分别安排表格。得到横、竖两种方向的纸张的打印区域的横向利用率。
[0043]两个放纸方向过程中,表格的安排,可能是分栏,也可能是分页。
[0044]分栏与分页,纸张利用率计算方法分别为:
a)分页时:
利用率=表格宽/ (分页数*纸张宽-左边宽-(纸张数-1)*右边宽)
b)分栏时:
利用率=(栏数*表格宽+ (栏数-1)*栏间距)/ (纸张宽-左边宽-右边宽) 利用率高的方向,定为实际版面方向。
[0045]图09_1和图09_2显示了,不断改变“列5”宽而使表格宽度变化。本“横向自主排版”法,依次用:1张纸竖向2栏,I张纸横向2栏,I张纸竖向I栏,I张纸横向I栏,2张纸竖向I栏,2张纸横向I栏,来适应表格宽度的变化。
[0046]2.用列名框高表达多层表头:
表头,表格的第一行。指明该列其它行(数据行)的性质。也叫列名行。该行的单元格,可称为:列名框。
[0047]多层表头,用于指明有相同属性的相邻若干列的性质。
[0048]见图10_1左边。是有单层表头的表格。
[0049]将图10_1左边表格的列3与列5之间的列名框分隔线,降低。再在降低后的列名框分隔线上端,画一条横线。横线的两端,画到碰到相邻列的列名框分隔竖线则止。两层表头就出现了。见图10_1右边。
[0050]编辑第二层列名后,效果如图10_2左边。
[0051]类似的,再将列2与列3之间的列名框分隔线降低。可得三层表头。效果如图10_2右边。
[0052]从图10_1右边和图10_2右边,可看出,本方案与Excel的效果类似。
[0053]而上述做多层表头的过程,显示本方案只用一步。即降低列名框分隔线高(分隔线上部的横线可自动画出),就能得到多层表头。与Excel的插一行,再合并若干单元格的方法比,更方便。
[0054]另一个好处是:多层表头,是集中在一行内。即,数据的行号,不会发生变化。
[0055]本方案带来的一个小问题是:多层表头,集中在一行内,使得列名的字体可能变得很小。解决的方法是:让表头的高度增加。如图10_3。表头高度增加后,字体可变大。且,后面数据只是显示位置移动。行号依旧不变。
[0056]3.延迟一行输出式并行显示:
本发明,用延迟一行输出来达到并行目的。具体是:
对每一页。从该页首行开始向页末行循环,并在页末行后,多循环一行。再在行内进行列循环。在这两个循环中,对全部的单元格先得到单元格内容及位置,再进行以下判断与处理:
1)如单元格位于首行,则将内容与位置记录到临时变量;
2)如单元格不在多循环的行,则与临时变量中对应列的单元格内容比较。内容没变,则将后一行单元格的底边位置,替换掉当前单元格边框位置的底边值,成为大单元格。即对单元格完成并行; 3)如果不满足条件1),2),则显示临时变量中的内容,即显示前一行的内容。之后记录新内容及边框位置到临时变量,即记录下当前行的内容与边框位置。

【专利附图】

【附图说明】
[0057]图01是Excel编辑窗中,纵向分页线示意图;
图02_1至图02_3是Excel编辑的图1表格,打印预览的各纸内容示意图;
图03是图1表格,删除宽70字节列,余下列的意图。图中第33行与第34行间,有纵向分页线;
图04是图3表格的打印效果示意图。图中显示空了很多纸,没有分栏利用;
图05_1至图05_3是Excel做多层表头的过程示意。图05_1为原始表头。图05_2插了一行。图05_3合并了单元格,得出多层表头。并显示数据的行号,都增加一;
图06_1和图06_2说明:同一列相邻单兀格内容相同时,合并单兀格前后的效果;
图07_1和图07_2是本发明的分页打印效果示意图;
图08是本发明的分栏打印效果示意图;
图09_1和图09_2是不断增加“列5”宽,而使表格宽增加,横向自主排版过程的效果; 图10_1至图10_3为降低列名框高,并加画一条横线而得到多层表头的过程效果;
图11有助于实施本发明的各子发明间的关系;
图12是本发明实施例的:分栏、多层表头、并行后的总体效果。

【具体实施方式】
[0058]图11给出了,各子发明间的关系。其中:准备数据、竖向排版,虽然对本发明的成立,没有直接关系。为表达上的完整性及实施的便利,加在图11中。
[0059]下面,将给出相应子发明的核心的C++ Builder代码。
[0060]先给出后面的代码要用到的常数、变量与函数:
#define LayerMax6//多层表头的层数限制
#define ColMax128//表格的列数限制
TPoint Paper= Point(210, 297), EdgeO= Point(25, 25), Edgel= Point (15,
25);
//Paper:纸张大小,EdgeO:纸左顶边空宽,Edgel:纸右底边空宽:单位都是毫米 int BarGap= I;//栏间距,单位字节
float mmPixel= 4.92, ByteMM= 1.836;//每毫米.像素数,每字节.毫米数
bool Veer;//记录实际纸张方向:O竖,I横
int Page,Bar;//横向页数,表栏数
int RowHigh= 3;
struct SColH表格列描述
{
int Wide, High;//宽,列名框高 char Name [32] ;// 列名
bool —fastcall IsAddLayer (int high)//附加层

{
return High!= high;

}
//函数IsAddLayerO,判断当前列,是否有附加层
};
Il其中:High取值I 一 LayerMax。High〈LayerMax,则会出现多层表头 //其中:UniteRow取值O或1,I表示该列相邻单元格内容相同时,合并单元格。
[0061]struct STab// 表格描述
{
SCol Cols [CoIMax] ;// 各列描述
int ColCountj HeadRate;//列数,表头为数据行高的倍数
int UniteRow;// 并行
int HighCol (int col, int k)//找高列线

{
for (int i= col;;)

if (i+= k,Cols [i].High〉Cols [col].High || k〈0 && Cols [i].High==Cols[col].High)

return i;

}
//在给定列col的前后,找列名框分隔线高的列 //k取值:-1,1。 k=-l,等高即算高列线
bool —fastcall IsAddLayer (int col)//附加层判断

{
return col> O && col< ColCount && Cols[col].1sAddLayer(Cols[HighCoI (col, -1)].High);

}
} Tab;
void —fastcall OutString(TCanvas*canvas, TRect cell, String str)
{//输出单元内容并画边线
TColor color= canvas->Brush->Color;
canvas->TextRect(cell, cell.Left+ 3,cell.Top+ 3,str);
cell.Right+= I;
cell.Bottom+= I;
canvas->Brush->Color= clBlack;
canvas->FrameRect(cell);
canvas->Brush->Color= color;
}
# define rowhigh(RowHigh^ByteMM^mmPixel)//得到以像素为单位的行1?
//定义常数、变量与函数,结束。
[0062]1.横向自主排版:
核心代码:
void —fastcall HorizontalLayout (int Way)//横向排版
{
Page= Bar= I;//赋初值:横页数,表栏数
TabWide= O;//表行宽
for (int col= O; col< Tab.ColCount; col++)
TabWide+= Tab.Cols [col].Wide;//得表格宽,单位为字节
float PaperRate [2], tabwide= TabWide* ByteMM; //纸使用率,表宽转毫米
int temp[2]= {1,1},areaWide[2] ;//临时记数,打印区宽
int paper [2]= { Paper, x, Paper, y } ;//纸大小
for (int end, i= 0; end= 0,i< 2 &&(i== Way | | Way== 2) ; i++)
if (areaWide[i]= paper [i]_ Edge0.x- Edgel.x, tabwide> areaWide[i])

{
for (float sum= areaWide[i]; !end; sum+= paper [i]- Edgel.x,temp [i]+=! end)
if (sum+ Edgel.x >= tabwide)// 够宽,能打印了
end= true, PaperRate[i]= tabwide/ sum;

}
elseIl多栏
for (float add=tabwide+BarGap*ByteMM,sum=tabwide; !end; sum+=add,temp [i]+=! end)
if(sum+ add> areaWide [i])
end= true, PaperRate [i]= sum/ areaWide [i];
Veer= Way< 2? Way: PaperRate[I]> PaperRate[0];
(tabwide> areaWide[Veer]? Page: Bar)= temp[Veer];
}
//横向自主排版,代码结束。
[0063]代码说明:
I)函数的参数Way,带入用户意向。Way取值O — 2。其中:0,竖向;1,横向;2,自动;
2)循环for(intend, i= 0; end= 0, i< 2 &&(i== Way | | Way== 2); i++),其中的i,表达将要尝试的纸张方向:i=0,竖向;i=l,横向。当i值与意向同或意向为自动,贝Ij尝试该i值方向的排版;
3)temp [i],记录下排版得到的相应方向的栏数或纸张数;
4)Veer为逻辑变量。表达纸张是否要转向。默认值为0,表达纸张竖向。为真,则纸张横向。即Veer为I,则实际打印时横向放纸。
[0064]2.列名框高表达多层表头:
核心代码:
void —fastcall OutTabHead(TCanvas*canvas, float *y) //输出表头
{
*y+= Tab.HeadRate* rowhigh;
TRect Cell;
for (int add, Col[2], col=0; col< Tab.ColCount; col++)
for (add=0; add== 0 | | add< 2 && Tab.1sAddLayer(col); add++)

{
if(Col[0]= col, Col[I]= col+ I, add)
for (int i= 0; i〈 2; i++)
Col[i]= Tab.HighCol(col, i?l:-1);
Cell.Left= Tab.Cols[Col[0]].x;
Cell.Right= Tab.Cols[Col[I]].x;
Cell.Bottom= *y- add* Tab.HeadRate* Tab.Cols[col].High* rowhigh/
LayerMax;
float min= Tab.Cols[Col[0]].High;
if (Tab.Cols[Col[0]].High〉Tab.Cols[Col[I]].High)
min= Tab.Cols[Col[I]].High;
Cell.Top= *y- Tab.HeadRate* min* rowhigh/ LayerMax;
OutString (canvas, Cell, StrPas(Tab.Cols[col].Name)+ (add?"+":""));

}
}
//列名框高表达多层表头,代码结束。
[0065]代码说明:
1)函数的参数I带入开始显示表格的位置;
2)本案前面叙述做多层表头的发明原理,是在低列名框线上,画一条横线。上面的实施代码,没有画这条横线。而是画框。称之为附加层。画框,代码更简洁;
3)不管画线还是画附加层框,都要先判断出是否有附加层。这个判断是用函数IsAddLayerO做。注意,连着两个等高的低列名框线,后一个没有附加层;
4)附加层框的左右,由两边的更高的列名框线围成。这更高的列名框线,简称“高列”。由函数HighCol O得到。
[0066]3.延迟输出式并行显示: 定义一组变量,用来记录各列的显示状态:
struct ShowCellWay//记录单元格的显示状态
{
charStr [256] ;//待显示的串
TRectRim;//记录边框位置
voidGetData(int col, int row)// 得表格各单兀内容
{//并不实际读数据库,
而是产生模拟
row= (row / 3)* 3;//这句让相邻两行内容相同
strcpy (Strj//得到单元格内容

(col? String (row)+ 〃—〃 + String (col): String (row)).c_str ());
}
} Cells[ColMax];
//定义变量,结束。
[0067]核心代码:
void 一fastcall DelayOutData(TCanvas氺canvas, float氺 y)
{
char str [256];
int rowO= 0,rowl= 10;//页内的起、止行号
for (int i,col, row= rowO; row<= rowl; row++)//行循环
for (col= 0; col< Tab.ColCount; col++)//列循环
if (GetData (col, row, str), row== rowO)//得单兀内容,延迟一行

{
strcpy(Cells[col].Strj str);
Cells [col].yO= *y;
Cells [col].yl= *y+ rowhigh;

}
else if (row<rowl && Tab.UniteRow && !strcmp(Cells[col].Strj str))
Cells [col].yl+= rowhigh;// 合并单兀格
else

{
OutString(canvas,// 输出单元内容
Rect(Tab.Cols[col].x,
Cells [col].yO,
Tab.Cols [col+1].x,
Cells[col].yl),

Cells[col].Str);
strcpy (Cells [col].Str, str) ;//记录新显示参数
Cells[col].yO= Cells[col].yl;
Cells[col].yl+= rowhigh;

}
}
//延迟输出式并行显示,代码结束。
[0068]图12给出了,按以上代码来实施本发明后,排版状态为分栏,有多层表头,合并指定列相邻行内容相同的单元格后,总体效果。
【权利要求】
1.一种制表软件系统的确定纸方向的方法,其特征为:可以将纸张,横、竖两方向试安排;并比较两方向纸张的横向利用率;最后以利用率高的方向作为实际纸张方向。
2.—种制表软件系统的表格宽大于纸张的显不区域宽时的分页安排方法,其特征为:表格后一页的每一行,都是以前一页显不的最后一字符之后的字符,作为开始字符。
3.一种制表软件系统的表格宽小于纸张的显不区域宽时的分栏安排方法,它,定义一个变量,并赋纸张的显示区域宽给该变量,为叙述方便,以下称该变量为‘显区宽’,并做以下特征操作: &)判断显区宽是否小于表格宽;是,则结束;否则做下面的第幻步; 幻显区宽减去表格宽再减去表格间距(即栏间距?;以余下的显区宽,回到第幻步。
4.一种制表软件系统的多层表头表达法,其特征为:表头的列名框分隔线,可以降低高度;并在降低高度的列名框分隔线上端,横画一条线段;该横线段以两端遇到其它更高的列名框分隔线止。
5.一种制表软件系统的自动合并显示同一列相邻行的单元格的延迟一行显示法,其特征为:每个单元格,都等到次行的对应单元格,才判断并确定是并行还是显示。
6.一种如权利要求5所述的延迟一行显示法,其特征为:对表格的每一页,循环处理每一行的各列的单元格,且在页未行后,多处理一行;各单元格处理如下: 当单元格位于本页首行,则记录下该单元格的内容与显示的边框位置; 幻当单元不在多处理的那一行且用户希望并行且该单元格内容与之前记录的前一行同一列单元格内容相同,则合并单元格; 0)以上两条件不满足时,则,输出前一行对应单元格内容并记录当前处理的单元格内容与边框位置。
7.权利项1、2、3、4、5所述制表软件系统,为一种通用制表软件系统,其特征为:表格的样式,可由使用者随时修改,而不是要由制表系统的设计者修改。
【文档编号】G06F17/24GK104391833SQ201410731831
【公开日】2015年3月4日 申请日期:2014年12月5日 优先权日:2014年12月5日
【发明者】张明兴 申请人:张明兴
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1