none
データベースエンジンACEとJetではExcelに対する挙動が違う RRS feed

  • 質問

  • Excelセル書式の「継承」に関する質問です。

    環境はWin8.1Visual Studio 2013Excel 2013です。

    Jetの接続文字列

    Private ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;" & _

                   "Data Source=C:\Sample\ExcelDB.xls;" & _

                   "Extended Properties=""Excel 8.0;HDR=YES"""

    ACEの接続文字列

    Private ConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _

                   "Data Source=C:\ Sample\ExcelDB.xlsx;" & _

                   "Extended Properties=""Excel 12.0 Xml;HDR=YES"""

    Jet Excel 97-2003 ブック形式(.xls)をデータベースとします。

    ACE Excel 2007-2013 ブック形式(.xlsx)をデータベースとします。

    OleDbDataAdapter.InsertCommandを使いExcelに新しいレコードを追加しますと、

    Jetの場合は、上の行のセルの書式が継承されるのに対し、

    ACEの場合は、継承されません。

    これはACEの仕様で、そういうものなのでしょうか?

    Jetとは仕様が異なるのでしょうか。それともExcel側の問題でしょうか。

    ACEでセルの書式を継承する方法は無いものかと、こちらに質問させて頂きます。

    ちなみに、レコード更新(UpdateCommand)ではJetACEも同じ挙動になります。(更新前のセル書式をキープ)

    Microsoftサポートで「Visual Basic .NET ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法」

    http://support.microsoft.com/kb/316934/ja

    が紹介されてますが、これはJetのお話です。

    ACE版でこのような解説を探しました見つかりません。

    ご教授よろしくお願いいたします。

    2014年8月30日 5:21

