永中首页 | 产品聚焦 | 销售渠道 | 服务支持 | 教育专栏 | 二次开发 | 在线订购 | 产品注册 | 免费下载 | 新闻中心 | 关于永中
发新话题
打印

[改进建议] 关于表格编辑选择性粘贴的转置(镜像对称)的创新和粘贴图片质量的建议

关于表格编辑选择性粘贴的转置(镜像对称)的创新和粘贴图片质量的建议

┌─────>x
│0  


y

将表格编辑以上述坐标标识。
当前,行列的转置其实是关于y=x的对称复制,那么,自然,我们也可能需要关于x=m,称为:水平镜像复制;或者,y=m的镜像复制,称为竖向镜像复制。
所以,转置的功能是微软加给我们的唯一选择,我希望永中创新突破!这个功能其实是镜像复制的问题。
建议:
①在选择性粘贴中的:
转置
改为:
转置行列转置水平镜像竖向镜像

本人在永中二次开发部门的“三头驴”的帮助下,完成了自动粘贴镜像复制的宏制作。对于粘贴到指定单元格也是可以在改进后优化的,但是,我根据自己的需要自动粘贴即可。即:
111213
212223
313233
竖向镜像复制,自动接在所选区域下面一行,结果形成:
111213
212223
313233
313233
212223
111213
水平镜像复制,自动接在所选区域右边一列,结果形成:
111213131211
212223232221
313233333231

还是希望永中能不能在这个方面一改微软给我们的单一选择限制!

②建议永中在粘贴成图片的时候,不要压缩降低其图片质量
我为什么有这样的需要?
因为在以永中表格编辑的时候,我把行列高宽设置成0.1cm,放大编辑有关单元格的背景,进行类似像素制图那样的操作,比如:国画画卷。所以,建议永中在粘贴成图片的时候,不要压缩降低其图片质量!!!在制作过程中,因为图形对称的大量存在,就产生了镜像复制宏的制作需求,但是本人的java水平等于零,今天中午开qq群(独立自主--龙芯+汉编+永中),并在永中二次开发部门的“三头驴”的帮助下完成了。这可是我第一个正儿八经地编辑的宏,以前vba在麻烦也可以独立完成,现在,开头难,还好有高手指教。
宏代码如下:

void jx_shuxiang()
{
    Worksheet sheet = Application.getWorkbooks().getActiveWorkbook().getWorksheets().getActiveWorksheet();
    /* Range range = sheet.getRange("b2:b4"); */
    Range range = sheet.getActiveRange();  /* 用户选择区域 */
    if(range==null)
    {
        return;
    }

    int hang_shi = range.getStartRow();/* 用户选择区域始行序数 */
    int hang_zhong = range.getEndRow();/* 用户选择区域终行序数 */
    int lie_shi = range.getStartColumn();/* 用户选择区域始列序数 */
    int lie_zhong = range.getEndColumn();/* 用户选择区域终列序数 */
    int hangshu = hang_zhong - hang_shi+1;
    int lieshu = lie_zhong - lie_shi+1;

    for (int i = lie_shi ;i < lie_zhong+1;i++)
    {
         for (int j = 0 ;j < hangshu;j++)
        {
            Cell cell = sheet.getCell(hang_shi+j,i);
            cell.select();
            cell.copy();

            Cell cell = sheet.getCell(hang_zhong+hangshu-j,i);
            cell.select();
            cell.paste();
         }   
    }
}

void jx_shuiping()
{
    Worksheet sheet = Application.getWorkbooks().getActiveWorkbook().getWorksheets().getActiveWorksheet();
    /* Range range = sheet.getRange("b2:b4"); */
    Range range = sheet.getActiveRange();  /* 用户选择区域 */
    if(range==null)
    {
        return;
    }

    int hang_shi = range.getStartRow();/* 用户选择区域始行序数 */
    int hang_zhong = range.getEndRow();/* 用户选择区域终行序数 */
    int lie_shi = range.getStartColumn();/* 用户选择区域始列序数 */
    int lie_zhong = range.getEndColumn();/* 用户选择区域终列序数 */
    int hangshu = hang_zhong - hang_shi+1;
    int lieshu = lie_zhong - lie_shi+1;

    for (int i = hang_shi ;i < hang_zhong+1;i++)
    {
         for (int j = 0 ;j < lieshu;j++)
        {
            Cell cell = sheet.getCell(i,lie_shi+j);
            cell.select();
            cell.copy();

            Cell cell = sheet.getCell(i,lie_zhong+lieshu-j);
            cell.select();
            cell.paste();
         }   
    }
}


