【问题标题】:EPPlus: Deleting column not workingEPPlus:删除列不起作用
【发布时间】:2015-07-27 22:36:24
【问题描述】:

我尝试使用 EPPlus 使用以下解决方案删除工作表中的列:How to remove a column from excel sheet in epplus

但是,当我运行此单元测试时,第 2 列中的数据会被清除。如何完全删除一列?

【问题讨论】:

  • 也许您应该考虑向我们提供您尝试过的内容的 sn-p。
  • 我使用了单元测试解决方案:stackoverflow.com/questions/28359165/… 特别是 ws.DeleteColumn(2) 只是清除了第 2 列中的所有数据,但不删除列本身。

标签: epplus


【解决方案1】:

这很有趣。似乎在 4.0.0 中添加了它,然后用 4.0.4 版本打破了它:

http://epplus.codeplex.com/workitem/15310

如果你急了,你可以下载源代码并回到DeleteColumn函数的原始版本(在ExcelWorksheet.cs中)并重新编译:

public void DeleteColumn(int columnFrom, int columns)
{
    lock (this)
    {
        ExcelColumn col = _values.GetValue(0, columnFrom) as ExcelColumn;
        if (col == null)
        {
            var r = 0; 
            var c = columnFrom;
            if(_values.PrevCell(ref r,ref c))
            {
                col = _values.GetValue(0, c) as ExcelColumn;
                if(col._columnMax >= columnFrom)
                {
                    col.ColumnMax=columnFrom-1;
                }
            }
        }

        _values.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);
        _types.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);
        _formulas.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);
        _styles.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);
        _flags.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);
        _commentsStore.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);
        _hyperLinks.Delete(1, columnFrom, ExcelPackage.MaxRows, columns);

        AdjustFormulasColumn(columnFrom, columns);
        FixMergedCellsColumn(columnFrom, columns, true);

        var csec = new CellsStoreEnumerator<object>(_values, 0, columnFrom, 0, ExcelPackage.MaxColumns);

        foreach (var column in csec)    
        {
            if (column is ExcelColumn)
            {
                var c = (ExcelColumn)column;
                if (c._columnMin >= columnFrom)
                {
                    c._columnMin -= columns;
                    c._columnMax -= columns;
                }
            }
        }

        foreach (var tbl in Tables)
        {
            if (columnFrom > tbl.Address.Start.Column && columnFrom <= tbl.Address.End.Column)
            {
                var node = tbl.Columns[0].TopNode.ParentNode;
                var ix = columnFrom - tbl.Address.Start.Column + 1;
                for (int i = 0; i < columns; i++)
                {
                    if (node.ChildNodes.Count > ix)
                    {
                        node.RemoveChild(node.ChildNodes[ix]);
                    }

                } 
                tbl._cols = new ExcelTableColumnCollection(tbl);
            }

            tbl.Address = tbl.Address.DeleteColumn(columnFrom, columns);
        }
    }
} 

【讨论】:

  • 感谢您的回复。我恢复到 4.0.3,它现在可以工作了。我会等到下一个版本再升级。
  • @RussellBoada 没问题。请记住将问题设为已回答,这样它就不会挂在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
相关资源
最近更新 更多