Excel interop workbook.SaveAs () supprime le formatting original?

Comment puis-je conserver le formatting d'une feuille de calcul lors de l'utilisation de Microsoft.Office.Interop.Excel.Workbook.SaveAs(...)?

Par exemple, j'ouvre un classur précédemment créé avec Excel 2010 et je vois qu'il est beau: fonts audacieuses dans les en-têtes de colonnes, jolies lignes de grid, bonnes colors en surbrillance montrant les cellules d'input, etc.

Je passe à VS2012 et j'utilise ExcelAppManager, j'ai écrit ci-dessous en commençant par ouvrir le classur qui a la belle mise en forme. J'utilise ensuite la bibliothèque Interop pour écrire de nouvelles valeurs de cellules, par programme, à l'une des feuilles de calcul. Je sauvegarde ensuite la feuille de calcul à l'aide de SaveAs (), comme indiqué ci-dessous dans ExcelAppManager. J'ouvre ensuite la feuille de calcul à l'aide de Microsoft Excel 2010: je peux voir les valeurs que j'ai écrites dans les cellules respectives – ce qui est génial, cela fonctionne – mais le classur entier n'a plus de formatting. C'est formidable le formatting vanilla et tout le format magnifique est parti.

Je définis le formatting comme tout ce que le peintre format pourrait utiliser: gras, police, alignment, lignes de grid, indentations, largeurs et hauteurs, etc.

Exemple de code:

 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(ssortingng 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]; // ssortingng 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(ssortingng filepath, ssortingng 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; } } 

Et dans mon code client, j'utilise ExcelAppManager comme ceci:

 var _manager = new ExcelAppManager(_excelFilepath); 

Lorsque vous utilisez la bibliothèque Interop dans VS2012, utilisez Office 2013 par défaut et enregistrez le classur dans ce format. Et plus tard, vous l'ouvrez avec Office 2010. C'est peut-être le motif de la perte de format original. Essayez d'save le classur Excel en format 2010, cela pourrait résoudre le problème.