Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



pywin32 の利用

Python で Excel を扱うパッケージは openpyxl ですが、Excel の仕様に合わせてファイルを作成しているだけなので、Autofill が利用できません。そこで、ここでは pywin32 を使用して Excel.Application を直接操作します( 実行する PC は Windows で Excel がインストールされている必要があります )。

その前に pip そのものの更新確認

python -m pip install --upgrade pip
先日 pip からアップグレードしようとしたら、見事にバグって pip が無くなってしまいました。その場合は https://bootstrap.pypa.io/get-pip.py から get-pip.py をダウンロードして python get-pip.py を実行します。 それ以降、python から アップグレードするようにしています。

pywin32 のインストール

pip install pywin32
pywin32 は、Windows の COM を処理する為のブリッジです。ですから、Excel.Application に限らず 以下のようなクラスを利用できるようになります。 ✅ ADODB.Connection ✅ ADODB.Recordset ✅ ADODB.Stream ✅ WScript.Shell ✅ Shell.Application ✅ Scripting.FileSystemObject ✅ Msxml2.ServerXMLHTTPCDO.Message ✅ Scripting.Dictionary ▼ pip list

excel-autofill.py

Autofill する為に範囲を選択していますが、Sheet.Cells(1, 2) のように数字で全て表現できるようにしています。これはプログラミングを容易にする事が目的ですが、視認しやすいように Range("A1:A2") と言うような記述方法も可能です
import win32com.client
import traceback
import sys
import os

ExcelApp = win32com.client.Dispatch("Excel.Application")
# デバッグ時は、Excel の本体を表示させて状況が解るようにする
ExcelApp.Visible = True
# UI でチェックさせるようなダイアログを表示せずに実行する
ExcelApp.DisplayAlerts = False

try:
    # ****************************
    # ブック追加
    # ****************************
    Book = ExcelApp.Workbooks.Add()

    # 通常一つのシートが作成されています
    Sheet = Book.Worksheets( 1 )

    # ****************************
    # シート名変更
    # ****************************
    Sheet.Name = "Pythonの処理";

    # ****************************
    # セルに値を直接セット
    # ****************************
    for i in range(1, 11):
        Sheet.Cells(i, 1).Value = f"処理 : {i}"

    # ****************************
    # 1つのセルから
    # AutoFill で値をセット
    # ****************************
    Sheet.Cells(1, 2).Value = "子"
    # 基となるセル範囲
    SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2))
    # オートフィルの範囲(基となるセル範囲を含む )
    FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2))
    SourceRange.AutoFill(FillRange)

    # ****************************
    # 保存
    # ****************************
    Book.SaveAs( os.getcwd() + "\\sample.xlsx" )

except Exception:
    ExcelApp.Quit()
    traceback.print_exc()
    sys.exit( )


ExcelApp.Quit()
print("処理を終了します")

openpyxl で Autofill 無しの処理

import openpyxl
import traceback
import sys

try:
    # ****************************
    # 新しいブックを作成
    # ****************************
    Book = openpyxl.Workbook()

    # ****************************
    # 通常一つのシートが作成されています
    # ****************************
    Sheet = Book.worksheets[0]

    # ****************************
    # シート名変更
    # ****************************
    Sheet.title = "Pythonの処理"

    # ****************************
    # セルに値を直接セット
    # ****************************
    for i in range(1, 11):
        Sheet.cell(i, 1, f"処理 : {i}")

    Sheet.merge_cells("C1:F1")
    Sheet.cell(1, 3).value = "結合されたセル"

    Book.save('sample.xlsx')

except Exception:
    traceback.print_exc()
    sys.exit( )

print("処理を終了します")

関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ
Excel, Python

C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する



Range オブジェクトの作成に数値を使用します

プログラミングで処理を行うので、Range("A1:A20") というような表現を使わずに、Cells(行,列) を使って Range オブジェクトを作成しています。
using System;

