0

使用時にワークシートの書式を保持するにはどうすればよいですかMicrosoft.Office.Interop.Excel.Workbook.SaveAs(...)?

たとえば、以前に作成したブックを Excel 2010 で開くと、見た目が美しく、列ヘッダーの太字のフォント、きれいなグリッド線、入力セルを示す適切なハイライト カラーなどを確認できます。

VS2012 に切り替え、以下に記述した ExcelAppManager を使用して、美しい書式設定のワークブックを開くことから始めます。次に、Interop ライブラリを使用して、新しいセル値をプログラムでワークシートの 1 つに書き込みます。次に、ExcelAppManager で以下に示すように、SaveAs() を使用してワークシートを保存します。次に、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);
4

1 に答える 1

2

VS2012 で相互運用ライブラリを使用すると、既定で Office 2013 が使用され、ブックはその形式で保存されます。その後、Office 2010 で開いています。これが、元の形式が失われた原因である可能性があります。Excel ワークブックを 2010 形式で保存すると、問題が解決する場合があります。

于 2013-07-16T21:05:57.593 に答える