[ 本帖最后由 983mxm 于 2008-10-27 23:13 编辑 ]

TOP

本人的代码说明:
1、限于从零基础开始,优化的余地肯定有!
2、区域单元格多的时候速度有点慢,可以看见被选择复制单元格和粘贴所在单元格的相向靠近的景象,哈哈。如果果真成为系统功能,速度应该马上改善的,转置在使用的时候也是这样。
3、区域单元格内不能有合并单元格,否则,结果有些异样!!哈哈,可以优化,但是,我现在还不需要,当然,如果有高手指点一下,粗活我来干!要不,自己从零学习太辛苦了!哈哈。当然,当前的行列转置在使用的时候,情况是一样的,哈哈,说明设计人员在设计的时候根本就没有考虑过所选区域是否存在合并单元格的判断!这个要完成改进并不麻烦,多一个是否存在合并单元格的判断,如果存在,则相应处理而已,不难。微软的excel2007在试用的时没有这个问题!!!看来,思维很关键啊。

TOP

又在三头驴提供的资料中找到:
offset(int rows, int columns)
          与当前的单元格区域偏移指定的行列数后的单元格区域
可以用来改进当前代码

merge(boolean alignmentCenter)
          合并单元格。
unmerge()
          清除选取单元格区域里存在的合并单元格。

可以用来解决合并单元格的情况。但是,没有找到判断是否合并单元格的。
整理在此,来日改进。

TOP

isMerge()
判断是否设置了合并单元格

在网站下载的pdf文档中终于发现判断是否合并了,真服了永中,一些文档还是要人性化一点,否则,刚接触的人很有抵触感的。这个虽然微软也做得不好,但是,人家现在是霸主,网络资源和书籍资源丰富得很,所谓人性化这种其实是很细节很基础的工作,不能忽视啊,希望caocan看到能够多招些人手!在经济不景气的现在,也好让程序员们多条出路,更让信息领域的独立自主更有奔头,哈啊哈。

TOP

忽然想到:如果一个个单元格复制改成区域内一行行(竖向)或者一列列(水平)不就减少了很多复制粘贴了吗?
从行*列次变成行或者列次,悔当初没有想到,这就是基础是零的坏处啊。

TOP

循环中拷贝复制是很浩资源的,可以这样写

void jx_shuxiang()
{
    Worksheet sheet = Application.getWorkbooks().getActiveWorkbook().getWorksheets().getActiveWorksheet();
    Range range = sheet.getActiveRange();  /* 用户选择区域 */
    if(range.getCells().length==1)
      {
          return;
      }
    int hang_shi = range.getStartRow();/* 用户选择区域始行序数 */
    int hang_zhong = range.getEndRow();/* 用户选择区域终行序数 */
    int lie_shi = range.getStartColumn();/* 用户选择区域始列序数 */
    int lie_zhong = range.getEndColumn();/* 用户选择区域终列序数 */
    int hangshu = hang_zhong - hang_shi+1;
    int lieshu = lie_zhong - lie_shi+1;
    for (int i = lie_shi ;i < lie_zhong+1;i++)
    {
         for (int j = 0 ;j < hangshu;j++)
        {
            String cellString = sheet.getCellString(hang_shi+j,i);
            Cell cell = sheet.getCell(hang_zhong+hangshu-j,i);
            cell.setValue(cellString);
         }   
    }
}

[ 本帖最后由 macrosuner 于 2008-10-28 10:13 编辑 ]

TOP

哈哈,看来没有高手帮我指点优化一下。本以为是举手之劳,一点提醒就好。

TOP

学习了

TOP

发新话题