namespace excel_2020_11_26
{
	class Program
	{
		static void Main(string[] args)
		{
			// Excel アプリケーション
			dynamic ExcelApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
			// Excel のパス
			string path = Environment.CurrentDirectory + @"\sample.xlsx";

			// Excel を表示( 完成したらコメント化 )
			ExcelApp.Visible = true;
			// 警告を出さない
			ExcelApp.DisplayAlerts = false;

			try
			{
				// ****************************
				// ブック追加
				// ****************************
				dynamic Book = ExcelApp.Workbooks.Add();

				// 通常一つのシートが作成されています
				dynamic Sheet = Book.Worksheets(1);

				// ****************************
				// シート名変更
				// ****************************
				Sheet.Name = "C#の処理";

				// ****************************
				// セルに値を直接セット
				// ****************************
				for (int i = 1; i <= 10; i++)
				{
					Sheet.Cells(i, 1).Value = "処理 : " + i;
				}

				// ****************************
				// 1つのセルから
				// AutoFill で値をセット
				// ****************************
				Sheet.Cells(1,2).Value = "子";
				// 基となるセル範囲
				dynamic SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1, 2));
				// オートフィルの範囲(基となるセル範囲を含む )
				dynamic FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10, 2));
				SourceRange.AutoFill(FillRange);


				// ****************************
				// 保存
				// ****************************
				Book.SaveAs(path);
			}
			catch (Exception ex)
			{
				ExcelApp.Quit();
				System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);
				Console.WriteLine(ex.Message);
				return;
			}

			ExcelApp.Quit();
			// 解放
			System.Runtime.InteropServices.Marshal.ReleaseComObject(ExcelApp);

			Console.WriteLine("処理を終了します");

		}
	}
}


関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する




Range オブジェクトの作成に数値を使用します

プログラミングで処理を行うので、Range("A1:A20") というような表現を使わずに、Cells(行,列) を使って Range オブジェクトを作成しています。
// ****************************
// 初期処理
// ****************************
WScript.Echo( "処理を開始します" );
var WshShell = new ActiveXObject("WScript.Shell");
var ExcelApp = new ActiveXObject( "Excel.Application" );

// デバッグ時は、Excel の本体を表示させて状況が解るようにする
ExcelApp.Visible = true;
// UI でチェックさせるようなダイアログを表示せずに実行する
ExcelApp.DisplayAlerts = false;

try {

	// ****************************
	// ブック追加
	// ****************************
	var Book = ExcelApp.Workbooks.Add();

	// 通常一つのシートが作成されています
	var Sheet = Book.Worksheets( 1 );

	// ****************************
	// シート名変更
	// ****************************
	Sheet.Name = "JScriptの処理";

	// ****************************
	// セルに値を直接セット
	// ****************************
	for( var i = 1; i <= 10; i++ )
	{
		Sheet.Cells(i, 1) = "処理 : " + i;
	}

	// ****************************
	// 1つのセルから
	// AutoFill で値をセット
	// ****************************
	Sheet.Cells(1, 2) = "子";
	// 基となるセル範囲
	var SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2));
	// オートフィルの範囲(基となるセル範囲を含む )
	var FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2));
	SourceRange.AutoFill(FillRange);

	// ****************************
	// 保存
	// ****************************
	Book.SaveAs( WshShell.CurrentDirectory + "\\sample.xlsx" );
 
} catch (error) {
	ExcelApp.Quit();
	ExcelApp = null;
	WshShell.Popup(error.description);
	WScript.Quit();	
}

ExcelApp.Quit();
ExcelApp = null;

// ****************************
// ファイルの最後
// ****************************
WshShell.Popup("処理を終了します");

関連する記事

JScript : Visual Studio Code で、WSH を使用する準備

JScript でエラーが発生した行を知る方法

実行プログラムが cscript.exe や wscript.exe の場合、try ~ catch 内のエラー発生の行番号を知る事ができないので、以下の手順で処理します。
1) 拡張子を hta に変更する
2) WScript を使った実行をコメントにする
3) ソースの先頭に <script> ソースの最後に </script> を記述する
4) さらにソースの先頭に <meta http-equiv="x-ua-compatible" content="ie=edge"> を記述する
5) catch の中で、error.stack を表示する
6) エクスプローラからこのソースをダブルクリックする
    ( HTML アプリケーションホストで実行させる )




.hta 用コード

<meta http-equiv="x-ua-compatible" content="ie=edge">
<script>
// ****************************
// 初期処理
// ****************************
//WScript.Echo( "処理を開始します" );
var WshShell = new ActiveXObject("WScript.Shell");
var ExcelApp = new ActiveXObject( "Excel.Application" );

