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

点击这里:下载

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

  1. DataGridView设置行高

    .Net中DataGridView控件如何设置行高 在DataGridView控件中,默认的行高很大,而标题头的行高却很小,感觉很不匀称. 标题头的行高比较好设置需要修改两个属性1修改ColumnHe ...

  2. 闲记 单元格与单元格之间的边 ///字体属性都是font开头,除了颜色属性 ///文本属性都是text开的,除了设置行高。

    这两天一直在做网页没有什么太大的问题,期间也考了一场试,对答案的时候老师讲了一些小知识,因此来记录一下. 单元格与单元格之间的边距(cellspaling) list-type-image可以使用图像 ...

  3. angularjs ui-grid如何动态设置行高

    自己开发的公众号,可以领取淘宝内部优惠券 在用ui-grid的时候我们可以用rowHeight设置行高,可是每一行的高度都是一样的,无法根据行内的内容进行自适应.如下图 为了解决这个问题,google ...

  4. 给GridView设置行高

    近期在工作中遇到了这样一个问题,使用一个GridView展示数据,item中仅仅是一个TextView,可是里面显示的文字多少不固定多少,必须所有展示出来. 遇到的问题: 1.把item中的宽和高设置 ...

  5. 如何给HTML页面设置行高

    设置行高 由于简单还是老样子直接上代码了哦,注意:line-height属性值可以使用固定值如:20px..和百分比如:20%. 如果想让文字垂直居中如下:行高的主要作用是用来设置文本的垂直方向居中对 ...

  6. Nopi 导出设置行高

    1.导出excel行显示不完整数据客户不满意,需要我们处理 ; rowNum <= sheet.LastRowNum; rowNum++) { HSSFRow currentRow = shee ...

  7. 实现jsp网页设为首页功能

    var url = location.href; var browser_name = navigator.userAgent; if(browser_name.indexOf('Chrome')!= ...

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

    在项目中遇到input的placeholder在safari下设置行高失效的问题,亲测 input{ width:250px; height:30px; line-height:30px; font- ...

  9. 20190316xlVba_设置行高的改进方案

    Public Sub AutoSetRowHeight(ByVal sht As Worksheet, Optional RowsInOnePage As Long) Dim BreakRow As ...

随机推荐

  1. XCode8目录整理后的几个警告消除,Missing file

    Git目录没有及时更新导致 终端进入目录运行如下命令 git rm main.m git rm Info.plist git rm AppDelegate.h git rm AppDelegate.m ...

  2. 使用 Git Hooks 实现自动项目部署

    最近在某服务器上面搭建 git 开发和部署环境,git 开发环境很简单,按照 ProGit 一书的相关知识就可以轻松搞定,实现了类似 Github 的使用 SSH + 私有 Clone 的方式. 关于 ...

  3. MAC 常用命令

    杀死占用某个端口的进程 命令 lsof -i tcp:port  port换成端口号可以查看端口是被哪个程序占用   -->    kill -9 pid   杀死进程

  4. 最小生成树(prim&kruskal)

    最近都是图,为了防止几次记不住,先把自己理解的写下来,有问题继续改.先把算法过程记下来: prime算法:                  原始的加权连通图——————D被选作起点,选与之相连的权值 ...

  5. 循环获取DataTable

    DataTable ddtt = tq.Table("); string strName = ""; //DataTable ddtt = dataSet.Tables[ ...

  6. 常用的HTML代码

    一.文字1.标题文字 <h#>..........</h#> #=1~6:h1为最大字,h6为最小字 2.字体变化 <font>..........</fon ...

  7. .Net中Remoting通信机制

    Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可以将其看作是一种分布式处理方式. 从微软的产品角度 ...

  8. 清理SYSAUX表空间

    1.查看SYSAUX表空间中数据分布情况 col SEGMENT_NAME for a30 set lines 999 select * from (select segment_name,PARTI ...

  9. 数据分析(9):DataFrame介绍

    DataFrame 表格型的数据结构 创建DataFrame 可以通过传入dict的方式,DataFrame会自动加上索引,并且列会有序排列 data = {'state':['a', 'b', 'c ...

  10. 设置CentOS不启用图形界面

    由于linux服务器放在机房长时间运行,或者只是在后台运行,一般通过secureCRT连接服务器: 所以在虚拟机上都不需要图形界面,而且图形界面占用内存. 所以,我们可以通过简单的设置,让linux只 ...