none
oledbでExcelブックにシートを作成しデータを書き込んだシート名の実態について RRS feed

  • 質問

  • asp.netで開発しています。

    アプリケーションのイベントでディレクトリに格納されたExcelブックにSheet1を作成してデータを書き込んでいます。

    書き込まれたExcelブックのシート名をSheet1→workに名前の変更し、ディレクトリに格納しイベントを実行すると

    「OleDb.OleDbException: テーブル 'Sheet1' は既に存在しています。」というメッセージが出力されます。

    Excelの仕様ではと思い、ローカルで新規でExcelブックを作成後、Sheet1→workに変更後、ディレクトリに格納しイベントを実行すると

    正常にSheet1にデータは書き込まれていました。

    アプリケーションから実行して書き込んだシートについては、名前を変更しても変更前のシート名は実態としてどこかに残っているのでしょうか?

    ご教授お願いします。

    実ソースは以下になります。

    'カラム名の設定
    With sbSQL
        .Remove(0, .Length)
        .AppendLine("CREATE TABLE [Sheet1] ( ")

        For i = 0 To dataTable.Columns.Count - 1
            If i <> dataTable.Columns.Count - 1 Then
                If i <> dataTable.Columns.Count - 2 Then
                    .AppendLine(dataTable.Columns.Item(i).ColumnName & " " & "CHAR(255), ")
                Else
                    .AppendLine(dataTable.Columns.Item(i).ColumnName & " " & "CHAR(255) ")
                End If
            Else
                .AppendLine(") ")
            End If
        Next
    End With

    Using cmd As New OleDbCommand(sbSQL.ToString, con)
        cmd.ExecuteNonQuery()
    End Using


    'データの設定
    With sbSQL
        .Remove(0, .Length)
        .AppendLine("INSERT INTO [Sheet1] VALUES ( ")

        For i = 0 To dataTable.Columns.Count - 1
            If i <> dataTable.Columns.Count - 1 Then
                If i <> dataTable.Columns.Count - 2 Then
                    .AppendLine(dataTable.Columns.Item(i).ColumnName & ", ")
                Else
                    .AppendLine(dataTable.Columns.Item(i).ColumnName)
                End If
            Else
                .AppendLine(") ")
            End If
        Next
    End With


    '書き込み
    Using cmd As New OleDbCommand(sbSQL.ToString, con)
        For i = 0 To dataTable.Rows.Count - 1
            cmd.Parameters.Clear()
            For j = 0 To dataTable.Columns.Count - 1
                cmd.Parameters.Add(New OleDbParameter(dataTable.Columns.Item(j).ColumnName, dataTable.Rows(i).Item(j)))
            Next
            cmd.ExecuteNonQuery()
        Next
    End Using

    2012年4月8日 8:36

回答

  • シート名をworkへ変更する処理はどこでどのようにされていますか? 私の知る限りOleDbではできなかったと思いますが、サーバーにおいて手動で変更されているのでしょうか?
    また、以下に有名なリンクを貼っておきますが、サーバーにおいてOfficeを操作することは推薦されておらず、安定して動作することは保障されていません。

    Office のサーバーサイド オートメーションについて
    http://support.microsoft.com/kb/257757/ja


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク yukimai 2012年4月11日 1:19
    2012年4月9日 0:59
    モデレータ

すべての返信

  • > asp.netで開発しています。

    ASP.NET の Web アプリの一部かもしれませんが、書いてあることは
    全く ASP.NET とは関係ありません。

    前にも何度もお願いしましたが適切なフォーラムで質問されることを
    お勧めします。

    その方が、質問者にも、回答者にも、閲覧者にも好ましいのは間違い
    ないと思います。

    2012年4月8日 9:34
  • シート名をworkへ変更する処理はどこでどのようにされていますか? 私の知る限りOleDbではできなかったと思いますが、サーバーにおいて手動で変更されているのでしょうか?
    また、以下に有名なリンクを貼っておきますが、サーバーにおいてOfficeを操作することは推薦されておらず、安定して動作することは保障されていません。

    Office のサーバーサイド オートメーションについて
    http://support.microsoft.com/kb/257757/ja


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク yukimai 2012年4月11日 1:19
    2012年4月9日 0:59
    モデレータ
  • 返信ありがとうございます

    アプリケーションからExcelブックやシートを作成した場合には

    ブックとシートの定義つけがされているようです。

    シート名をリネームしても定義つけはリネーム前のままのためが原因と理解しました。

    2012年4月11日 1:23