// デバッグ時は、Excel の本体を表示させて状況が解るようにする
ExcelApp.Visible = true;
// UI でチェックさせるようなダイアログを表示せずに実行する
ExcelApp.DisplayAlerts = false;

try {

    // ****************************
    // ブック追加
    // ****************************
    var Book = ExcelApp.Workbooks.Add();

    // 通常一つのシートが作成されています
    var Sheet = Book.Worksheets( 1 );

    // ****************************
    // シート名変更
    // ****************************
    Sheet.Name = "JScriptの処理";

    // ****************************
    // セルに値を直接セット
    // ****************************
    for( var i = 1; i <= 10; i++ )
    {
        Sheet.Cells(i, 1) = "処理 : " + i;
    }

    // ****************************
    // 1つのセルから
    // AutoFill で値をセット
    // ****************************
    Sheet.Cells(1, 2) = "子";
    // 基となるセル範囲
    var SourceRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(1,2));
    // オートフィルの範囲(基となるセル範囲を含む )
    var FillRange = Sheet.Range(Sheet.Cells(1, 2), Sheet.Cells(10,2));
    SourceRange.utoFill(FillRange);

    // ****************************
    // 保存
    // ****************************
    Book.SaveAs( WshShell.CurrentDirectory + "\\sample.xlsx" );


} catch (error) {
    ExcelApp.Quit();
    ExcelApp = null;
    WshShell.Popup(error.description + error.stack);
    WScript.Quit();    
}

ExcelApp.Quit();
ExcelApp = null;

// ****************************
// ファイルの最後
// ****************************
WshShell.Popup("処理を終了します");
</script>


関連する Microsoft ドキュメント

Application オブジェクト Workbook オブジェクトのコレクション Workbook オブジェクト Worksheet オブジェクトのコレクション Worksheet オブジェクト Cells プロパティ

Java : Apache POI で最低限の処理を標準化( ここではワークブックは新規作成 )

最新の Excel( .xslx ) 用 XSSF に必要な jar

Apache POI Apache Commons Collections Apache Commons Compress 4.1 ドキュメント

サンプル

オーバーロードを使用して、できるだけ cell というメソッドでできるようにしてみました。Microsoft の仕様に合わせて行や列を 1 始まりにしたかったという意図もあります。
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.RegionUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbookFactory;

public class Main {

    private static XSSFWorkbook book;
    private static XSSFSheet  sheet;

