2009-08-03 6 views
1

Ich importiere Daten in Excel-Tabellen aus einer Datenbank. Dazu benutze ich den Datenreader. Die Excel-Sheet-Vorlage hat einige Makros und wenige Formeln berechnet und es ist nicht das normale Excel-Arbeitsblatt. also muss ich die Daten nur in das Excel-Blatt schreiben, wenn die bestimmte Zelle schreiben darf. Wenn nicht, sollten die Daten nicht importiert werden.Wie überprüfen Sie, ob eine Zelle in EXCEL mit C# gelesen wird

Also dafür habe ich eine XML-Datei, die besagt, aus welcher Spalte ich anfangen soll zu schreiben und in welcher Zeile es aufhören soll, das habe ich für viele Blätter getan. Aber in einem Blatt ist die erste Zelle der Zeile "readonly" (gesperrt) und der Rest ist Schreibzugriff erlaubt.

Da ich die gesamte Zeile von DB mit Datareader bekomme, bin ich mit dem Schreiben in die anderen Zellen stecken, ohne in die gesperrte Zelle zu schreiben.

Ich füge das Code-Snippet als Referenz an.

Bitte helfen Sie mir dabei.

Probe ::

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); 

Bitte helfen Sie mir dies bei der Lösung.

Danke,

Ramm

+0

Sie einige Code geschrieben haben, aber du hast nicht erklärt, was es tut oder warum es nicht für dich funktioniert? –

+0

Sorry, ich habe es vergessen. Dieser Codeabschnitt liest die Daten aus der Datenbank, wenn der Reader Zeilen enthält. Anschließend wird eine neue vorinstallierte Excel-Vorlagendatei geöffnet und die Leserdaten dem Values-Objekt zugewiesen. Dann für die Header-Länge (HeaderData.Length) in XML-Datei schreibt es in die einzelnen Excel-Zelle und schließlich speichert es die Datei und schließt. Die Position, an der die Daten geschrieben werden, ist excelworksheet.Cells [CurTaskNode.DATA_MIN_ROW + minRow, CurTaskNode.DATA_MIN_COL + minCol] = Werte [iValueIndex]; // Eigentlich muss eine Überprüfung durchgeführt werden, ob in die Zelle geschrieben werden soll. Ich kann das nicht machen. Pls Hilfe – Ramm

+0

Ok, ich habe eine neue Antwort geschrieben, probieren Sie es aus. –

Antwort

0

Ok, müssen Sie zuerst die verriegelte Eigenschaft der ersten Zelle überprüfen, dann, wenn sie in Scheiben schneiden das Array gesperrt ist (so dass Sie die ganze Zeile minus der ersten Spalte), dann schreibe auf das Blatt. Hier einige Code ist, nicht unbedingt exakt, die SLICE-Funktion ist nur Pseudo-Code, gibt es eine Reihe von verschiedenen Möglichkeiten von Arrays in C# schneiden, verwenden Sie die Methode Ihrer Wahl:

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

Hallo Lance, arbeiten diese nur knapp sein Ziel aus .. Wenn ich das, es sagt Bereich wie folgt verwendet werden kann nicht ... seine Aufgabe ..aber wie eine Variable verwendet Als ich Datareader verwenden und es liest gesamtes Zeile aus der Datenbank schreibt es auch ganze Zeile in das Excel-Blatt. so wird es die anderen Zellen in dieser Zeile schreiben .. Mein Req ist überspringen nur erste Zelle in der ersten Zeile. und schreibe Rest der Zellen in die erste Reihe. Ab der zweiten Zeile schreibt sein normaler .. für alle Zellen in der zweiten Zeile. Bitte helfen Sie mir den Code dafür zu ändern. – Ramm

+0

Ok, ich muss es genauer betrachten, aber es könnte ein wenig dauern. Ich lasse die Antwort für den Moment so, dass niemand es duplizieren wird. –