2009-08-03 17 views
1

データベースからExcelシートにデータをインポートしています。このために、私はdatareaderを使用しています。 Excelシートテンプレートにはいくつかのマクロがあり、数式は計算されておらず、通常のExcelワークシートではありません。特定のセルに書き込むことができる場合にのみ、Excelシートにデータを書き込む必要があります。そうでない場合は、データをインポートしないでください。C#を使用してセルがEXCELで読み取り専用かどうかを確認するには

これはXMLファイルで、どの列から書き込みを開始するべきか、そしてどの行に停止するべきかを示しています。私はこれを多くのシートに対して行っています。しかし、1つのシートでは、行の最初のセルは「読み取り専用」(ロック)で、残りは書き込みアクセスが許可されています。

DBからDatareaderを使用して行全体を取得したので、ロックされたセルに書き込むことなく、他のセルに書き込む必要があります。

参考用にコードスニペットを添付しています。

これを手伝ってください。

サンプル::

if (reader.HasRows) 
    { 
    minRow = 0; 
    minCol = 0; 
    Excel.Workbook SelWorkBook = excelAppln.Workbooks.Open(curfile, 0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "", true, false, 0, false, false, false); 
    Excel.Sheets excelSheets = SelWorkBook.Worksheets; 

Excel.Worksheet excelworksheet = (Excel.Worksheet)excelSheets.get_Item(CurSheetName); 

             // Process each result in the result set 
             while (reader.Read()) 
             { 
              // Create an array big enough to hold the column values 
              object[] values = new object[reader.FieldCount]; 

              // Add the array to the ArrayList 
              rowList.Add(values); 

              // Get the column values into the array 
              reader.GetValues(values); 

              int iValueIndex = 0; 

              // If the Reading Format is by ColumnByColumn 
              if (CurTaskNode.ReadFormat == "ColumnbyColumn") 
              { 
               minCol = 0; 
               // minRow = 0; 
               for (int iCol = 0; iCol < CurTaskNode.HeaderData.Length; iCol++) 
               { 

                // Checking whether the Header data exists or not 
                if (CurTaskNode.HeaderData[minCol] != "") 
                { 
                 // Assigning the Value from reader to the particular cell in excel sheet 
                 excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex]; 
                 iValueIndex++; 

                } 
                minCol++; 
               } 
               minRow++; 
              }SelWorkBook.Close(true, curfile, null); 

これを解決するには、私を助けてください。

は、あなたが全体の行マイナス最初の列を持つように(配列をスライスまずあなたはそれがロックされて、その後場合は、最初のセルのロックされたプロパティをチェックする必要があり、

RAMM

+0

あなたはいくつかのコードを掲載しました、あなたはそれが何をしているのか、なぜそれがあなたにとってうまくいかないのかを説明していませんか? –

+0

申し訳ありませんが、私は忘れてしまった。 このコードは、リーダーに行がある場合にDBからデータを読み取ります。次に、新しいプリロードされたExcelテンプレートファイルを開き、リーダーデータをValuesオブジェクトに割り当てます。 XMLファイルのヘッダー長(HeaderData.Length)に対して、各Excelセルに書き込み、最後にファイルを保存して閉じます。 データが書き込まれる場所は、excelworksheet.Cells [CurTaskNode.DATA_MIN_ROW + minRow、CurTaskNode.DATA_MIN_COL + minCol] = values [iValueIndex]です。 //セルに書き込むかどうかを実際にチェックする必要があります。私はそれをすることができません。 Plsのヘルプ – Ramm

+0

私は新しい答えを投稿し、それを試してみました。 –

答えて

0

[OK]を、ありがとうございました)、シートに書き込みます。ここではいくつかのコード、必ずしも正確なSLICE機能だけで擬似コードで、C#で配列をスライスの異なるいくつかの方法があり、お好みの方法を使用していないです:

if (!excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + 1].Locked) 
{ 
    excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values[iValueIndex]; 
    iValueIndex++; 
} 
else 
{ 
    excelworksheet.Cells[CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = values.SLICE(iValueIndex); 
    iValueIndex++; 
} 
+0

こんにちはランス、このdidntのがうまく.. 私はこれを使用する場合は、範囲は次のように使用することカント言う私はDataReaderを使用していますし、それが全体の読み込みと...そのオブジェクトが変数 のように使用..butデータベースから行を取得すると、行全体がExcelシートに書き込まれます。 それで、その行に他のセルが書き込まれます。 私のreqは最初の行でのみ最初のセルをスキップしています。第1行にセルの残りの部分を書き込む。 2行目以降は、2行目のすべてのセルに対して通常の書き込みを行います。 コードを変更してください。 – Ramm

+0

ええと、私はそれをもっと詳しく見なければなりませんが、少し時間がかかるかもしれません。誰もそれを複製しないように答えを残しておきます。 –

関連する問題