    // *****************************************************
    // エントリポイント
    // *****************************************************
    public static void main(String[] args) {
        try {
            // ****************************
            // ブック作成
            // ****************************
            book = XSSFWorkbookFactory.createWorkbook();

            // ****************************
            // シート作成
            // ****************************
            sheet = book.createSheet("Javaの処理");

            // ****************************
            // セルに値を直接セット
            // ****************************
            for (int i = 1; i <= 10; i++)
            {
                cell( sheet, i, 1, String.format("処理 : %d", i ));
            }

            // ****************************
            // セルの幅( 3列目 )
            // ****************************
            cellWidth( sheet, 3, 6000 );

            // ****************************
            // セルの結合
            // ****************************
            cell( sheet, 1, 3, 1, 5 );
            // 結合されたセルに値をセット
            cell( sheet, 1, 3, "結合されたセル" );
            
            // ****************************
            // 日付のセット
            // ****************************
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
            cell( sheet, 3, 3, dateFormat.parse("2020/11/27") );

            // ****************************
            // 値のセット
            // ****************************
            cell( sheet, 4, 3, 1000 );
            cell( sheet, 5, 3, 1234567890 );
            cell( sheet, 6, 3, "日本語" );
            cell( sheet, 7, 3, "ABCDEFG abcdefg" );

            // ****************************
            // 式のセット
            // ****************************
            getCell( sheet, 8, 3 ).setCellFormula( "A1" );

            // ****************************
            // 罫線
            // ****************************
            cell( sheet, 3, 3, 10, 5, BorderStyle.DOUBLE );

            // ****************************
            // セルの値を表示
            // ****************************
            for (int i = 1; i <= 10; i++)
            {
                System.out.println( cell( sheet, i, 3 ) );
            }

            // ****************************
            // 書き込み用のファイルストリーム
            // ****************************
            FileOutputStream fos = new FileOutputStream("sample.xlsx");
            
            // ****************************
            // 保存と終了
            // ****************************
            book.write(fos);
            book.close();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    // ****************************
    // セル( XSSFCell ) を取得
    // ****************************
    static XSSFCell getCell(XSSFSheet sheet, int row, int col) {

        XSSFRow xslRow = sheet.getRow(row - 1);
        if ( xslRow == null ) {
            // 行を作成
            xslRow = sheet.createRow( row - 1 );
        }

        XSSFCell cell = xslRow.getCell( col - 1 );
        if ( cell == null ) {
            // セルを作成
            cell = xslRow.createCell( col - 1 );
        }
        return cell;

    }
    // ****************************
    // セルに書き込む
    // ****************************
    // 文字列
    static void cell(XSSFSheet sheet, int row, int col, String value) {

        XSSFCell cell = getCell(sheet, row, col);
        cell.setCellValue(value);

    }
    // 数値
    static void cell(XSSFSheet sheet, int row, int col, double value) {

        XSSFCell cell = getCell(sheet, row, col);
        cell.setCellValue(value);

    }
    // 日付 : BuiltinFormats で定義された値(14) を使用
    static void cell(XSSFSheet sheet, int row, int col, Date value) {

        XSSFCell cell = getCell(sheet, row, col);
        XSSFCellStyle style = sheet.getWorkbook().createCellStyle();
        // Class BuiltinFormats より "m/d/yy"
        style.setDataFormat(14);
        cell.setCellStyle(style);
        cell.setCellValue(value);

    }
    
    // ****************************
    // セル読み込む
    // ****************************
    static String cell(XSSFSheet sheet, int row, int col) {

        XSSFRow xslRow = sheet.getRow(row - 1);
        if ( xslRow == null ) {
            return "";
        }

        XSSFCell cell = xslRow.getCell( col - 1 );
        if ( cell == null ) {
            return "";
        }

        CellType type = cell.getCellType();
        // 文字列
        if ( type == CellType.STRING ) {
            return cell.getStringCellValue();
        } 
        if ( type == CellType.NUMERIC ) {
            // 日付
            if( org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell) ) {
                SimpleDateFormat sdf = new SimpleDateFormat( "yyyy/MM/dd HH:mm:ss" );
                return sdf.format( cell.getDateCellValue() );
            }
            // 数値
            else {
                return String.format("%f", cell.getNumericCellValue());
            }
        } 
        // 式
        if ( type == CellType.FORMULA ) {
            return cell.getCellFormula();
        }
        
        String result = cell.getRawValue();
        if ( result == null ) {
            result = "";
        }

        return result;

    }

    // ****************************
    // セルの幅
    // ****************************
    static void cellWidth(XSSFSheet sheet, int col, int width) {

        sheet.setColumnWidth(col-1, width);

    }

    // ****************************
    // セルの結合
    // ****************************
    static void cell(XSSFSheet sheet, int row1, int col1, int row2, int col2) {

        sheet.addMergedRegion( new CellRangeAddress(row1-1, row2-1, col1-1, col2-1) );

    }

    // ****************************
    // 範囲の外側の罫線
    // ****************************
    static void cell(XSSFSheet sheet, int row1, int col1, int row2, int col2, BorderStyle borderStyle ) {

        CellRangeAddress region = new CellRangeAddress(row1-1, row2-1, col1-1, col2-1);

        RegionUtil.setBorderTop( borderStyle, region, sheet );
        RegionUtil.setBorderBottom( borderStyle, region, sheet );
        RegionUtil.setBorderLeft( borderStyle, region, sheet );
        RegionUtil.setBorderRight( borderStyle, region, sheet );

    }

}

実行結果

読込みは以下のような感じで

XSSFWorkbook book = XSSFWorkbookFactory.createWorkbook(new FileInputStream("sample.xlsx"));

関連する記事

JScript : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する Python : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する

Excel のショートカットキー

Ctrl + Shift + アンパサンド (&)

選択したセルに外枠罫線を適用

Ctrl + セミコロン (;)

現在の日付

Ctrl + Shift + 二重引用符 (")

 1 つ上のセルの値をコピー

Ctrl + Shift + 単一引用符 (')
 
 1 つ上のセルの数式をコピー

Ctrl + 1

[セルの書式設定] ダイアログ ボックスを表示

Ctrl + N

新しい空白のブック

Ctrl + P

印刷プレビュー

Ctrl + F9

最小化

Shift + F11

ワークシート追加

Alt + F11

VBA エディターを起動

 F12

名前を付けて保存






公式のページに一覧がありますが、一つ間違っていたのでひょっとしたらまだ間違いがあるかもしれません

間違って? いたのは、『時刻と分の午前または午後表示の [時刻] 表示形式を設定します。』Ctrl + Shift + @ となっていますが、そのキーでは 『ワークシートのセルの値の表示と、数式の表示を切り替えます。』になり、そこにあるキーの Ctrl + アクセント記号 (`) は Mac 用のようです。





VBScript : 既存の Excel を PDF に変換する ( ExportAsFixedFormat )



単純な一覧データを出力した PDF の見本




Excelで名前を付けて保存で PDF に保存できますが、これはスクリプトで行うコードです。
( プリンタが使える状態でないと動作しません )

ExportAsFixedFormat メソッド

XlFixedFormatType

.wsf で作成しています。もともと、.wsf のほうが簡単に外部ライブラリを参照したり、オブジェクトを最初から定義できるのでコードが簡潔になります。ここでは、Excel.Application 内で定義されている定数も参照して使えるようにしています。

Excel 側では、印刷設定により一行目のタイトルを常に表示するようにしたり、A4 横にして縮小したりしています。シートは二つありますが、PDF に変換すると全て出力されます。


<JOB>
<OBJECT id="Fso" progid="Scripting.FileSystemObject" />
<OBJECT id="ExcelApp" progid="Excel.Application" />
<REFERENCE guid="00020813-0000-0000-C000-000000000046" />
<SCRIPT language="VBScript">
' Wscript.Echo xlTypePDF,xlTypeXPS

' **************************************
' スクリプトのあるディレクトリの取得
' **************************************
strCurPath = WScript.ScriptFullName
Set obj = Fso.GetFile( strCurPath )
Set obj = obj.ParentFolder
strCurPath = obj.Path

' 途中で異常終了すると、Excel がプロセスに残ってしまうので表示させています。
' マウス等で Excel 本体を操作しないで下さい。
' Excel を表示させたくない場合は、以下を削除または行頭に ' でコメントにして下さい
ExcelApp.Visible = True

Dim MyBook
Dim FilePath

' ここで Excel を参照するダイアログが開きます
FilePath = ExcelApp.GetOpenFilename("Excel ファイル (*.xlsx;*.xls), *.xlsx;*.xls", 1, "Excel ファイルの選択") 
if FilePath = "False" Then 
	MsgBox "Excel ファイルの選択がキャンセルされました"
	' スクリプト終了
	Wscript.Quit()
End If

' ここで Excel に読み込んでいます
on error resume next
' Workbook を取得( スクリプトと同じディレクトリ )
Set MyBook = ExcelApp.Workbooks.Open( FilePath )
if Err.Number <> 0 then
	' 終了( 開放 )
	ExcelApp.Quit()
	Wscript.Echo Err.Description & vbCrLf & FilePath
	' スクリプト終了
	Wscript.Quit()
end if
on error goto 0

Dim aPath
Dim strFileName
Dim aExt

' Excel の名前部分を取り出して、pdf の名前部分にします
aPath = Split(FilePath, "\")
strFileName = aPath(Ubound(aPath))
aExt = Split(strFileName,".")
strFileName = aExt(0)

' スクリプトと同じフォルダに保存されます
Call MyBook.ExportAsFixedFormat( xlTypePDF, strCurPath & "\" & strFileName & ".pdf" )

' 終了( 開放 )
ExcelApp.Quit()

' 終了確認
Wscript.Echo "処理が終了しました"

</SCRIPT>
</JOB>


Microsoft の記事

Application.GetOpenFilename メソッド

Microsoft の英文の記事

Saving Workbooks to PDF and XPS Formats in Excel 2007




HTA か IE11(要設定) で動作する Excel.Application の処理を JavaScript で記述したサンプル

JavaScript で記述しているのは、jQuery を使用したいからです。Excel 部分以外であれば他の用途にそのまま利用できるように考えています。

twitter-bootstrap を使用して簡単で美しい見栄えが利用できます。

Excel.Application を JavaScript で利用する際は、Microsoft が認識しているバグがあるので、サンプルのような終わり方をする必要があります。そうしなければ、メモリに Excel のプロセスが残ってしまう事を避けられません。Microsoft は、VBScript を使えば問題無いと書いていますが、IE11 でそもそも VBScript を使うのはいろいろ制限や工夫が必要な上に他へのリソースの流用ができないので、このようなアプローチが必要かもしれません。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta charset="sjift_jis">
<title>Excel の処理</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.3.1/css/bootstrap.css" />
<script>

	// ****************************
	// HTA の時のみ使用
	// ****************************
	//top.moveTo( 300, 150 );
	//top.resizeTo( 800, 600 );

	var WshShell = new ActiveXObject("WScript.Shell");
	var FilePath = "";

	$(function(){

		$("#action").on("click", function(){

			// ****************************
			// Excel.Application を解放する為に
			// ローカル変数を使用しています
			// ****************************
			var Excel = null;
			var Book = null;
			var Worksheet = null;

			Excel = new ActiveXObject("Excel.Application");

			// ****************************
			// 保存ダイアログを前面に
			// 表示する為の処理です
			// ****************************
			Excel.Visible = true;
			Excel.WindowState = 2;	// Minimize
			Excel.WindowState = 1;	// Maximize
			Excel.Visible = false;

			// ****************************
			// 警告を出さないようにする
			// 使用すると上書きの警告が
			// 出なくなります
			// ****************************
			// Excel.DisplayAlerts = false;

			// ****************************
			// ブック追加
			// ****************************
			Excel.Workbooks.Add();

			// ****************************
			// 追加したブックを取得
			// ****************************
			Book = Excel.Workbooks( Excel.Workbooks.Count );

			// ****************************
			// 現状、ブックにはシート一つ
			// という前提で処理していますが
			// 必要であれば、Book.Worksheets.Count
			// で現在のシートの数を取得できます
			// ****************************
			Worksheet = Book.Worksheets( 1 );
			Worksheet.Activate();

			// ****************************
			// シート名設定
			// ****************************
			Worksheet.Name = "新しい情報";

			// ****************************
			// 参照
			// 最後の 1 は、使用するフィルター
			// の番号です
			// ****************************
			FilePath = Excel.GetSaveAsFilename( "excel_001","Excel ファイル (*.xlsx), *.xlsx", 1)
			if ( FilePath == false ) {
				// ****************************
				// 保存していないので
				// 保存した事にして閉じます
				// ****************************
				Book.Saved = true;
				Book.Close();
				Excel.Quit();
				Excel = null;

				alert( "Excel ファイルの保存選択がキャンセルされました" );

				window.setTimeout("Cleanup();",1);
				return;
			}

			// ****************************
			// セルへセット
			// ****************************
			// タイトル部分の参照
			$("#tbl th").each(function(idx){
				Worksheet.Cells(1, idx+1) = $(this).text();
			});

			// 行一覧の参照
			$("#tbl tr").each(function(row){
				$(this).find("td").each(function(idx){
					Worksheet.Cells(row, idx+1) = $(this).text();
				});
			});

			// ****************************
			// セルをデータに合わせて
			// 整理して左上を選択
			// ****************************
			Worksheet.Columns("A:C").Select();
			Worksheet.Columns("A:C").EntireColumn.AutoFit();
			Worksheet.Range("A1").Select();

			// ****************************
			// 保存
			// 拡張子を .xls で保存するには
			// Call ExcelBook.SaveAs( FilePath, 56 ) とします
			// ****************************

			try {
				Book.SaveAs( FilePath );
			}
			catch (e) {
				console.dir(e);
				alert("Book.SaveAs でエラーが発生しました");
			}

			// ****************************
			// Excel をアプリケーションとして終了
			// ****************************
			Excel.Quit();
			Excel = null;
			idTmr = window.setTimeout("Cleanup();",1);

			alert("処理が終了しました \n\n 保存したブックを開きます");

			WshShell.Run( "RunDLL32.EXE shell32.dll,ShellExec_RunDLL " + FilePath );

		});

	});

function Cleanup() {
	CollectGarbage();
}
</script>

<style>
html,body {
	/* height: 100%; */
}

.entry td {
	padding: 6px;
}

/* ****************************
テーブル内のデータを選択不可
( ダブルクリック対応 )
******************************/
#tbl {
	user-select: none;
	-moz-user-select: none;
	-webkit-user-select: none;
	-ms-user-select: none;
}

#tbl th {
	cursor: default;
}

#tbl td {
	cursor: default;
	color: black;
}

</style>

</head>
<body>
<div class="main">

<table class="entry ml-3 mt-3">
	<tr>
		<td>
			<input id="action" type="button" value="Excel.Application の実行" class="form-control btn btn-primary">
		</td>
	</tr>
</table>


<table class="table ml-3 mt-2" id="data" style='width:400px;'>

	<tbody id="tbl">

		<tr>
			<th>コード</th>	<th>開始日</th>	<th>終了日</th>
		</tr>

		<tr>
			<td>FIRST</td><td>2018/04/01</td><td>2018/06/30</td>
		</tr><tr>
			<td>SECOND</td><td>2018/07/01</td><td>2018/09/30</td>
		</tr><tr>
			<td>THIRD</td><td>2018/10/01</td><td>2018/12/31</td>
		</tr><tr>
			<td>FOURTH</td><td>2019/01/01</td><td>2019/03/31</td>
		</tr>

	</tbody>

</table>


</div>
</body>
</html>


関連する記事

🔻 IE11 の設定と VBScript でのサンプルです
IE11 で Excel のブックにアクセスする / JavaScript を使用して Excel のブックのセルにデータをセットして更新



VBScript : Excel のブックを新規に作成する( .xlsx と .xls を選択 )

最新の Excel では新規で自動的に作成されるシートのデフォルトは一つです。但しそれは Excel のオプション設定で変更可能なので、必要であれば Book.Worksheets.Count というように現在のシート数を取得してコードを変更すれば良いと思います。

保存する形式としては、可能列挙型 (Excel) / SaveAs メソッド で使用する定数 より選択して SaveAs メソッドの第二引数に指定します。ここでは、.xls( 56 ) を使用しています
' ****************************
' Excel オブジェクト作成
' ****************************
Set App = CreateObject("Excel.Application")

' ****************************
' 警告を出さないようにする
' ****************************
App.DisplayAlerts = False

' ****************************
' ブック追加
' ****************************
App.Workbooks.Add()

' ****************************
' 追加したブックを取得
' ****************************
Set Book = App.Workbooks( App.Workbooks.Count )

' ****************************
' 現状、ブックにはシート一つ
' という前提で処理していますが
' 必要であれば、Book.Worksheets.Count
' で現在のシートの数を取得できます
' ****************************
Set Worksheet = Book.Worksheets( 1 )
Worksheet.Activate()

' ****************************
' Add では 第二引数に指定した
' オブジェクトのシートの直後に、
' 新しいシートを追加します。
' ****************************
Call Book.Worksheets.Add(,Worksheet)

' ****************************
' シート名設定
' ****************************
Book.Sheets(1).Name = "新しい情報"
Book.Sheets(2).Name = "予備情報"

' ****************************
' 参照
' 最後の 1 は、使用するフィルター
' の番号です
' ****************************
FilePath = App.GetSaveAsFilename(,"Excel ファイル (*.xlsx), *.xlsx,古いExcel ファイル (*.xls), *.xls", 1)
if FilePath = "False" Then
	MsgBox "Excel ファイルの保存選択がキャンセルされました"
	Wscript.Quit()
End If

' ****************************
' 保存
' 拡張子を .xls で保存するには
' Call ExcelBook.SaveAs( BookPath, 56 ) とします
' ****************************
on error resume next
if Ucase(Right(FilePath,3)) = "XLS" then
	Call Book.SaveAs( FilePath, 56 )
else
	Book.SaveAs( FilePath )
end if
if Err.Number <> 0 then
	MsgBox( "ERROR : " & Err.Description )
end if
on error goto 0

' ****************************
' Excel をアプリケーションとして終了
' ****************************
App.Quit()

' ****************************
' Excel を VBScript から開放
' ****************************
Set App = Nothing

' ****************************
' オブジェクト変数を初期化
' ( 初期化しないとオブジェクト扱いされる )
' ****************************
App = Empty


MsgBox( "処理が終了しました" )


Microsoft ドキュメント

Application.GetSaveAsFilename メソッド (Excel)

Application.GetOpenFilename メソッド (Excel)

Worksheets.Add メソッド (Excel)

Workbook.SaveAs メソッド (Excel)

可能列挙型 (Excel) / SaveAs メソッド で使用する定数