как объединить несколько файлов Excel в один - PullRequest
0 голосов
/ 21 декабря 2018

Я попытался найти это в Google, но смог получить ответ на мою проблему.Я пытаюсь объединить несколько файлов Excel в один, используя приведенный ниже код.Но это дает мне ошибку, как показано ниже (без дополнительной информации в исключениях) в файле sheet.Copy.

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();
            }
        }

Кто-нибудь знает, что не так сэтот код.

Я имею в виду Microsoft.Office.Interop.Excel dll из GAC с версией 15.0.0.0, и на моем компьютере установлен MSOffice 2013.

1 Ответ

0 голосов
/ 24 декабря 2018

В целом, когда я тестирую код в вопросе, возникают проблемы с типизацией данных.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; 
}
...