实现Myxls设置行高的功能(转)

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框架

点击这里:下载

时间: 2024-10-09 06:59:27

实现Myxls设置行高的功能(转)的相关文章

给GridView设置行高

近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来. 遇到的问题: 1.把item中的宽和高设置match_parent,还是设置成wrap_content,当内容过多的时候,会覆盖下一行的显示的内容. 2.没有一个属性能够给GridView设置行高,那么高度就不能控制. 遇到的问题展示:.期望 想到的解决的方法是: 设计思路:1.先把TextView的高度,获取出来 2.把高度存到全局变量中

DataGridView设置行高

.Net中DataGridView控件如何设置行高 在DataGridView控件中,默认的行高很大,而标题头的行高却很小,感觉很不匀称. 标题头的行高比较好设置需要修改两个属性1修改ColumnHeadersHeader 设置为你想要的高度,比如20:但这时候自动变回来.2修改ColumnHeadersHeaderSize属性为 EnableResizing,不要为AutoSize.行高的设置:RowTemplate属性下的Height 属性. 其实.Net设置的很完美了,就是有的属性不容易找

自绘ListCtrl -- 设置行高

以下是通过重载DramItem()方法来实现自绘, 故需要设置ListCtrl控件属性"Owner Draw Fixed"为TRUE,"Owner Data"为FALSE(默认为FLASE); 1.  准备工作 (1).新建一个MFC类CMyListCtrl,其基类为CListCtrl, (2).将ListCtrl控件属性"Owner Draw Fixed"设置为TRUE,"Owner Data"设置为FALSE(默认为FLA

在safari下input的placeholder设置行高失效

在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font-size:14px; padding:0px 0px 0px 30px; [;line-height:1;color:#f00;] } 单独针对Safari来写hack 原文地址:https://www.cnblogs.com/guoliping/p/9798703.html

iOS UILabel 设置行高

UILabel *tileLabel = [[UILabel alloc] init]; tileLabel.numberOfLines = 0; tileLabel.backgroundColor = [UIColor clearColor]; tileLabel.text = @"调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整行间距云头调整

给博客园的博客文章设置行高,让博客文字不再拥挤

若使用博客园模板的默认样式,文字是相当拥挤的.如下图: 解决办法: [1]点击导航下的[管理] [2]进入后台界面后,点击[设置] [3]进入设置界面后,找到[页面定制CSS代码],并进行如下输入: #cnblogs_post_body p { line-height: 2; } [4]代码输入完成后,在页尾处找到[保存],并点击 [5]处理之后,文字终于有了行高. [6]当然,还可以通过控制台查看标签,进行进一步的样式设置. 但如果仅要求增加文章行高的话,就是以上操作……

常规问题(标签默认边距,文字设置行高)

1.body标签存在默认的margin:8px; 其他的标签也会在不同的浏览器中存在默认的margin,padding,所以在进行页面开发是需要在css中将可能用到的标签重置默认值: margin:0,:padding:0; 2.容器定义了height之后,容器边框的外形就确定了,不会被内容撑大,不要轻易给容器定义height.(网上说ie会被内容撑开,实验后仍旧是不会被撑开)

不设置行高,文字水平垂直居中显示

利用display:table-cell; 表格 <body> <div class="box">爆款推荐</div> <br/> <div class="box">满199减20</div> <br/> <div class="box">满赠</div> </body> .box { width:60px; height:60

【转】phpcms v9的ckeditor加入给内容调整行高

今天公司一客户要求一同事给ckeditor加入可以设置行高的功能(他后台是用织梦做的,他是织梦的FANS),我一时闲得慌,也想给咱家的v9加入这个功能,功夫不负有心啊,终于成功了,来给大家分享一下! 首先下载lineheight插件,我已经上传附件给大家了 第二步:在v9的与phpcms同级的目录找到statics/js/ckeditor/plugins这个目录:再把lineheight插件解压到这个目录! 第三步:找到statics/js/ckeditor/config.js修改如下: CKE