如何使用EPPlus在多个工作表上编写

时间:2015-07-09 14:07:03

标签: c# excel epplus

我使用以下代码段使用EPPlus将一些数据写入excel文件。我的应用程序进行了一些大数据处理,因为excel有大约100万行的限制,空间不时会耗尽。所以我想要实现的是,一旦检测到System.ArgumentException : row out of range或换句话说......工作表中没有剩余空间..剩余的数据将写在同一工作簿的第二个工作表中。我尝试了以下代码但尚未成功。任何帮助将不胜感激!

  try
                            {

                                for (int i = 0; i < data.Count(); i++)
                                {
                                    var cell1 = ws.Cells[rowIndex, colIndex];
                                    cell1.Value = data[i];
                                    colIndex++;
                                }
                                rowIndex++;
                            }
                            catch (System.ArgumentException)
                            {
                                for (int i = 0; i < data.Count(); i++)
                                {
                                    var cell2 = ws1.Cells[rowIndex, colIndex];
                                    cell2.Value = data[i];
                                    colIndex++;

                                }
                                rowIndex++;
                            }

1 个答案:

答案 0 :(得分:2)

You shouldnt use a catch to handle that kind of logic - it is more for a last resort. Better to engineer you code to deal with your situation since this is very predictable.

The excel 2007 format has a hard limit of 1,048,576 rows. With that, you know exactly how many rows you should put before going to a new sheet. From there it is simple for loops and math:

[TestMethod]
public void Big_Row_Count_Test()
{
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
    if (existingFile.Exists)
        existingFile.Delete();

    const int maxExcelRows = 1048576;

    using (var package = new ExcelPackage(existingFile))
    {
        //Assume a data row count
        var rowCount = 2000000;

        //Determine number of sheets
        var sheetCount = (int)Math.Ceiling((double)rowCount/ maxExcelRows);

        for (var i = 0; i < sheetCount; i++)
        {
            var ws = package.Workbook.Worksheets.Add(String.Format("Sheet{0}", i));
            var sheetRowLimit = Math.Min((i + 1)*maxExcelRows, rowCount);

            //Remember +1 for 1-based excel index
            for (var j = i * maxExcelRows + 1; j <= sheetRowLimit; j++)
            {
                var cell1 = ws.Cells[j - (i*maxExcelRows), 1];
                cell1.Value = j;
            }
        }

        package.Save();
    }
}