Excel互操作workbook.SaveAs()删除原始格式?

如何在使用Microsoft.Office.Interop.Excel.Workbook.SaveAs(...)?时保留工作表的格式Microsoft.Office.Interop.Excel.Workbook.SaveAs(...)?

例如,我使用Excel 2010打开以前创build的工作簿,发现它看起来很漂亮:列标题中的粗体字体,漂亮的网格线,显示input单元格的高亮颜色等。

我切换到VS2012,并使用我写在下面的ExcelAppManager我开始打开具有美丽的格式的工作簿。 然后,我使用Interop库以编程方式将新的单元格值写入其中一个工作表。 然后使用SaveAs()保存工作表,如下面的ExcelAppManager所示。 然后我使用Microsoft Excel 2010打开工作表:我可以看到我在各个单元格中写入的值 – 这很好,但是工作正常 – 但是整个工作簿不再具有格式。 这是普通的香草格式,所有美丽的格式都消失了。

我将格式定义为格式化画家所能操作的格式:粗体,字体,alignment,网格线,缩进,宽度和高度等。

示例代码:

 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); 

在VS2012中使用Interop库时,默认情况下使用Office 2013,并以此格式保存工作簿。 稍后您将使用Office 2010进行打开。这可能是原始格式丢失的原因。 尝试保存在2010年格式的Excel工作簿,这可能会解决这个问题。