如何使用 Syncfusion.XlsIO 在 C# 中将多个 Excel 文件合并为一个文件和一个工作表

问题描述 投票:0回答:1

我循环源文件,打开文件和唯一的工作表,获取源范围作为工作表使用范围,设置后续目标范围,并将其添加到目标工作簿并保存。

当某些文件无法准确确定行数变高时的数字后,我遇到异常

System.ArgumentOutOfRangeException:

在行

IRange destinationRange = destinationWorksheet.Range[currentDestFirstRow,currentDestFirstCol, currentDestLastRow, currentDestLastCol];

具有以下值

destination range=[1037502,1,1047586,6]

如果我在某些文件后停止循环,一切都会顺利,并且目标文件会正确生成。

注意范围参数是 int 我没有发现任何超出范围的原因。

感谢您的建议

public Test()
{
    Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("my_key");
    destinationFile = outputDataPath + "__merged.xlsx";

    // get list of file to merge
    filesToMerge = Directory.GetFiles(this.inputDatapath, "*.xlsx");

    using (ExcelEngine excelEngine = new ExcelEngine())
    {
        IApplication application = excelEngine.Excel;
        application.DefaultVersion = ExcelVersion.Excel2013;
        /* set destination  workbook and worksheet
         * initialize destination Range
         */ 
        IWorkbook destinationWorkbook = application.Workbooks.Create(1);
        IWorksheet destinationWorksheet = destinationWorkbook.Worksheets[0];

        int currentDestFirstRow = 1;
        int currentDestFirstCol = 1;
        int currentDestLastRow = 1;
        int currentDestLastCol;

        string currentFile;

        for (int i = 0; i < filesToMerge.Length - 1; i++)
        {
            /* get used range from worksheet of each input file
             * and copy to destination*/
            currentFile = filesToMerge[i];

            FileStream currentStream = new FileStream(currentFile, FileMode.Open, FileAccess.Read);
            IWorkbook currentWorkbook = application.Workbooks.Open(currentStream, ExcelOpenType.Automatic);
            IWorksheet currentWorksheet = currentWorkbook.Worksheets[0];
            IRange currentSourceRange = currentWorksheet.UsedRange;

            if (i == 0)
            {
                currentDestFirstRow = 1;
                currentDestFirstCol = 1;
                currentDestLastRow = currentSourceRange.LastRow;
                currentDestLastCol = currentSourceRange.LastColumn;
            }
            else
            {
                currentDestFirstRow = currentDestLastRow + 1;
                currentDestFirstCol = 1;
                currentDestLastRow = currentDestFirstRow + currentSourceRange.LastRow;
                currentDestLastCol = currentSourceRange.LastColumn;
            }

            IRange destinationRange = destinationWorksheet.Range[currentDestFirstRow, currentDestFirstCol, currentDestLastRow, currentDestLastCol];
            currentSourceRange.CopyTo(destinationRange);
            string line = (i.ToString()).PadLeft(3, '0')+Environment.NewLine;
            line += $"file={currentFile}" + Environment.NewLine;
            line += $"destination range=[{currentDestFirstRow},{currentDestFirstCol},{currentDestLastRow},{currentDestLastCol}]";
            Console.WriteLine(line);
        }

        FileStream stream = new FileStream(destinationFile, FileMode.OpenOrCreate, FileAccess.ReadWrite);
        destinationWorkbook.SaveAs(stream);
        destinationWorkbook.Close();
        stream.Close();
        excelEngine.Dispose();
    }
}
c# excel syncfusion
1个回答
0
投票

您确定这部分吗:

destination range=[1037502,1,1047586,6]

正确吗?具体来说,数字

1047586
对我来说看起来非常可疑 - 这应该读作
1048576
吗?

我问这个问题是因为 1048576 是 2^20,这是(现代)Excel 工作表中的最大行数。也就是说,第 1048576 行是任何工作表中的最后一个可用行。

我怀疑

ArgumentOutOfRangeException
是因为 SyncFusion 认为您的目标行超出了工作表末尾(而不是像您所说的那样,因为任何与
int
相关的溢出)。

您正在对

Range
对象使用从 1 开始的索引。您绝对确定这是正确的吗?例如,我可以看到
Worksheets
是零索引的,因此我希望第 1048576 行索引为
.Range[..., 1048575]
(而不是
...76
)。

如果您确定一切正确,那么这可能是 SyncFusion 中的一个错误,但请注意,尝试写入超出第 1048576 行的内容应该抛出一个

ArgumentOutOfRangeException
,因为 Excel 不支持此操作。

(如果这是 SyncFusion 错误,您可以尝试替代的 .NET 软件包,例如 EPPlus。)

© www.soinside.com 2019 - 2024. All rights reserved.