すべての返信

  • ACEかJETというよりもXLSかXLSXにより異なるようでした。

    また該当のファイルがExcelによって起動中かどうかによっても結果が異なりました。

    JET, XLS, 起動していない: ○

    JET, XLS, 起動している: ×

    ACE, XLS, 起動していない: ○

    ACE, XLS, 起動している: ×

    ACE, XLSX, 起動していない: ×

    ACE, XLSX, 起動している: ×

    XLSXでは起動していても起動していなくても結果が同じになるように書式を引き継がないようにしたのかもわかりませんね。

    Windows7 64bit, Excel 2010, Visual Studio 2013でテスト


    http://systemartlaboratory.com/

    2014年8月31日 4:20
  • 三輪の牛さん

    ありがとう御座います。

     

    こちらの環境でも確認いたしました。

    ACEでもデータベースが Excel 97-2003 ブック形式(.xls)なら、セル書式を継承しました。

    Private ConnectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;" & _

                   "Data Source=C:\Sample\ExcelDB.xls;" & _

                   "Extended Properties=""Excel 8.0;HDR=YES"""

     

     つまり書式を継承するかは、JetACE かではなく、接続先のファイル形式が97-2003.xls)か2007-2013.xlsx)かということになりますね。

     ついでに確認しましたが、.xlsx.xlsmも継承しません。

     

     話がややこしくなりますが・・

     97-2003.xls)の場合は、Excelを開いているか閉じているかの差で、

     開いている場合は、太字や背景色の設定は継承しませんが、数値(小数部の設定)はちゃんと継承しますね。

     閉じていれば、全ての書式を継承します。

     2007-2013.xlsx/.xlsm)は開いていようが閉じていようが、何も継承しません。

     と言いたい所ですが、意外にも「ヘッダー」のAlign(中央寄せなど)が追加レコードに継承される何とも「妙な継承」を発見しました。

     

     さて、

     確認はこれくらいにしまして、教えて頂きたいのは、Excel 2007-2013.xlsx/.xlsm)で、セルの書式(ひとつ上の行の書式)を継承させる方法はあるのでしょうか。

     

     ご存知でしたら御教授願います。



    • 編集済み Mr.momoQZ 2014年9月1日 13:13
    2014年9月1日 13:06
  • > 確認はこれくらいにしまして、教えて頂きたいのは、Excel 2007-2013(.xlsx/.xlsm)
    > で、セルの書式(ひとつ上の行の書式)を継承させる方法はあるのでしょうか。

    三輪の牛さんの検証結果や質問者さんの追加検証結果を裏付ける Microsoft の公式文書などは見つかりませんでしたが、検証結果を見る限り、「セルの書式を継承する」ことは JET/ACE + ADO.NET の機能ではなく Excel 側の機能である(即ち、JET/ACE + ADO.NET 側では何ともならない)ということは明確になったのではないですか?

    最初の質問で紹介されていた Microsoft サポートの記事も書式の設定まではしていません。データの SELECT, INSERT, UPDATE という基本的なことだけです。なので、接続文字列を ACE 用に変更すれば(他にも多少の手直しは必要かもしれませんが)、ACE + ADO.NET で同じことができると思います。

    どうしてもプログラムから書式設定が必要ということであれば、Office Automation とか Open XML SDK の機能を使うことを検討されてはいかがですか?

    最近知ったのですが、ClosedXML というのもあります。

    ClosedXML - The easy way to OpenXML
    https://closedxml.codeplex.com/


    • 編集済み SurferOnWww 2014年9月2日 1:03 誤字訂正
    2014年9月2日 1:01
  •   SurferOnWwwさん

      ありがとう御座います。

     

      最初の質問で紹介したMicrosoftサポートの「Visual Basic .NET ADO.NET を使用して Excel ブックのレコード の取得と変更を行う方法」

      http://support.microsoft.com/kb/316934/ja

     

      こちらの最後の方に、書式の継承について解説が付いてます。

      サンプルコードを使っての説明まであって、とても親切です。

      もちろん、手順通りにやれば、「継承」した様子が確認できます。

      この様な解説のACE版が、何故ないのか不思議です。

      あるいは、JetACEの「違い」や「互換性」についての文献が、何故ないのか不思議です。ついでに言えば「新機能」が有るのかさえ分からない状況です。

     

      >どうしてもプログラムから書式設定が必要ということであれば、

      このニュアンスはちょっと・・

      書式を「勝手に継承」してくれるが、Jet OLEDB プロバイダの魅力です。

      いちいちプログラムで処理する必要がありません。

      Jetの後継として登場したACEですが、Excel 8.0の後継として登場したExcel 12.0ですが、後継の方が「不便」になるのは、とてもとても残念です。

      何かしらの方法(例えば、Extended Propertiesとか)で対応できるものと期待したのですが、方法はないのでしょうか?



    • 編集済み Mr.momoQZ 2014年9月2日 11:02
    2014年9月2日 10:58
  • Excelのバージョンが違うためか、検証結果は少し異なるようです。

    当方では開いたままだと、数値(小数部の設定)も継承されませんでした。

    肝心の継承させる方法はわかりません。



    http://systemartlaboratory.com/


    • 編集済み 三輪の牛 2014年9月2日 12:42 表現があいまいだった
    2014年9月2日 11:02
  •  三輪の牛さん

     ありがとう御座います。

     

     >当方では開いたままだと書式も継承されませんでした。

     三輪の牛さんはExcel 2010 でしたね。

     バージョンが違うだけで挙動がかわるのも面倒ですね。

     私の自宅にXPOffice 2007 があります。ACEも入っているので、時間のある時に「継承」の様子を確認したいと思います。

     

     この度はいろいろありがとう御座いました。

     またの機会によろしくお願いします。

    2014年9月2日 11:18
  • > 書式を「勝手に継承」してくれるが、Jet OLEDB プロバイダの魅力です。
    > いちいちプログラムで処理する必要がありません。

    全くの誤解です。

    私を含め、回答者の言っていることに全く聞く耳を持たないようですが、それならここで質問する必要(資格)はないです。

    三輪の牛さんに非常に失礼な対応をしてますが(自覚がありますか?)、そういう対応しかできないなら、誰もあなたの質問には回答しないと思いますよ。

    2014年9月2日 11:48
  • SurferOnWwwさん

     

    >全くの誤解です。

    誤解ではありません。事実です。

     

    >それならここで質問する必要(資格)はないです。

    資格がないとは、どういう意味でしょうか。説明を求めます。

     

    >三輪の牛さんに非常に失礼な対応をしてますが(自覚がありますか?)

    私の何処が失礼でしたか。説明を求めます。

    2014年9月2日 12:17
  • SurferOnWwwさんお気遣いありがとうございます。
    Mr.momoQZさんポレポレで行きましょう。

    http://systemartlaboratory.com/

    2014年9月3日 15:23
  • 三輪の牛さん

    ありがとう御座います。

     

    恥ずかしながら、ポレポレを知りませんでした。

    ググっちゃいました。

    ポレポレ=ゆっくり

    ですね。承知しました。


    • 編集済み Mr.momoQZ 2014年9月4日 10:54
    2014年9月4日 10:52