当前位置: 代码网 > it编程>编程语言>Asp.net > C#解决Excel边框样式无法复制及格式刷功能

C#解决Excel边框样式无法复制及格式刷功能

2024年09月30日 Asp.net 我要评论
问题现象在运行数据表数据导出到excel 数据输出时遇到了一个问题,开发者设计了单行细线下边框的输出模板,如下图设计:其中 <%system.excel.title.dyna.by.craneo

问题现象

在运行数据表数据导出到 excel 数据输出时遇到了一个问题,开发者设计了单行细线下边框的输出模板,如下图设计:

其中 <%system.excel.title.dyna.by.craneoffice%> 字符标记用于输出报表标题替换。数据从a5列开始至d5列结束,按行输出。期望得到如下输出样式:

虽然已经自定义了复制样式的方法,包括边框风格的复制,但实际输出遇到了如下情况:

实际想要得到的单行细线下边框输出没有实现,使用简单 borders.linestyle 赋值没有奏效,以后输出的行复制第一行的样式没有成功,因此需要调整样式输出策略,实现类似格式刷那样的操作,这样即实现了格式输出的完整性,也保证了性能。

范例运行环境

操作系统: windows server 2019 datacenter

.net版本: .netframework4.0 或以上

office excel 2016

开发工具:vs2019  c# 

解决方案

剪贴板加特殊粘贴

使用 com 操作的流程原理如下图:

实现代码,示例如下:

srange.copy();  //将源选定范围复制到剪贴板   
range.pastespecial(excel.xlpastetype.xlpasteformats);  //特殊粘贴格式到目标选定范围

copy() 方法实现了复制所有数据到剪贴板功能,其中也包括了样式。 pastespecial() 方法实现了指定粘贴的功能,其中 excel.xlpastetype.xlpasteformats 表示只粘贴格式样式,至此实现了模拟格式刷的功能。 但此方法可能会引起多 excel 应用的复制冲突,因此相对保险的写法可以改成如下代码:

srange.copy(range);

但这样会有一个问题是,如果像模板输出还好,但想要仅粘贴格式则无法实现,因此也有局限性。而且这种实现原理,微软可能也会有所调整,也无法保障以后的应用是否会引起复制冲突。所以我们在下个小节通过自定义样式的方式来模拟格式刷的功能。

自定义样式

使用 com 操作的流程原理如下图:

示例代码如下:

string stylename = guid.newguid().tostring();
workbook xb=workbooks[1];
 
style newstyle = xb.styles.add(stylename);
 
 设置样式属性
newstyle.font.name = "宋体";
newstyle.font.size = 11;
newstyle.font.bold = true;
 
newstyle.borders.weight = xlborderweight.xlhairline;  //最细的线
newstyle.borders.linestyle = xllinestyle.xlcontinuous;  //实线

以上是添加样式的示例,因为样式很多,实现格式复制的简单方法,是创建新名称并直接引用源单元格的样式,应用到目标选范围上即可,如果有需要移除或修改的样式,可以继续对新建样式进行赋值,修改后如下代码示例:

string stylename = guid.newguid().tostring();
workbook xb=workbooks[1];
 
style newstyle = xb.styles.add(stylename);
 
newstyle = srange.style;  //将源选定范围样式赋值到自定义新建样式
 
newstyle.font.name="宋体"; //修改字体为宋体
 
range.style = newstyle.name;

直接赋值

range.style 是一个 dynamic 类型,可以赋予任何可以正确实现的类型,如自定义样式名称(newstyle.name),也可以直接赋值为 style 类型,简单而暴力,代码如下:

range.style = srange.style; //将源选定范围样式赋值到目标

完美方案

在实际的运行中,无论是自定义样式还是直接赋值模式,对复制字体时出现了无法复制的问题,因此还是需要结合自定义复制样式方法来弥补问题,代码如下:

public void copyrangestyle(excel.range srcrange,excel.range desrange)
{
 
	desrange.font.background=srcrange.font.background;
	desrange.font.bold=srcrange.font.bold;
	desrange.font.color=srcrange.font.color;
	desrange.font.italic=srcrange.font.italic;
	desrange.font.name=srcrange.font.name;
	desrange.font.outlinefont=srcrange.font.outlinefont;
	desrange.font.shadow=srcrange.font.shadow;
	desrange.font.size=srcrange.font.size;
	desrange.font.strikethrough=srcrange.font.strikethrough;
	desrange.font.underline=srcrange.font.underline;
 
	desrange.rowheight=srcrange.rowheight;
 
 
    desrange.horizontalalignment=srcrange.horizontalalignment;
	desrange.verticalalignment=srcrange.verticalalignment;
}

 copyrangestyle 自定义复制样式方法包括 源选定范围参数(excel.range srcrange)和目标选定范围参数(excel.range desrange),至此,完整代码可修整如下:

range.style = srange.style;
 
copyrangestyle(srange, range);

至此结合  copyrangestyle 方法完美解决样式复制问题。

copyrangestyle 方法请根据实际需要的样式进行扩充或调整。

小结

关于 range.borders 的com 操作如下图:

这个样式的设定是有点击顺序的,选边框后点击样式是无效的,需要点击样式再进行选边框的切换,才会得到预期效果。正常可通过 range.borders 直接表示所有6个框线的集合,直接为其赋值,如下代码:

newstyle.borders.weight = xlborderweight.xlhairline;  //最细的线
newstyle.borders.linestyle = xllinestyle.xlcontinuous;  //实线类型边框
newstyle.borders.color = color.red;  //红色边框

如果想只设置某一边框,则需要获取 borders 集合里的 border,如下几种方式都可以获取其中的某一个 border 对象:

 
//右、左、下、上边框
range.borders.get_item(xlbordersindex.xledgeright).linestyle = xllinestyle.xllinestylenone;
range.borders.get_item(xlbordersindex.xledgeleft).linestyle = xllinestyle.xlcontinuous;
range.borders.get_item(xlbordersindex.xledgebottom).linestyle = xllinestyle.xlcontinuous;
range.borders.get_item(xlbordersindex.xledgetop).linestyle = xllinestyle.xlcontinuous;
 
//内部交叉斜线
range.borders.item[xlbordersindex.xldiagonaldown].linestyle = xllinestyle.xllinestylenone;
range.borders[xlbordersindex.xldiagonalup].linestyle = xllinestyle.xllinestylenone;

我们可以使用 borders.get_item 方法或引用 item 索引或直接引用索引的方法得到 border,但实际的使用过程中,预期效果不理想,因此我们使用了样式赋值,类似格式刷的方法来解决。 

以上就是c#解决excel边框样式无法复制及格式刷功能的详细内容,更多关于c# excel边框样式无法复制的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com