0

いくつかの並行性の問題のために、私は複数のシートでワークブックを作成することを余儀なくされました。実行の最後に、一部のシートにはデータが含まれ、一部のシートにはデータが含まれません。SQL実行タスクを使用してシートを作成します。

ブックをループして、1行を超えないシートを削除しようとしています。つまり、行数が1以下の場合は、シートを削除してください。この質問へのポインタをいただければ幸いです。私の質問の詳細が必要な場合はお知らせください。前もって感謝します。

編集

以下は、MSDNから取得したスクリプトタスクです。エクセルシートに到達して行数をカウントできるように変更しました。カウント=1のときにシートを削除するだけです。誰かがここで私を助けてくれますか?

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Runtime;
using System.Windows.Forms;
using System.Data.OleDb;
using System.IO;

namespace ST_c346c80b4e6747688383c47a9f3e6f78.csproj
{
    [System.AddIn.AddIn("ScriptMain", Version = "1.0", Publisher = "", Description = "")]
    public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
    {

        #region VSTA generated code
        enum ScriptResults
        {
            Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success,
            Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
        };
        #endregion



            public void Main()
        {
            string count = "";
            string fileToTest;
            string tableToTest;
            string connectionString;

            fileToTest = Dts.Variables["ExcelFile"].Value.ToString();
            tableToTest = Dts.Variables["ExcelTable"].Value.ToString();

            Dts.Variables["ExcelTableExists"].Value = false;

                connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                "Data Source=" + fileToTest + ";Extended Properties=Excel 8.0";
                string SQL = "SELECT COUNT (*) FROM [" + tableToTest + "$]";
                using (OleDbConnection conn = new OleDbConnection(connectionString))
                {
                    conn.Open();
                    using (OleDbCommand cmd = new OleDbCommand(SQL, conn))
                    {
                        using (OleDbDataReader reader = cmd.ExecuteReader())
                        {
                            reader.Read();
                            count = reader[0].ToString();
                            //if (count = 1)

                        }
                    }
                    conn.Close();
                }
                //return count;
            }

       }
}

編集

さらに調査したところ、これを機能させるには、Excelの相互運用機能アセンブリを追加する必要があることがわかりました。このソリューションは140の異なるマシンに移植されるため、このオプションはありません。

4

1 に答える 1

2

残念ながら、OLEDBを使用してExcelのシートを削除することはできません。できる最善の方法は、DROPTableコマンドを使用してデータを消去することです。

connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
                     "Data Source=" + fileToTest + 
                     ";Mode=ReadWrite;Extended Properties=Excel 8.0";

string SQL = "SELECT COUNT(*) FROM [" + tableToTest + "$]";

using (OleDbConnection conn = new OleDbConnection(connectionString))
{
    conn.Open();
    using (OleDbCommand CountCmd = new OleDbCommand(SQL, conn))
    {
        int RecordCount = (int)CountCmd.ExecuteScalar();

        if (RecordCount == 1)
        {
            SQL = "DROP TABLE [" + tableToTest + "$]";
            using (OleDbCommand DropCmd = new OleDbCommand(SQL, conn))
            {
                DropCmd.ExecuteNonQuery();
            }
        }
    }
    conn.Close();
}

注:の使用Mode=ReadWrite。含める/除外することはできますが、ワークブックへの読み取り/書き込みアクセスがHDR=Yes/No必要な場合は含めないでくださいIMEX=1

ところで:単一のスカラー結果を読み取るためにOleDbDataReaderを使用する必要はありません。代わりに、ExecuteScalar()を使用してください。

OleDBを使用してこれを回避する唯一の方法は、保持するデータを新しいExcelファイルにコピーし、元のファイルを置き換えることです。ただし、これを行うと、数式や書式設定が失われます。

于 2012-12-21T12:54:40.217 に答える