2

約 75 のスプレッドシートからデータをマイニングして Oracle テーブルにインポートするプログラムを作成しました。接続し、シートを反復処理し、セルと行を一見問題なく取得できます。問題は、グループ化された行が折りたたまれた状態で Excel シートが保存された場合、行がスキップされることです。入力時にグループを拡張できる拡張プロパティまたは reg 設定がある場合、どこにも見つかりませんか? 折りたたまれたグループを回避する方法がわかりません (結合されたセルではなく、問題なく処理できるもの)。

コードビット:

//Starting where I iterate through a particular sheet

var connectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0; data source={0};    Extended Properties=\"Excel 12.0;HDR=NO;IMEX=1;ReadOnly=0\"", fileName);
OleDbConnection objConn = new OleDbConnection(connectionString);

try
{   
objConn.Open();
System.Data.DataTable dt = objConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });

if (dt != null)
{
    foreach (DataRow row in dt.Rows)
    {
        var adapter = new OleDbDataAdapter("SELECT F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12 FROM [" + row["TABLE_NAME"].ToString() + "]", connectionString);
        var ds = new DataSet();
        try
        {
            adapter.Fill(ds, "anyname");
        }
        catch
        {
            break;
        }
        DataTable data = ds.Tables[0];
        int rownum = 0; 

        // <a bunch of variable declarations>

        foreach (DataRow row_b in data.Rows)
        {
            // start slogging through the rows
            rownum = rownum++;
            // <reset some variables>
            if (rownum == 1) // Catch valid scripts that contain a number
            {
                foreach (DataColumn column in data.Columns)
                {
                    if (column.ToString() == "F1")
                    {
                    // <processing code for this column>
                    }
                    if (column.ToString() == "F2")
                    {
                    //  <processing code for this column>
                    }
                    if (column.ToString() == "F3")
                    {
                    //  <you get the picture>
                    }
                }
        }
            if (rownum == 3)
            {
                // <moving along through the rows...different processing>
            }
                // <..rows 4-11..>

            if (rownum > 12 )
            {
                // <more value assignment>
            }

            string allvals = APPLICATION + E_USER + STEP_DESC + VARIATIONS + STATUS + STOPS_TESTING + ISSUE_NUM + ISSUE_COMMENTS + ADDITIONAL_INFO;
            allvals = allvals.Trim();

            //Don't want sheets that come across as Print Area this shouldn't affect the row processing 
            isPrintArea = 0;
            if (BOOKSHEET.Contains("Print_Area"))
            {
                isPrintArea = 1;
            }

            Boolean addornot=false;
            if (cb_forallscripts.Checked == true) 
            {
                addornot = (STEP_NUM != 0 &&
                allvals != "" &&
                isPrintArea == 0 &&
                SCRIPT_NUM != 0);
            }
            else
            {
                addornot = (STEP_NUM != 0 &&
                allvals != "" &&
                isPrintArea == 0 &&
                SCRIPT_NUM != 0 &&
                runScripts.Contains(SCRIPT_NUM.ToString()));
            }
            if (addornot)
            {
                //<connect to our Oracle db, I set up oCmd outside this> 
                OracleCommand oCmd = new OracleCommand();
                oCmd.Connection = oConn;
                oCmd.CommandType = CommandType.Text;
                oCmd.Parameters.Add("STEP_NUM", STEP_NUM);
                // <... bunch of parameters ...>
                oCmd.Parameters.Add("script", SCRIPT);
                oCmd.CommandText = "<My insert statement> ";
                oCmd.ExecuteNonQuery();
               }
            }
        }
    }
}
catch ( <error processing>)
{ }
4

1 に答える 1

0

Rows.OutlineLevel は、探している VBA プロパティである必要があります。読み取りまたは設定できます。Microsoft のかなり簡潔な説明については、このページを参照してください。Range.ClearOutline は、ここで説明されているように、指定された範囲のアウトラインをクリアします。

于 2013-01-04T18:33:41.707 に答える