Autor Beitrag
Old5chool
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 11.08.16 13:14 
Hallo ich habe ein problem, ich habe einen Code geschrieben mit dem ich eine excel datei überarbeiten kann, nur bekomme ich nicht die überschriften formatirung hin.
Denn sie überträgt sich nach und nach auf die anderen zeilen kann mir jemand helfen ???

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
using System;
using System.Windows.Forms;
using System.Xml.Linq;
using System.IO;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;


        public string Ziel = @"C:\test.xls";
        public string temp = @"C:\Windows\Temp\ablage.xls";

        private void Speichern_Click(object sender, EventArgs e)
        {
            File.Copy(Ziel, temp);
            // Für die wiederholte Ausführung der Demo die Datei zunächst aus einem
            // Original umkopieren
            if (File.Exists(Path.Combine(Application.StartupPath, Ziel)))
                File.Delete(Path.Combine(Application.StartupPath, Ziel));
                File.Copy(Path.Combine(Application.StartupPath, temp),
                Path.Combine(Application.StartupPath, Ziel));

            // Excel-Instanz erzeugen und sichtbar schalten
            Excel.Application excel = new Excel.ApplicationClass();
            
            excel.Visible = false;

            // Arbeitsmappe öffnen
            object missing = Missing.Value;
            string fileName = Path.Combine(Application.StartupPath, Ziel);
            Excel.Workbook workbook = excel.Workbooks.Open(fileName, missing, missing, missing,
                missing, missing, missing, missing, missing, missing, missing, missing, missing,
                missing, missing);
            
            // Arbeitsblatt 'test' referenzieren
            Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets["test"];
            
           

            // Suchen der ersten Zeile, die in der ersten Spalte keine Daten mehr enthält
            int row = 0;
            Excel.Range range = null;
            
            do
            {
                row++;
                range = (Excel.Range)worksheet.Cells[row, 1];
                if (range.Value2 == null)
                    break;
            } while (true);

            // Die erste Zelle der letzten Datenzeile referenzieren
            range = (Excel.Range)worksheet.Cells[row + 11];
            

            // Alternative: Ausgehend von der Zelle A1 die letzte Zelle suchen, die noch Daten enthält
            range = worksheet.get_Range("A2", missing).get_End(Excel.XlDirection.xlUp);
            
            //// Eine Zeile einfügen
            range.EntireRow.Insert(missing, missing);
            
            // Formatieren der Überschrift
            Excel.Range myRangeHeadline = null;
            myRangeHeadline = worksheet.get_Range("A1", ("H1"));
            myRangeHeadline.Font.Bold = true;
            myRangeHeadline.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
            myRangeHeadline.Borders.Weight = Excel.XlBorderWeight.xlThick;


            // Daten eingeben


            worksheet.Cells[21] = Datum.Text;
            worksheet.Cells[22] = Zeit.Text;
            worksheet.Cells[23] = 1_com.Text.ToString();
            worksheet.Cells[24] = 2.Text + "ml";
            worksheet.Cells[25] = pi;
            worksheet.Cells[26] = Ka;
            worksheet.Cells[27] = kon_com.Text.ToString();
            worksheet.Cells[28] = Tro;

            // Überschriften eingeben
            worksheet.Cells[11] = "Datum";
            worksheet.Cells[12] = "Zeit";
            worksheet.Cells[13] = "Tri";
            worksheet.Cells[14] = "Me";
            worksheet.Cells[15] = "Pi";
            worksheet.Cells[16] = "Ka";
            worksheet.Cells[17] = "Kon";
            worksheet.Cells[18] = "Tro";

            

            // Arbeitsmappe speichern
            workbook.Save();
            File.Delete(Path.Combine(Application.StartupPath, temp));
            File.Copy(Path.Combine(Application.StartupPath, Ziel),
            Path.Combine(Application.StartupPath, temp));
            // Excel beenden
            excel.Quit();
            File.Delete(temp);
        }
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 11.08.16 13:19 
Ohne das jetzt genau geprüft zu haben aber wäre es nicht einfach möglich erst die Daten vollständig zu setzen und dann zu formatieren?
Old5chool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 11.08.16 13:24 
ja das wäre eine idee ich probiere es mal aus danke,

hat leider nicht so geklappt wie ich es gerade gedacht habe den wenn ich die datei dan wieder über arbeite zieht er die formatierung wieder mit runter
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 11.08.16 13:37 
Ebenfalls ohne es probiert zu haben (oder genau verstanden) die Beispiel im Netz hängen noch ein .Merge(false); an den Aufruf von get_Range.
GeraldVonRiva
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19
Erhaltene Danke: 2



BeitragVerfasst: Do 11.08.16 14:16 
Hallo

ich nutze für Zellenbereich immer die Funktion Excel.Worksheet.Cell[1,1]. Probier es mal damit.

Wichtig ist auch das ein Excel.Range ebenfalls wieder freigegeben werden muss.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
Excel.Worksheet excel_wsheet;

Excel.Range excel_range = null;

excel_range = excel_wsheet.get_Range(excel_wsheet.Cells[11], excel_wsheet.Cells[11]);

if (excel_range != null)
{
     Marshal.FinalReleaseComObject(excel_range);
     excel_range = null;
}
Old5chool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19



BeitragVerfasst: Do 11.08.16 14:33 
mit der freigabe habe ich keine probleme nur das meine formatierung aus der ersten reihe wo sie hin soll sich beim nächsten speichern mit auf die 2te zeile setzt
GeraldVonRiva
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19
Erhaltene Danke: 2



BeitragVerfasst: Do 11.08.16 14:38 
Du öffnest die Exceldatei einmal und alles funktioniert. Du öffnest die selbe Datei noch einmal und deine Formatierung landet in der zweiten Zeile?
GeraldVonRiva
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 19
Erhaltene Danke: 2



BeitragVerfasst: Do 11.08.16 14:56 
Mit dem debuggen und dem anzeigen von Excel kann man ganz gut sehen was passiert.

deine Zeile

ausblenden C#-Quelltext
1:
range.EntireRow.Insert(missing, missing);					


fügt immer vor der Zeile A eine neue ein, somit rutscht alles danach eine Zeile tiefer. Die Formatierung wird dann aber nur für die erste Zeile gesetzt. Jedoch die alte Formatierung nicht gelöscht.