初级代码游戏的专栏介绍与文章目录-CSDN博客
我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
前一篇VSTO(C#)Excel开发2:Excel对象模型和基本操作-CSDN博客
前一篇我们已经知道可以获取行和列的集合并得到行和列的个数,但是还没有注意到行和列竟然是Range对象。什么都是Range这一点埋下了很多坑。
本篇我们来设置列宽和行高。
目录
一、确认UsedRange
1.1 编写测试代码
2.2 Range的几个属性
2.3 运行测试
二、设置列宽和行高
2.1 编写测试代码
2.2 Range相关的属性
2.3 WorkSheet获取行和列
2.4 运行测试
三、自动调整列宽和行高
一、确认UsedRange
1.1 编写测试代码
我们已经知道UsedRange是用到的范围,但是没有内容的单元格算不算呢?
我们来用程序验证一下,就像第一篇的操作一样,先增加一个按钮“button2”:
在设计器双击按钮生成按钮的事件代码,然后添加内容如下:
private void button2_Click(object sender, RibbonControlEventArgs e)
{
string str = "开始操作。。。。。。\n";
try
{
Range usedRange = Globals.ThisAddIn.Application.ActiveSheet.UsedRange;
str += " UsedRange:" + usedRange.Address + "\n";
str += " UsedRange.Column:" + usedRange.Column + "\n";
str += " UsedRange.Columns.Count:" + usedRange.Columns.Count + "\n";
str += " UsedRange.Row:" + usedRange.Row + "\n";
str += " UsedRange.Rows.Count:" + usedRange.Rows.Count + "\n";
str += "操作成功完成\n";
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
MessageBox.Show(str);
}
2.2 Range的几个属性
- Address 单元格范围
- Column 第一个列的编号(从1开始)
- Columns 列的集合(Range),Columns.Count即列的个数
- Row 第一个行的编号(从1开始),Rows.Count即行的个数
2.3 运行测试
编译运行,新建空工作簿,执行button2:
虽然新建空工作簿什么都没有,UsedRange返回的是第一个单元格。
然后我们执行一下button1,这个按钮会自动生成一些内容,然后再执行button2:
现在显示的范围是A1到C10,符合预期。
再选中左上角的几个单元格:
按一下键盘的“del”键删除,然后再执行buffton2:
删掉的单元格没有出现在UsedRange里。
现在我们给一个空单元格加上边框:
再执行button2:
现在设置格式的格子也在UsedRange里面了。再改回无边框也没用,还是在UsedRange里面。
实测拉宽列不会导致列出现在UsedRange里。
二、设置列宽和行高
2.1 编写测试代码
将刚才的代码增加点内容,替换成如下代码:
private void button2_Click(object sender, RibbonControlEventArgs e)
{
string str = "开始操作。。。。。。\n";
try
{
Worksheet worksheet = Globals.ThisAddIn.Application.ActiveSheet;
Range usedRange = worksheet.UsedRange;
str += " UsedRange:" + usedRange.Address + "\n";
str += " UsedRange.Column:" + usedRange.Column + "\n";
str += " UsedRange.Columns.Count:" + usedRange.Columns.Count + "\n";
str += " UsedRange.Row:" + usedRange.Row + "\n";
str += " UsedRange.Rows.Count:" + usedRange.Rows.Count + "\n";
for (int i = 0; i < usedRange.Columns.Count; ++i)
{
Range colum = worksheet.Columns[usedRange.Column + i];
colum.ColumnWidth = 15;
}
for (int i = 0; i < usedRange.Rows.Count; ++i)
{
Range row = worksheet.Rows[usedRange.Row + i];
row.RowHeight = 30;
}
str += "操作成功完成\n";
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
MessageBox.Show(str);
}
增加了设置列宽和行高的代码。
2.2 Range相关的属性
- ColumnWidth 列宽,以标准字符宽度为单位(大概就是英文字符的意思吧),设置时全部设置为同一值,获取时如果不一致返回空(这谁想出来的啊?)
- RowHeight 行高,以像素为单位(这又是谁想出来的啊,宽和高的单位不一样),坑是一样的,如果多个行的行高不一致返回空
2.3 WorkSheet获取行和列
- Columns[i],i是基于1的索引
- Rows[i],i是基于1的索引
2.4 运行测试
编译运行,先执行button1再执行button2:
看到有数据的区域的宽和高都修改了。
三、自动调整列宽和行高
使用Range的AutoFit方法即可,按照官方文档是设置列宽“或”设置行高,我直接替换上面的代码,因此只是对单一列或单一行操作,都是有效的。
代码如下:
for (int i = 0; i < usedRange.Columns.Count; ++i)
{
Range colum = worksheet.Columns[usedRange.Column + i];
colum.ColumnWidth = 15;//被下一句覆盖
colum.AutoFit();
}
for (int i = 0; i < usedRange.Rows.Count; ++i)
{
Range row = worksheet.Rows[usedRange.Row + i];
row.RowHeight = 30;//被下一句覆盖
row.AutoFit();
}
动手拉拉宽度,再执行能更清楚地看到效果。
(这里是文档结束)