这很有趣。似乎在 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);
}
}
}