0

ExcelスプレッドシートでAlterテーブルを使用して、既存のスプレッドシートに新しい列を追加しようとしましたが、ExcelでAlterテーブルを使用できないことがわかりました。

ネットを閲覧したところ、select intoを使用して、新しい列を含む複製ワークシートを作成できることがわかりました。これのコードは次のとおりです。

static private bool CopyAndCreateNewSheet()
        {
            try
            {
                DataTable dataTable = new DataTable();
                using (OleDbConnection conn = new OleDbConnection(ConfigHelper.ConnectionStringReadWriteWorkBook))
                {
                    conn.Open();
                    //string selectQuery = "SELECT 0 As IsProcessed, * INTO [Copy] FROM [" + ConfigHelper.WorkSheetName + "$]";
                    string selectQuery = "SELECT 0 As IsProcessed, * INTO [Excel 12.0;HDR= Yes;DATABASE=c:\\data\\Apr12.xlsx].[copyd]  FROM [" + ConfigHelper.WorkSheetName + "$]";

                    OleDbCommand cmd = new OleDbCommand(selectQuery, conn);
                    int count = cmd.ExecuteNonQuery();

                    MessageBox.Show(count.ToString());

                    conn.Close();
                }

            }
            catch (OleDbException e)
            {
                MessageBox.Show(e.Message.ToString());

            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }


            return true;
        }

connectionstringの設定は次のとおりです。

<add name="ReadWriteWorkBook" connectionString='Provider = Microsoft.ACE.OLEDB.12.0; Data Source="c:\data\Apr12.xlsx"; Extended Properties="Excel 12.0;HDR=Yes;READONLY=FALSE"'/>

コメント付きのクエリとコメントなしのクエリの両方でselectを実行しようとしましたが、うまくいきませんでした...

上記のメソッド呼び出しの後でワークブックを開くと、次のエラーが発生します。「Excelでファイルに読み取り不能な接続が見つかりました。このブックの内容を復元しますか?このブックのソースを信頼できる場合は、[はい]をクリックしてください。」

[はい]をクリックすると、新しいタブが表示され、新しいヘッダーも表示されますが、Excelによってデータが削除されたため、データが表示されません。

どんな助けでも大歓迎です。

前もって感謝します。

4

1 に答える 1

0

こんばんは

これを複製して、完全に機能させることができました。私が使用したコードは次のようになります。

    public static void Main(string[] Arguments)
    {
        try
        {
            string sConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\"Test.xlsx\";Extended Properties=\"Excel 12.0;HDR=Yes;READONLY=FALSE\"";

            DataTable dataTable = new DataTable();
            using (OleDbConnection conn = new OleDbConnection(sConnectionString))
            {
                conn.Open();

                string selectQuery = "SELECT 0 As IsProcessed, * INTO [Excel 12.0;HDR= Yes;DATABASE=Test.xlsx].[copyd]  FROM [TestWorkSheet1$]";

                OleDbCommand cmd = new OleDbCommand(selectQuery, conn);
                int count = cmd.ExecuteNonQuery();

                Console.WriteLine(count.ToString());

                conn.Close();
            }

        }
        catch (OleDbException e)
        {
            Console.WriteLine(e.Message.ToString());

        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
    }

このコードは、コンソール アプリケーション内で実行するために若干変更されていることに注意してください。ただし、これは実際にはまったく役に立ちません。Excel を使用するのは非常に面倒な場合があります。次の調査を検討したことがありますか。

  • 権限
  • 元のファイルは Excel で問題なく開きますか (つまり、そもそもそのファイルを Excel で読み取ることができますか?)
  • Excel はどうにかして TSR を実行し、何らかの形でプロジェクトに干渉していますか? 通常、Excel が適切に閉じられていない場合に、これが発生するのを見たことがあります。

幸運を。

乾杯!

于 2012-08-21T06:03:21.367 に答える