JScriptでEXCELのヘッダ、フッタを編集する

仕事でEXCELのヘッダ、フッタ、プロパティを一括置換しなければならなかったので調べてみた。WSHは制約が多いので不便なのだが、仕事で楽をする程度のゆるい使い方に限定すれば結構便利。

/* 
 * MS-EXCELのヘッダ、フッタ、プロパティを編集する
 * headers: 左、中央、右ヘッダの内容の配列
 * footers: 左、中央、右フッタの内容の配列
 * properties: プロパティのDictionary
 */
function excel_setting(filename, headers, footers, properties) {
    var excel = WScript.CreateObject("Excel.Application");
    var workBook = excel.WorkBooks.Open(filename, 1);
    
    // シートを順番に取得
    for (var i = 1; i <= workBook.WorkSheets.Count; i++) {
        var sheet = workBook.WorkSheets.Item(i);
        // ヘッダの設定
        sheet.PageSetup.LeftHeader = headers[0];
        sheet.PageSetup.CenterHeader = headers[1];
        sheet.PageSetup.RightHeader = headers[2];
        // フッタの設定
        sheet.PageSetup.LeftFooter = footers[0];
        sheet.PageSetup.CenterFooter = footers[1];
        sheet.PageSetup.RightFooter = footers[2];
    }
    
    // プロパティの設定
    for (var key in properties) {
        var property = workBook.BuiltinDocumentProperties.Item(key);
        property.Value = properties[key];
    }
    
    workBook.Save();
    workBook.Close();
    excel.Quit();
}

ちなみに、ヘッダ、フッタには書式コードが使える。

JScriptでWordとPowerPointのプロパティを変更する

まずはWordから。さすがにEXCELの姉妹ソフトだけあってほぼ同じ。ただ、ヘッダ、フッタはセクション単位に設定なのでかなり面倒そうだったので諦めたです。

/*
 * MS-WORDのプロパティを設定する
 * properties: プロパティのDictionary
 */
function word_setting(filename, properties) {
    var word = WScript.CreateObject("Word.Application");
    var document = word.Documents.Open(filename, 1);
    
    // プロパティの設定
    for (var key in properties) {
        var property = document.BuiltinDocumentProperties.Item(key);
        property.Value = properties[key];
    }
    
    document.Save();
    document.Close();
    word.Quit();
}

我らがPowerPointはOpenの引数が異なるのでちょっとつまずきやすい。てゆうか、Write権限のフラグくらい統一してくれや。

/*
 * MS-POWERPOINTのプロパティを設定する
 * properties: プロパティのDictionary
 */
function powerpoint_setting(filename, properties) {
    var powerpoint = WScript.CreateObject("PowerPoint.Application");
    var presentation = powerpoint.Presentations.Open(filename, 0, 0, 0);
    
    // プロパティの設定
    for (var key in properties) {
        var property = presentation.BuiltinDocumentProperties.Item(key);
        property.Value = properties[key];
    }
    
    presentation.Save();
    presentation.Close();
    powerpoint.Quit();
}

JScriptでVisioのプロパティを変更する

しつこい。……といいつつ、実はVisioだけAPIの体系が全然違ったりするんだよなぁ。さすがは元々他社製品だっただけのことはある。Excelなどは○○.ApplicationでCreateObjectすると非表示状態で立ち上がるのだが、Visioは表示状態になるので、Visio.InvisibleAppでCreateObjectする必要がある。

/*
 * MS-VISIOのプロパティを設定する
 * properties: プロパティのDictionary
 */
function visio_setting(filename, properties) {
    var visio = WScript.CreateObject("Visio.InvisibleApp");
    var document = visio.Documents.Open(filename);
    
    // プロパティの設定
    for (var key in properties) {
        if (key == "Title") document.Title = properties[key];
        else if (key == "Title") document.Title = properties[key];
        else if (key == "Subject") document.Subject = properties[key];
        else if (key == "Creator") document.Creator = properties[key];
        else if (key == "Manager") document.Manager = properties[key];
        else if (key == "Company") document.Company = properties[key];
        else if (key == "Category") document.Category = properties[key];
        else if (key == "Keywords") document.Keywords = properties[key];
        else if (key == "Description") document.Description = properties[key];
    }
    
    document.Save();
    document.Close();
    visio.Quit();
}

データベース設計は難しい

基本的にはパターンでいいと思う。例えば「社員マスタは×。従業員マスタにすべし」とか「従業員マスタには部署情報を持つな」とか「IDを付けろ」とか。とはいえ、どうすべきなのかいまだに迷っているところもある。例えば、履歴の持ち方とか。履歴を持つときには、業務的な変更と間違いの修正の二種類をきちんと考慮する必要があるはずだけれど、その二つを明確に分けたUIを持つシステムに私は今まで出会ったことがない。

データベース設計には結論などないとは聞くのだが、よくよく比較してみるとそうでもないのではないかと感じている。だが、そこに辿り着くにはまだ経験が足りないようだ。