Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将多个excel文件合并为一个_C#_Excel_Office Interop_Excel Interop - Fatal编程技术网

C# 如何将多个excel文件合并为一个

C# 如何将多个excel文件合并为一个,c#,excel,office-interop,excel-interop,C#,Excel,Office Interop,Excel Interop,我试着在谷歌上搜索这个,但可以得到我问题的答案。 我正在尝试使用下面的代码将多个excel文件合并为一个。 但它在sheet.Copy命令中给出了如下错误(innerexception中没有其他信息) Unable to get the Copy property of the Worksheet class 代码 private void MergeXlsxFiles(string destXlsxFileName, params string[] sourceXlsxFileNames)

我试着在谷歌上搜索这个,但可以得到我问题的答案。 我正在尝试使用下面的代码将多个excel文件合并为一个。 但它在sheet.Copy命令中给出了如下错误(innerexception中没有其他信息)

Unable to get the Copy property of the Worksheet class
代码

private void MergeXlsxFiles(string destXlsxFileName, params string[] sourceXlsxFileNames)
        {
            Application excelApp = null;
            Workbook destWorkBook = null;
            var temppathForTarget = Path.Combine(Directory.GetCurrentDirectory() , Guid.NewGuid() + ".xls");

            if (File.Exists(temppathForTarget))
                File.Delete(temppathForTarget);

            try
            {
                excelApp = new Application
                {
                    DisplayAlerts = false,
                    SheetsInNewWorkbook = 3
                };
                destWorkBook = excelApp.Workbooks.Add();
                destWorkBook.SaveAs(temppathForTarget);


                foreach (var sourceXlsxFile in sourceXlsxFileNames)
                {
                    var file = Path.Combine(Directory.GetCurrentDirectory(), sourceXlsxFile);
                    var sourceWorkBook = excelApp.Workbooks.Open(file);

                    foreach (Worksheet ws in sourceWorkBook.Worksheets)
                    {
                        var wSheet = destWorkBook.Worksheets[destWorkBook.Worksheets.Count];
                        ws.Copy(wSheet);
                        destWorkBook.Worksheets[destWorkBook.Worksheets.Count].Name =
                            ws.Name; 
                    }
                    sourceWorkBook.Close(XlSaveAction.xlDoNotSaveChanges);
                }
                destWorkBook.Sheets[1].Delete();
                destWorkBook.SaveAs(destXlsxFileName);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                if (destWorkBook != null)
                    destWorkBook.Close(XlSaveAction.xlSaveChanges);
                if (excelApp != null)
                    excelApp.Quit();
            }
        }
有人知道这个代码有什么问题吗


我指的是GAC版本为15.0.0.0的Microsoft.Office.Interop.Excel dll,我的机器上安装了MSOffice 2013。

一般来说,当我测试问题中的代码时,它会遇到数据键入问题。Excel对数据类型“挑剔”——通常需要显式转换类型。以下
foreach
适用于我:请注意
(Excel.Worksheet)
强制转换。对于这些,我在
Copy
(或
Name
)方法(属性)上没有遇到任何问题

我还遇到了分配工作表名称的“怪事”。问题代码中使用的逻辑不清楚,因此假设新的工作表应该添加在默认的三张空白工作表之后,我修改了
ws.Copy
,将它们放在末尾

foreach (Excel.Worksheet ws in sourceWorkBook.Worksheets)
{
    var wSheet = (Excel.Worksheet) destWorkBook.Worksheets[destWorkBook.Worksheets.Count];
    ws.Copy(missing, wSheet);
    Excel.Worksheet wNewSheet = (Excel.Worksheet)destWorkBook.Worksheets[destWorkBook.Worksheets.Count];
    wNewSheet.Name = "New" + ws.Name; 
}

可能是由于sourceWorkBook.Sheets中的
和/或
destWorkBook.Sheets
<代码>工作表
工作表
不同。它们可以是,但也可以是其他类型的工作表,例如图表工作表。在sourceWorkbook.Worksheets中尝试
和destWorkBook.Worksheets`?我尝试使用工作表,但仍然出现相同的错误。我用这些变化更新了我的问题…这对我来说很有效。谢谢。。。还有一件事。。。。当我的excel文件扩展名为.xlsx而不是.xlsw时,我的旧代码也可以工作。当使用“interop”时-代码与excel应用程序交互-文件格式/扩展名不重要。Excel可以以相同的方式打开所有文件类型。与“互操作”相关的是Excel版本,它决定了可用的功能。如果代码直接使用开放式XML文件格式(例如,开放式XML SDK),则文件格式会有所不同。