使用時にワークシートの書式を保持するにはどうすればよいですか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);