【问题标题】:C# VSTO - How to save activesheet to a new worbook / new file?C# VSTO - 如何将活动表保存到新的工作簿/新文件?
【发布时间】:2020-11-25 10:04:12
【问题描述】:

我正在使用 .NET 4.7.2 开发 Excel 加载项。因此,当用户使用此插件时,我的程序的操作几乎总是来自 GetInstance() 函数,该函数返回

Globals.ThisAddIn.Application.ActiveWorkbook

实际的挑战是将活动表保存为新的工作簿/Excel 文件。我在所有课程中都使用这样的 Office.Interop.Excel

using Excel = Microsoft.Office.Interop.Excel;

我已经尝试了很多方法来解决这个问题,但都没有真正奏效。

一个:-----------------

        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Vorlage auswählen";
        ofd.InitialDirectory = Stx.DIRECTORY_VORLAGE;
        DialogResult ofdResult = ofd.ShowDialog();

        if (ofdResult == DialogResult.OK)
        {
            Excel.Workbook activeBook = GetInstance();
            Excel.Worksheet activeSheet = (Excel.Worksheet)GetInstance().ActiveSheet;
            string masterFile = activeSheet.Name + "_Master.xltx";

            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Title = "Speicherort neues Masterfile";
            sfd.InitialDirectory = Stx.DIRECTORY_MASCHINEN;
            sfd.FileName = masterFile;
            sfd.Filter = "Excel Template (*.xltx)|*.xltx";
            DialogResult sfdResult = sfd.ShowDialog();

            if (sfdResult == DialogResult.OK)
            {
                string strFileTemplate = ofd.FileName.Trim();
                string strNewFile = sfd.FileName.Trim();
                
                // copies the template .xltx to the destination
                System.IO.File.Copy(strFileTemplate, strNewFile);

                Excel.Application app = new Excel.Application();
                //Excel.Workbook wb = app.Workbooks.Open(path, ReadOnly: false);
                //Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.get_Item(1);
                Excel.Workbook book = app.Workbooks.Open(strNewFile, 0, true, Type.Missing, "", "", false, Type.Missing, "", true, false, 0, false, false, false);
                Excel.Worksheet sheet = book.Sheets[1];

                //Copy sheet to new Workbook
                activeSheet.Copy(System.Reflection.Missing.Value, sheet);

                // by the way, this is working (vice versa)
                //     sheet.Copy(System.Reflection.Missing.Value, nativeWorkbook.Sheets[nativeWorkbook.Worksheets.Count]);

                book.Save();
                book.Close();
                app.Quit();
                Marshal.ReleaseComObject(app);

我也尝试使用 .xlsx 文件,但这也没有用。

对我来说,复制整个工作簿并删除不必要的工作表是可以的,但这也不起作用。

二:-------------

                string abc = activeSheet.Name;
                GetInstance().SaveAs(strNewFile, FileFormat: Excel.XlFileFormat.xlOpenXMLWorkbook);
                //GetInstance().SaveAs(strNewFile, FileFormat: Excel.XlFileFormat.xlOpenXMLTemplate);

                Excel.Application app = new Excel.Application();
                Excel.Workbook wb = app.Workbooks.Open(strNewFile, ReadOnly: false);

                foreach (Excel.Worksheet sheet in wb.Worksheets)
                    if (!sheet.Name.Equals(abc))
                        sheet.Delete();  // doesn't work

                wb.Save();
                wb.Close();
                app.Quit();
                Marshal.ReleaseComObject(app);

【问题讨论】:

    标签: c# .net excel vb.net visual-studio


    【解决方案1】:

    您可以尝试使用 workbook.saveas 方法将活动工作表保存到新的 xltx 文件中。

    这是一个代码示例,您可以参考。

     private void button1_Click(object sender, EventArgs e)
            {
                Excel.Application app = new Excel.Application();
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.InitialDirectory = "E:\\";
                DialogResult ofdResult = ofd.ShowDialog();
                if (ofdResult == DialogResult.OK)
                {
    
                    Excel.Workbook activeBook = app.Workbooks.Open(ofd.FileName);
                    Excel.Worksheet activeSheet = (Excel.Worksheet)activeBook.ActiveSheet;
                    string masterFile = activeSheet.Name + "_Master.xltx";
    
                    SaveFileDialog sfd = new SaveFileDialog();
                    sfd.InitialDirectory = "E:\\";
                    sfd.FileName = masterFile;
                    sfd.Filter = "Excel Template (*.xltx)|*.xltx";
                    DialogResult sfdResult = sfd.ShowDialog();
                    if (sfdResult == DialogResult.OK)
                    {
                        string strFileTemplate = ofd.FileName.Trim();
                        string strNewFile = sfd.FileName.Trim();
                        activeBook.SaveAs(strNewFile, Excel.XlFileFormat.xlOpenXMLTemplate);
                        activeBook.Close(false);
                        app.Quit();
               
                        Marshal.ReleaseComObject(app);
               
                    }
                }
            }
    

    【讨论】:

    • 我用不同的文件类型和参数尝试了很多次 SaveAs,但只保存了整个工作簿。为什么在编写 workbook.SaveAs() 时要保存活动工作表?
    • @prototype0815,像往常一样,活动表属于工作簿,所以当我们保存工作簿时,应该自动保存工作表。顺便说一句,你试过我的代码吗?对你有用吗。如果没有,请告诉我你有什么问题。
    • 是的,我尝试了您的代码,正如我所提到的,它将整个工作簿完全保存为我的代码。是的,活动工作表也在新保存的工作簿中。但这不是我试图得到的。 --> 如果您手动操作,请打开一个 .xlsx,其中包含一张或多张纸。右键单击所需的工作表,选择“移动或复制...”,现在您可以单击复制到新工作簿。这就是我想以编程方式解决的问题。
    【解决方案2】:

    获胜者是.... 使用相同的应用程序打开两个工作簿,复制也可以。

            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Vorlage auswählen";
            ofd.InitialDirectory = Stx.DIRECTORY_VORLAGE;
            DialogResult ofdResult = ofd.ShowDialog();
    
            if (ofdResult == DialogResult.OK)
            {
                Excel.Worksheet activeSheet = (Excel.Worksheet)GetInstance().ActiveSheet;
                string fileType = ofd.FileName.Substring(ofd.FileName.LastIndexOf('.'));
                string masterFile = activeSheet.Name + "_Master" + fileType;
    
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "Speicherort neues Masterfile";
                sfd.InitialDirectory = Stx.DIRECTORY_MASCHINEN;
                sfd.FileName = masterFile;
                sfd.Filter = "Excel Template (*" + fileType + ")|*" + fileType + "";
                DialogResult sfdResult = sfd.ShowDialog();
    
                if (sfdResult == DialogResult.OK)
                {
                    string strFileTemplate = ofd.FileName.Trim();
                    string strNewFile = sfd.FileName.Trim();
                    System.IO.File.Copy(strFileTemplate, strNewFile);
                    
                    Excel.Workbook destBook = Globals.ThisAddIn.Application.Workbooks.Open(strNewFile, 0, false, Type.Missing, "", "", false, Type.Missing, "", true, false, 0, false, false, false);
                    //destBook.Activate();
                    Excel.Worksheet destSheet = destBook.Sheets[destBook.Worksheets.Count];
                    activeSheet.Copy(System.Reflection.Missing.Value, destSheet);
    
                    destBook.Save();
                    destBook.Close();
                }
            }
    

    Globals.ThisAddIn.Application 在我的例子中。多么糟糕的绊脚石。

    【讨论】:

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