实现Myxls设置行高的功能

转载 2012年03月23日 10:03:03

MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了。MyXLS已经实现了很多操作Excel的功能,但是作者好像2009年末就不再更新维护这个程序了,猜想可能是新版本office的文件格式操作起来更容易。我这里管不了这么多啊,还得继续用。

作者在程序中注释说将要实现自定义行高的功能,但是一等就是两年,还不知道猴年马月。还好程序是开源的,作者也给了提示,参考excelfileformat.pdf这个文档第196页,我把这个功能给实现了。

先看看效果如何:

myxls line height 实现MyXLS设置行高的功能

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

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为单位的。

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


相关文章推荐

实现MyXLS设置行高的功能

http://blog.bossma.cn/csharp/implement-myxls-custom-line-height/comment-page-1/#comment-10084   My...
  • e_wsq
  • e_wsq
  • 2012年04月19日 12:07
  • 393

实现MyXLS设置行高的功能

MyXLS是一个导出Excel的好工具,速度快,体积小,而且也不用担心使用Com生成Excel时资源释放的问题了。MyXLS已经实现了很多操作Excel的功能,但是作者好像2009年末就不再更新维护这...

MyXls导出Excel的各种设置

转发至:http://blog.bossma.cn/csharp/myxls-export-excel-option-list/ MyXls是一个操作Excel的开源类库,支持设置字体、列宽、行高(...

MyXls导出Excel的各种设置

MyXls是一个操作Excel的开源类库,支持设置字体、列宽、行高(由BOSSMA实现)、合并单元格、边框、背景颜色、数据类型、自动换行、对齐方式等。 本文将通过实例的方式详细说明如何通过各种属性设...

ASP.NET用MyXls实现Excel数据导出

如果你和我一样要实现不调用Excel组件实现Excel数据导出的话,那我严重向你推荐MyXls,MyXls是用C#开源项目,可以应用于asp.net 或者 .net应用程序上。它根据微软公开的Excl...

利用org.in2bits.MyXls.dll实现从服务器端下载EXCEL数据

前些天写了一篇JQGRID导出数据的文章,为什么在客户端实现,其实是被逼无奈,因为在服务器上安装EXCEL,然后配置DCOM一直不成功,老是不能成功调用服务器上的EXCEL应用程序,然后今天发现上次那...

.net 使用NPOI或MyXls把DataTable导出到Excel

Excel导入及导出问题产生:  从接触.net到现在一直在维护一个DataTable导出到Excel的类,时不时还会维护一个导入类。以下是时不时就会出现的问题:导出问题:  如果是asp.net,你...

无OFFICE datatable导出csv表格(execl格式)(附NPOI,MyXls 方法)

还是当初毕业设计的用的东西,正好翻出来了,在这里记下来。 当时有一个导出execl的功能,网上找了大多都是利用Office接口之类的解决方法,但无奈电脑没有安装Office,只有一个WPS系列(不得...

Asp.Net使用org.in2bits.MyXls.dll操作excel的应用!(转)

效果: 首先下载org.in2bits.MyXls.dll(自己的在~\About ASP.Net\Asp.Net操作excel),然后添加引用; 添加命名空间: using org.in2...

MyXls导出Excel时在Web页即时生成原生Excel文件

关于MyXls生成Excel文件,本文不赘述。本文主要介绍在Web条件下利用MyXls即时生成原生Excel的方法。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现Myxls设置行高的功能
举报原因:
原因补充:

(最多只允许输入30个字)