2013-07-16 2 views
0

Как я могу сохранить форматирование рабочего листа при использовании Microsoft.Office.Interop.Excel.Workbook.SaveAs(...)?Excel interop workbook.SaveAs() удаляет исходное форматирование?

Например, открыть ранее созданную книгу с Excel 2010, и я вижу, что это выглядит красиво: смелые шрифты в заголовках столбцов, красивые линии сетки, хорошие цвета подсветки, которая проявляет входные ячейки и т. д.

Я переключаюсь на VS2012 и используя ExcelAppManager, который я написал ниже, я начинаю с открытия книги, которая имеет красивое форматирование. Затем я использую библиотеку Interop для записи новых значений ячеек, программно, на один из рабочих листов. Затем я сохраняю рабочий лист с помощью SaveAs(), как показано ниже в ExcelAppManager. Затем я открываю рабочий лист с помощью Microsoft Excel 2010: я могу видеть значения, которые я написал в соответствующих ячейках - это здорово, это сработало - но вся рабочая книга больше не имеет форматирования. Это простое форматирование ванили, и весь красивый формат ушел.

Я определяю форматирование, как и все, что формат художник будет работать на: полужирный, шрифт, выравнивание линий сетки, углублений, ширины и высоты, и т.д.

Пример кода:

using System; 
using System.Reflection; 
using System.Runtime.InteropServices; 
using Microsoft.Office.Interop.Excel; 

namespace ExcelStuff 
{ 
    public class ExcelAppManager 
    { 
     private Application _excelApp; 
     private bool _isDefaultWorksheets = true; 

     private Workbook _workBook; 
     private Workbooks _workBooks; 
     private Sheets _workSheets; 

     public ExcelAppManager(string pathToExistingWorksheet) 
     { 
      _excelApp = new Application {DisplayAlerts = false}; 

      _workBooks = _excelApp.Workbooks; 
      _workBook = _workBooks.Open(pathToExistingWorksheet, Type.Missing, 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); 

      _workSheets = _workBook.Worksheets; 

      // NOTE: following lines are nice for debug of existing worksheets (to find the worksheets names) 
      //Get the reference of second worksheet 
      //   var worksheet = (Microsoft.Office.Interop.Excel.ExcelWorksheet) _workSheets.Item[1]; 
      //   string strWorksheetName = worksheet.Name; //Get the name of worksheet. 


      _isDefaultWorksheets = true; 
     } 

     public ExcelAppManager() 
     { 
     } 

     public void Initialize() 
     { 
      _excelApp = new Application {DisplayAlerts = false}; 
      _workBooks = _excelApp.Workbooks; 
      _workBook = _workBooks.Add(Missing.Value); 
      _workSheets = _workBook.Worksheets; 
      _isDefaultWorksheets = true; 
     } 

     public void KillProcess() 
     { 
      _workBook.Close(); 
      _workBooks.Close(); 
      _excelApp.Quit(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      Marshal.FinalReleaseComObject(_workSheets); 
      Marshal.FinalReleaseComObject(_workBook); 
      Marshal.FinalReleaseComObject(_workBooks); 
      Marshal.FinalReleaseComObject(_excelApp); 
     } 


     public void SaveAs(string filepath, string fileExtensionOfExcelFile) 
     { 
      _excelApp.DisplayAlerts = false; 

      if (fileExtensionOfExcelFile == "xlsm") 
      { 
       _workBook.SaveAs(filepath, XlFileFormat.xlOpenXMLWorkbookMacroEnabled, 
           Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlNoChange, 
           XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); 
      } 
      else 
      { 
       _workBook.SaveAs(filepath, Type.Missing, 
           Type.Missing, Type.Missing, true, false, XlSaveAsAccessMode.xlNoChange, 
           XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); 
      } 
     } 


     internal Sheets GetSheets() 
     { 
      return _workSheets; 
     } 

    } 

И в моей клиентский код, я использую ExcelAppManager так:

var _manager = new ExcelAppManager(_excelFilepath); 
+0

Что именно вы подразумеваете под форматированием? что именно отсутствует в новой книге? – chancea

+0

Пожалуйста, покажите код, так как SaveAs должен сохранять любое форматирование. –

ответ

2

при использовании библиотеки Interop в VS2012 это использовать офис 2013 по умолчанию и ваши сохранения рабочей книги в том, что е Ormat. И позже вы открываете его в Office 2010. Это может быть причиной потери исходного формата. Попытайтесь сохранить книгу Excel в формате 2010 года, это может решить проблему.

+0

Вот и все. Спасибо! Некоторое время я застрял на этом. Ответ на мой вопрос заключается в том, что вам нужно быть осторожным в отношении того, какой Interop.dll вы используете. Убедитесь, что файл interop.dll соответствует версии Excel, которую вы используете. – sapbucket

+0

В качестве побочного примечания, если вы вытаскиваете волосы, возможно, также, что у вас есть ClearFormats() где-то в вашем коде. Найдите это и прокомментируйте это - это может решить вашу проблему. – sapbucket

+0

Как только я прочитал ваше сообщение, первым, что я сделал, я пошел дальше и проверил формат, в котором VS2012 сохраняет книгу, и моя следующая мысль была ответом, который я написал. Галд, что это тебе помогло. – Koushik

Смежные вопросы