当前位置:  开发笔记 > 编程语言 > 正文

在EPPlus C#中展开一个表

如何解决《在EPPlusC#中展开一个表》经验,为你挑选了2个好方法。

有什么方法可以在C#中扩展EPPlus中的现有表.我的程序的工作方式是我创建只有2行的表,并继续添加更多.我似乎无法找到任何类型的调整大小方法ExcelTable.是否有专门的方法,或者我需要使用某种替代方案?

编辑: 好的,我只想澄清一下. 我已经有EPPlus工作并制作ExcelTable.我的问题是:如何使现有的ExcelTable更大(添加更多行)?



1> Ernie S..:

不幸的是,没有直接的方法.不太清楚为什么,但EPPlus的开发人员选择ExcelTable.Address仅使该属性准备好.所以最明显的选择是创建一个新表,复制所有属性(假设你知道所有需要的属性)并删除旧的属性.不太理想,因为你可能会错过一些东西.

但我看到另外两个 - 接下来完全相当,但比复制/删除更好.假设一个像这样的表:

在此输入图像描述

选项1您可以分叉EPPlus源代码并使属性需要读/写.您可以ExcelTable.cs通过更改以下内容在文件中执行此操作

    public ExcelAddressBase Address
    {
        get
        {
            return _address;
        }
        internal set  //REMOVE internal KEYWORD
        {
            _address = value;
            SetXmlNodeString("@ref",value.Address);
            WriteAutoFilter(ShowTotal);
        }
    }

删除internal关键字.但是当然你必须小心这样做,不要在途中打破别的东西.有了这个,你可以做类似的事情:

var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx");

using (var pck = new ExcelPackage(fileInfo))
{
    var workbook = pck.Workbook;
    var worksheet = workbook.Worksheets.First();

    //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows)
    worksheet.Cells["A12"].Value = 10;
    worksheet.Cells["B12"].Value = 100;
    worksheet.Cells["C12"].Value = Path.GetRandomFileName();

    var tbl = worksheet.Tables["TestTable1"];
    var oldaddy = tbl.Address;
    var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column);

    tbl.Address = newaddy;

    pck.Save();
}

选项2将是更安全的选项,但通过在XML上使用字符串替换大多数"脏".我们不能假设只有一个地址引用,因为,例如,AutoFilter可以打开.以下是在excel中创建表时默认XML的样子(请注意对地址的2个引用):



    
        
        
        
    
    

所以我们可以像这样做一个字符串替换:

var fileInfo = new FileInfo(@"c:\temp\Expand_Table.xlsx");

using (var pck = new ExcelPackage(fileInfo))
{
    var workbook = pck.Workbook;
    var worksheet = workbook.Worksheets.First();

    //Added 11th data row assuming the table is from A1 to C11 (Header row + 10 data rows)
    worksheet.Cells["A12"].Value = 10;
    worksheet.Cells["B12"].Value = 100;
    worksheet.Cells["C12"].Value = Path.GetRandomFileName();

    var tbl = worksheet.Tables["TestTable1"];
    var oldaddy = tbl.Address;
    var newaddy = new ExcelAddressBase(oldaddy.Start.Row, oldaddy.Start.Column, oldaddy.End.Row + 1, oldaddy.End.Column);

    //Edit the raw XML by searching for all references to the old address
    tbl.TableXml.InnerXml = tbl.TableXml.InnerXml.Replace(oldaddy.ToString(), newaddy.ToString());

    pck.Save();
}



2> ZorgoZ..:

这个问题大约有一年了,但希望有人仍然需要答案,有一个直接的解决方案,虽然因为EEPlus中的一个错误而没有完成(我正在使用v4.1).

ExcelWorksheet具有InsertRow(Int32,Int32,Int32)方法.如果在作为表的一部分的区域中插入行,则表也会展开.只需使用它的Address属性即可获得边界.只需确保在表格的第一行和最后一行之间插入.

我知道有关细胞验证的缺陷:即使您使用可以从现有行复制样式的重载,也不会复制验证.更糟糕的是,验证保留在原来的位置,并且不随细胞移动.我没有测试过,但我相信如果验证有一个范围而不是一个单元格作为目标,那么如果你在这个范围内插入行,那么它也会被扩展.

如果您希望在工作表中展开数据表,那么这对您没有帮助 - 但您仍然可以移动行.当你有很多桌子并排(这是一场噩梦)时也是如此.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有