• 实现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框架

    点击这里:下载

  • 相关阅读:
    给vs2012轻松换肤
    几种软件常用授权方式总结
    Discuz X2多人斗地主[消耗论坛积分]小体积版本,仅25MB!
    关于Socket 设置 IPAddress.Any 情况下,出现服务器积极拒绝的问题
    以前看过一个压缩过的.exe,运行会播放长达半小时的动画,却只有60KB,个人认为其中的原理
    VisualSvn Server安装和使用
    socket短时间内重连需注意的问题
    PostgreSQL在何处处理 sql查询之十一
    PostgreSQL在何处处理 sql查询之十三
    PostgreSQL在何处处理 sql查询之十四
  • 原文地址:https://www.cnblogs.com/coolsundy/p/5868413.html
Copyright © 2020-2023  润新知