[发现在使用EPPlus v4(v4.5.3.3)插入> 1024行时,新插入的行下的单元格中的公式已损坏,并且原来的一行消失了。
不幸的是,EPPlus v4 git在v5中从LGPL转换为商业许可模型时已被归档。
在NPOI上进行试用,由于缺少一些关键功能(例如ShiftColumn / DeleteColumn,并且不能使用表支持Excel,不使用公式,使用ConditionalFormatting且不支持MSExcel添加的向后兼容属性,因此无法选择它) 。
任何人EPPlus v4用户都面临同样的情况,并找到了一个好的解决方案?
在获得更好的答案之前,这是一种解决方法,我在这种情况下使用了扩展方法:
/// <summary>
/// Providing Extensions to EPPlus/Excel
/// </summary>
public static class EPPlusExcelUtil
{
public const int EPPlusMaxRowInsertPerAction = 1024;
/// <summary>
/// This is a workaround to handle the case inserting > 1024 rows.
/// <remarks>EPPlus v4 issue until v4.5.3.3</remarks>
/// </summary>
/// <param name="ws"></param>
/// <param name="rowFrom">The position of the new row</param>
/// <param name="rows">Number of rows to insert.</param>
/// <param name="copyStylesFromRow">Copy Styles from this row. Applied to all inserted rows</param>
public static void InsertRowEnhanced(this ExcelWorksheet ws, int rowFrom, int rows, int copyStylesFromRow = 0)
{
int batchOf1k = rows / EPPlusMaxRowInsertPerAction;
for (int i = 0; i < batchOf1k; i++)
{
ws.InsertRow(rowFrom, EPPlusMaxRowInsertPerAction, copyStylesFromRow);
}
int rowsToInsertAfter1k = rows % EPPlusMaxRowInsertPerAction;
if (rowsToInsertAfter1k != 0)
{
ws.InsertRow(rowFrom, rowsToInsertAfter1k, copyStylesFromRow);
}
}
}