MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了。但是作者提供的代码没有设置行高

要实现这个效果,首先需要修改两个文件:

1、Row.cs

添加行高的属性。

private ushort _rowHeight;

 

/// <summary>

/// Gets the row index of this Row object.

/// </summary>

public ushort RowHeight

{

get return _rowHeight; }

set { _rowHeight = value; }

}

在构造函数中设置默认值:

public Row()

{

_minCellCol = 0;

_maxCellCol = 0;

_rowHeight = 280;

}

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.");

}

else

{

bytes.Append(BitConverter.GetBytes(row.RowHeight));

}

注释掉:

bytes.Append(new byte[] {0x00, 0x01, 0x0F, 0x00});

替换为:

//Bit Value

//7   1

//6   1      Row height and default font height do not match

//5   0

//4   0

//2-0 0

bytes.Append(new byte[] { 0xC0, 0x01, 0x0F, 0x00 });

这样保存修改,重新生成类库,重新添加到网站引用。

下边看看怎么用:

/// <summary>

/// 导出Excel

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

protected void ExportBtn_Click(object sender, EventArgs e)

{

XlsDocument xls = new XlsDocument();

xls.FileName = "TestList.xls";

 

int rowIndex = 1;

Worksheet sheet = xls.Workbook.Worksheets.Add("测试表");//Sheet名称

 

Cells cells = sheet.Cells;

Cell cell = cells.Add(1, 1, "编号");

cell.Font.Bold = true;

cell = cells.Add(1, 2, "名称");

cell.Font.Bold = true;

 

sheet.Rows[1].RowHeight = 18 * 20;

 

foreach (DataRow row in table.Rows)

{

cells.Add(rowIndex, 1, rowIndex);

cells.Add(rowIndex, 2, "名称"+rowIndex);

 

rowIndex++;

}

xls.Send();

}

在添加标题行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;

using System.Collections.Generic;

using System.Text;

 

namespace org.in2bits.MyXls

{

/// <summary>

/// Describes a range of rows and properties to set on those rows (column height, etc.).

/// </summary>

public class RowInfo

{

private ushort _rowHeight;

private ushort _rowIdxStart = 0;

private ushort _rowIdxEnd = 0;

 

/// <summary>

/// Gets or sets height of the rows.

/// </summary>

public ushort RowHeight

{

get return _rowHeight; }

set { _rowHeight = value; }

}

 

/// <summary>

/// Gets or sets index to first row in the range.

/// </summary>

public ushort RowIndexStart

{

get return _rowIdxStart; }

set

{

_rowIdxStart = value;

if (_rowIdxEnd < _rowIdxStart)

_rowIdxEnd = _rowIdxStart;

}

}

 

/// <summary>

/// Gets or set index to last row in the range.

/// </summary>

public ushort RowIndexEnd

{

get return _rowIdxEnd; }

set

{

_rowIdxEnd = value;

if (_rowIdxStart > _rowIdxEnd)

_rowIdxStart = _rowIdxEnd;

}

}

}

}

这个类有三个属性:行高、起始行索引、结束行索引。

还需要一个方法附加到sheet页上。

在Worksheet类中添加一个私有变量:

private readonly List<RowInfo> _rowInfos = new List<RowInfo>();

然后添加一个方法用于添加RowInfo到集合中:

/// <summary>

/// Adds a Row Info record to this Worksheet.

/// </summary>

/// <param name="rowInfo">The RowInfo object to add to this Worksheet.</param>

public void AddRowInfo(RowInfo rowInfo)

{

_rowInfos.Add(rowInfo);

}

下一步要在生成字节码之前设置相关行的高度,修改属性:internal Bytes Bytes,大约在252行左右:

get

{

//Set row height

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;

break;

}

}

}

 

....

 

}

在get中最前面遍历行设置行高,这里也许可以优化下效率,有兴趣的看看吧。

现在保存所有文件,重新编译,重新引用。

现在再来看看怎么设置行高:

RowInfo rol1 = new RowInfo();

rol1.RowHeight = 16 * 20;

rol1.RowIndexStart = 3;

rol1.RowIndexEnd =10;

sheet.AddRowInfo(rol1);

从第3行到第10行,行高都是16。行高是以1/20 point为单位的。

现在有两种方法设置行高了,强大吧。

 

我把编译好的DLL提供下载,原版本是.net2.0的框架,我改成了.net4.0框架

点击这里:下载