【问题标题】:C# Excel - save each worksheet to a new workbookC# Excel - 将每个工作表保存到新工作簿
【发布时间】:2013-02-06 16:58:31
【问题描述】:

我有一个包含 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 创建一个仅包含该工作表的独立新工作簿,然后保存该工作簿。
  • @TimWilliams 你能提供一个代码示例吗?
  • @TimWilliams 是的,这个例子不起作用,它只是让 excel 打开
  • 抱歉 - 我没有任何代码可以满足您的需求。复制是要走的路。 Google 上似乎有很多例子。

标签: c# excel


【解决方案1】:

试试这个代替你当前的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)中,因此如果您只想要复制的工作表,则必须明确删除它。

【讨论】:

    【解决方案2】:

    我知道这行得通。

    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 可以让您清理它并使其更具可读性。
    【解决方案3】:

    ...您需要在循环中创建一个新工作簿并将工作表移动到该工作簿。 我在 VB 中编程,所以我猜,但你的 foo 循环内的代码应该是这样的:

    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))
    

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

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多