C# Excel - 将每个工作表保存到新工作簿

5

我有一个包含25个工作表的Excel文件,我只想将每个工作表保存为自己的新工作簿。当我运行代码时,它会复制整个工作簿而不是单个工作表。任何帮助都将非常棒。

string FileDropLocation = @"C:\ExcelFiles";
        string file_FullFileName = @"C:\ts\Conversion\v2.xlsx";
        Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel.Workbook workBook = app.Workbooks.Open(file_FullFileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
for (int i = 0; i < workBook.Worksheets.Count; i++)
        {
            Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets[i+1];
            workSheet.SaveAs(FileDropLocation + "\\" + workSheet.Name);
        }
        workBook.Close();

你不能在工作表上调用SaveAs方法 - 首先调用.Copy方法创建一个独立的新工作簿,其中只包含该工作表,然后保存该工作簿。 - Tim Williams
@TimWilliams,您能否提供一个代码示例? - user222427
类似以下内容 - https://dev59.com/VVjUa4cB1Zd3GeqPNgtF - Tim Williams
@TimWilliams,是的,那个例子不起作用,它只是保持Excel打开状态。 - user222427
抱歉 - 我没有可以满足你需求的代码。但是复制是可行的,似乎Google上已经有很多示例了。 - Tim Williams
3个回答

6

尝试使用以下代码替换您当前的for循环:

    foreach(Worksheet sheet in workBook.Worksheets)
    {
        var newbook = app.Workbooks.Add(1);
        sheet.Copy(newbook.Sheets[1]);

        newbook.SaveAs(FileDropLocation + "\\" + sheet.Name);
        newbook.Close();
    }

    workBook.Close();

需要注意的是,我相信 Workbooks.Add()会放置一个默认的空白工作表(通常为Sheet1),因此如果您只想复制工作表,则必须明确地将其删除。


1

我知道这个有效。

Microsoft.Office.Interop.Excel.Application xl = null;
            Microsoft.Office.Interop.Excel._Workbook wb = null;
            xl = new Microsoft.Office.Interop.Excel.Application();
            xl.SheetsInNewWorkbook = 1;
            xl.Visible = true;
            wb = (Microsoft.Office.Interop.Excel._Workbook)(xl.Workbooks.Add(Type.Missing));

            wb.SaveAs(FileDropLocation + "\\" + workBook.Sheets[i + 1].Name, Microsoft.Office.Interop.Excel.XlFileFormat.xlExcel8, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            wb.Close(true, Type.Missing, Type.Missing);
            xl.Quit();
            Microsoft.Office.Interop.Excel.Workbook destWorkbook = null;
            Microsoft.Office.Interop.Excel.Worksheet workSheet = null;
            Microsoft.Office.Interop.Excel.Worksheet newWorksheet = null;

            destWorkbook = app.Workbooks.Open(FileDropLocation + "\\" + workBook.Sheets[i + 1].Name + ".xls", false, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets[i + 1];
            newWorksheet = (Microsoft.Office.Interop.Excel.Worksheet)destWorkbook.Worksheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            app.DisplayAlerts = false;
            workSheet.Copy(Type.Missing,newWorksheet);
            destWorkbook.Save();

在你的代码顶部添加using Microsoft.Office.Interop.Excel将允许你整理它并使其更易读。 - Sid Holland

0

...在循环中,您需要创建一个新的工作簿并将工作表移动到该工作簿中。 我使用VB编程,所以我猜测,在您的for循环内部的代码应该类似于以下内容:

Microsoft.Office.Interop.Excel.Workbook workBook2 = app.Workbooks.Add(Missing.Value)
Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets[i+1];
workSheet.Copy(workBook2.Sheets(1))

然后您可以添加代码来删除其他工作表等。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接