python中openpyxl表格行数 openpyxl设置行高
转载
MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了。但是作者提供的代码没有设置行高
要实现这个效果,首先需要修改两个文件:
1、Row.cs
添加行高的属性。
private ushort _rowHeight;
|
/// Gets the row index of this Row object.
|
get { return _rowHeight; }
|
set { _rowHeight = value; }
|
在构造函数中设置默认值:
2、RowBlocks.cs
在生成字节时,将这个高度设置进去。
在private static Bytes ROW(Row row)方法中,大约150行左右。
注释掉原来的:
bytes.Append( new byte [] { 0x08, 0x00 });
|
修改为:
if (row.RowHeight > 32767)
|
throw new ApplicationException( "Row height can not greater than 32767." );
|
bytes.Append(BitConverter.GetBytes(row.RowHeight));
|
注释掉:
bytes.Append( new byte [] {0x00, 0x01, 0x0F, 0x00});
|
替换为:
//6 1 Row height and default font height do not match
|
bytes.Append( new byte [] { 0xC0, 0x01, 0x0F, 0x00 });
|
这样保存修改,重新生成类库,重新添加到网站引用。
下边看看怎么用:
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
protected void ExportBtn_Click( object sender, EventArgs e)
|
XlsDocument xls = new XlsDocument();
|
xls.FileName = "TestList.xls" ;
|
Worksheet sheet = xls.Workbook.Worksheets.Add( "测试表" ); //Sheet名称
|
Cells cells = sheet.Cells;
|
Cell cell = cells.Add(1, 1, "编号" );
|
cell = cells.Add(1, 2, "名称" );
|
sheet.Rows[1].RowHeight = 18 * 20;
|
foreach (DataRow row in table.Rows)
|
cells.Add(rowIndex, 1, rowIndex);
|
cells.Add(rowIndex, 2, "名称" +rowIndex);
|
在添加标题行cell之后,添加了一行:
sheet.Rows[1].RowHeight = 18 * 20;
|
这一行必须写在添加完cell之后,因为添加cell的时候才会自动创建一个Row对象,之前是没有这个对象的,当然不能设置高度。
这样就可以设置行高了,是不是很简单。
可是我还想让行高的设置方式更优雅一些,就像设置列的宽度一样,比如设置列:
ColumnInfo col1 = new ColumnInfo(xls, sheet); //生成列格式对象
|
col1.ColumnIndexStart = 0; //起始列为第1列
|
col1.ColumnIndexEnd = 0; //终止列为第1列
|
col1.Width = 8 * 256; //列的宽度计量单位为 1/256 字符宽
|
sheet.AddColumnInfo(col1); //把格式附加到sheet页上
|
这样就可以设置第一列的宽度,这段程序放在添加cell前后都没有任何问题,而且可以设置一个列的范围,不用一个个设置。
就仿造这个模式,创建一个RowInfo:
using System.Collections.Generic;
|
namespace org.in2bits.MyXls
|
/// Describes a range of rows and properties to set on those rows (column height, etc.).
|
private ushort _rowHeight;
|
private ushort _rowIdxStart = 0;
|
private ushort _rowIdxEnd = 0;
|
/// Gets or sets height of the rows.
|
get { return _rowHeight; }
|
set { _rowHeight = value; }
|
/// Gets or sets index to first row in the range.
|
public ushort RowIndexStart
|
get { return _rowIdxStart; }
|
if (_rowIdxEnd < _rowIdxStart)
|
_rowIdxEnd = _rowIdxStart;
|
/// Gets or set index to last row in the range.
|
public ushort RowIndexEnd
|
get { return _rowIdxEnd; }
|
if (_rowIdxStart > _rowIdxEnd)
|
_rowIdxStart = _rowIdxEnd;
|
这个类有三个属性:行高、起始行索引、结束行索引。
还需要一个方法附加到sheet页上。
在Worksheet类中添加一个私有变量:
private readonly List<RowInfo> _rowInfos = new List<RowInfo>();
|
然后添加一个方法用于添加RowInfo到集合中:
/// Adds a Row Info record to this Worksheet.
|
/// <param name="rowInfo">The RowInfo object to add to this Worksheet.</param>
|
public void AddRowInfo(RowInfo rowInfo)
|
下一步要在生成字节码之前设置相关行的高度,修改属性:internal Bytes Bytes,大约在252行左右:
int rowsCount = Rows.Count;
|
for ( ushort i = 1; i <= Rows.Count; i++)
|
foreach (RowInfo rowInfo in _rowInfos)
|
if (rowInfo.RowIndexStart <= i && rowInfo.RowIndexEnd >= i)
|
Rows[i].RowHeight = rowInfo.RowHeight;
|
在get中最前面遍历行设置行高,这里也许可以优化下效率,有兴趣的看看吧。
现在保存所有文件,重新编译,重新引用。
现在再来看看怎么设置行高:
RowInfo rol1 = new RowInfo();
|
rol1.RowHeight = 16 * 20;
|
从第3行到第10行,行高都是16。行高是以1/20 point为单位的。
现在有两种方法设置行高了,强大吧。
我把编译好的DLL提供下载,原版本是.net2.0的框架,我改成了.net4.0框架
点击这里:下载
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。