【问题标题】:VSTO C# - How to edit a .xltx file and don't save it as new fileVSTO C# - 如何编辑 .xltx 文件而不将其另存为新文件
【发布时间】:2020-07-27 03:35:49
【问题描述】:

我不明白为什么这不适用于 XLTX 文件。我的代码与 XLSX 文件配合得很好。

    /// <summary>
    /// Copies the template file and renames the new one.
    /// </summary>
    /// <param name="sourceFilePath"></param>
    private void CopyTemplateFile(string sourceFilePath)
    {
        string strSheetName = "";
        DialogResult result;

        result = MyDialog.ShowDialog("New File - Dialog", "Bitte Name eingeben", "Neue Datei erstellen?", "=FOR1+RBT1", "Ok", "Cancel", ref strSheetName);

        if (result == DialogResult.Yes)     
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Filter = "Excel Template (*.xltx)|*.xltx|Excel File (*.xlsx)|*.xlsx";
            sfd.FileName = strSheetName;
            DialogResult ergebnis = sfd.ShowDialog();

            if (ergebnis == DialogResult.OK)
            {
                string path = sfd.FileName;                                                 
                //string tmp = path.Substring(path.LastIndexOf('\\')+1);
                System.IO.File.Copy(sourceFilePath, path);


                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);
                ws.Name = strSheetName;                                                 
                ws.Range[Statics.ANLAGE_ORT_CELL].Cells.Value2 = "'" + strSheetName;                        
                string stAnlage = strSheetName.Substring(1);                            
                string[] abc = stAnlage.Split('+');                                     
                ws.Range["A50"].Cells.Value2 = abc[0];                                  
                ws.Range["B50"].Cells.Value2 = abc[1];                                  
                wb.SaveAs(path);
                wb.Close();
                app.Quit();
                Marshal.ReleaseComObject(app);
            }
        }
    }

我正在使用 Microsoft.Office.Interop.Excel,sourceFilePath 的打开文件对话框,path 的保存文件对话框。如果使用 XLTX,则不会保存 sheet.name 和单元格值的更改。 也许你们当中有人知道这个问题。

【问题讨论】:

  • 你运行wb.SaveAs() 却没有给出路径? Excel 怎么知道保存在哪里呢?所以它应该是wb.Save() 或为SaveAs() 提供路径(和文件名)。
  • 哦,对不起。它是 wb.Save() 但在某处我看到了一个没有路径的 wb.SaveAs() 解决方案,我试了一下。但这也没有用。
  • 你试过SaveAs指定路径fileformatxlOpenXMLTemplate)吗?那应该确实有效。查看Workbook.SaveAs method 的文档
  • 得到了 COMException:附加信息:此扩展名不能与所选文件类型一起使用。在“文件名”文本框中更改文件扩展名,或通过更改“另存为”选项来选择不同的文件类型。
  • 请再次查看我的第二条评论并阅读链接的文档。 wb.SaveAs(path); 指定路径但不指定文件格式!您需要正确指定两者。如果文件名以.xltx 结尾,则文件格式必须为xlOpenXMLTemplate

标签: c# excel vba vsto


【解决方案1】:

问题是这一行:

wb.SaveAs(path);

根据Workbook.SaveAs method 的文档,您可以/应该提供以下参数:

  • FileName
    一个字符串,表示要保存的文件的名称。您可以包含完整路径;否则,Microsoft Excel 会将文件保存在当前文件夹中。
  • FileFormat
    保存文件时使用的文件格式。有关有效选择的列表,请参阅 XlFileFormat 枚举。对于现有文件,默认格式是最后指定的文件格式;对于新文件,默认为正在使用的 Excel 版本的格式。

实际上两者都是可选的,但是如果您省略FileName Excel 将使用标准文件名和知道这是哪一个的“当前文件夹”,如果您省略FileFormat 那么Excel 将使用最后一个指定的文件格式或新文件的标准格式,即普通 xlsx(在最新版本的 Excel 中)。

另一件事是您使用的文件扩展名.xltx.xlsx.xlsm 必须适合正确的文件格式。如果不是,Excel 会引发错误。这实际上是您遇到错误时遇到的情况:

COMException:附加信息:无法使用此扩展 选择的文件类型。更改“文件”中的文件扩展名 名称”文本框,或通过更改“保存”选择不同的文件类型 As' 的选择。

因为您只指定了FileName,并且选择了.xltx作为文件扩展名,但根据XlFileFormat enumeration中的列表,默认文件格式通常为xlOpenXMLWorkbook

因此,如果您在该列表中查找可以使用扩展名为.xltx 的文件格式,那么您只会找到一种有效的文件格式,即xlOpenXMLTemplate。所以这是你需要指定的:

'example for path/filename you got from your dialog box
path = "C:\YourPath\YourFileName.xltx"

wb.SaveAs(FileName:=path, FileFormat:=xlOpenXMLTemplate);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多