VSTO C# - Как отредактировать файл .xltx и не сохранять его как новый файл - PullRequest
0 голосов
/ 14 апреля 2020

Я не могу понять, почему это не работает с файлом 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. Изменения sheet.name и значений ячеек не сохраняются, если используется XLTX. Может, кто-то из вас, ребята, знает проблему.

1 Ответ

1 голос
/ 15 апреля 2020

Проблема заключается в следующей строке:

wb.SaveAs(path);

В соответствии с документацией метода Workbook.SaveAs вы можете / должны указать следующие параметры:

  • FileName
    Строка, которая указывает имя файла для сохранения. Вы можете включить полный путь; в противном случае Microsoft Excel сохраняет файл в текущей папке.
  • FileFormat
    Формат файла, используемый при сохранении файла. Список допустимых вариантов см. В перечислении XlFileFormat. Для существующего файла формат по умолчанию - последний указанный формат файла; для нового файла по умолчанию используется формат используемой версии Excel.

На самом деле оба являются необязательными, но если вы опустите FileName, Excel будет использовать имя стандартного файла и "" текущая папка "кто знает, какая это папка, и если вы пропустите FileFormat, то Excel будет использовать последний указанный формат файла или для новых файлов стандартный формат, который является нормальным xlsx (в последних версиях Excel).

Другое дело, что используемое расширение файла .xltx, .xlsx, .xlsm обязательно должно соответствовать правильному формату файла. Если это не Excel, выдает ошибку. Это то, с чем вы столкнулись, когда получили сообщение об ошибке:

COMException: дополнительная информация: это расширение нельзя использовать с выбранным типом файла. Измените расширение файла в текстовом поле «Имя файла» или выберите другой тип файла, изменив выбор «Сохранить как».

Поскольку вы указали только FileName и выбрали .xltx как расширение файла, но формат файла по умолчанию обычно xlOpenXMLWorkbook в соответствии со списком в перечислении XlFileFormat .

Так что если вы посмотрите в этом списке, какие форматы файлов вы можете использовать с расширением .xltx, тогда вы найдете только один допустимый формат файла, а это xlOpenXMLTemplate. Вот что вам нужно указать:

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

wb.SaveAs(FileName:=path, FileFormat:=xlOpenXMLTemplate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...