Note: Forums will be making significant UX changes to address key usability improvements surrounding search, discoverability and navigation. To learn more about these changes please visit the announcement which can be found HERE.
oledbでExcelブックにシートを作成しデータを書き込んだシート名の実態について

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

  • 2012年4月8日 8:36
     
     

    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日 9:34
     
     

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

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

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

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

  • 2012年4月9日 0:59
    モデレータ
     
     回答済み

    シート名を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月11日 1:23
     
     

    返信ありがとうございます

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

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

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