Laden...

Excel-Datei erstellen in Form von *.xml

Erstellt von genuin vor 9 Jahren Letzter Beitrag vor 9 Jahren 7.278 Views
G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren
Excel-Datei erstellen in Form von *.xml

Hi!

Bin frisch hier und hoffe, das richtige Forum gefunden zu haben und dass Ihr mir ein paar Fragen beantworten könnt 🙂

Zu meinem Anliegen:
Ich habe Daten, die wie eine ganz normale Excel-Tabelle dargestellt werden können. Diese sind programmatisch in meinen Klassen hinterlegt (Workbook, Worksheets, Wert einer Zelle, ForeColor, BackColor, Borders etc).

Ein *.xml-File kann man auch mit Excel öffnen - dort wird einem dann diese Tabelle angezeigt. Ich möchte nun ein Excel-File (mit Worksheets, in denen die Daten liegen) erstellen, das als *.xml-File existiert.

Aufgebaut ist das *.xml-File mit

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"

u.s.w.

Ich habe die Suchfunktion des Forums genutzt sowie einiges gegooglet, hoffe aber nun hier Hilfe zu finden. Wie realisiere ich am besten das Erstellen eines solchen "Xml-Files?". Langt es, lediglich das Schema programmatisch zu erstellen oder muss man noch etwas berücksichtigen. Bin auf diesem Gebiet nicht wirklich bewandert.

Für Eure Hilfe wäre ich sehr dankbar 🙂

Überleg ich mir noch

1.029 Beiträge seit 2010
vor 9 Jahren

Hi,

das ist SpreadsheetML/OpenXml - dafür gibt es auch ein SDK etc. pp.

Such am besten nach OpenXml-SDK... Da kommen dann in aller Regel aber Excel-Dateien raus.

Alternativ (davon würde ich abraten, da hier nicht wirklich viel geprüft wird) kannst du auch als Basis einfache XML-Bearbeitungsmethoden anwenden. Startpunkt dafür wäre das XDocument.

LG

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Danke erstmal für Deine Nachricht 😃
Diese Möglichkeit hatte ich schon getestet, damit ich kann ich problem *.xlsx Dateien erstellen.

Allerdings möchte ich ja *.xml Dateien mit entsprechender Formatierung haben. Langt es auch, wenn ich mir das Schema eines Excel-Xml-Files ansehe und dies einfach programmatisch mit beispielsweise xml.WriteLine("?xml....); festlege?

Überleg ich mir noch

W
872 Beiträge seit 2005
vor 9 Jahren

Ein xlsx ist ein OpenXML Dokument, daß anschliessend gezippt ist.
Also könntest Du ein xlsx erstellen und dann entzippen.

F
10.010 Beiträge seit 2004
vor 9 Jahren

Naja, wenn ich bei der Suchmaschine meiner Wahl "Excel xml writer" eingebe bekomme ich als ersten Eintrag
Excel XML Writer /Reader

und meinen Favoriten als 2.
Library to Generate Excel XML Workbooks in .NET

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Ein xlsx ist ein OpenXML Dokument, daß anschliessend gezippt ist.
Also könntest Du ein xlsx erstellen und dann entzippen.

Habe es nun geschaftt, meine Daten entsprechend in ein *xlsx rauszuschreiben. Das mit dem umbenennen in *.zip und entpacken eröffnet mir aber mehrere *.xml Dateien. Gibt es eine einfache, programmatische Möglichkeit, das komplette *xlsx in EIN xml-File zu schreiben? Komplizierte Umschreibungen via Access taugen mir leider nicht

Überleg ich mir noch

16.842 Beiträge seit 2008
vor 9 Jahren

Nein; OpenXML ist nun mal der mittlerweile aktuelle Standard. Danach musst Du Dich einfach orientieren.

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Okay, werde mir ein paar Ideen hierzu machen und das Ergebnis dann reinstellen

Edit: Habe eben bemerkt, dass es ausreichend ist, das *.xlsx File zu erstellen.
Später werde ich mir bei Bedarf das File zu *xml machen

Hilfreiche Seiten, die ich hierzu gefunden habe, möchte ich Euch nicht vorenthalten:

XML aus einer Text- oder Excel-Datei erzeugen
SpreadsheetML
Struktur eines SpreadsheetML-Dokuments (Open XML SDK)
Vorgehensweise: Einfügen von Text in eine Zelle in einem kalkulationstabellendokument (Open XML SDK)

Überleg ich mir noch

L
168 Beiträge seit 2008
vor 9 Jahren

Rainbird hat ein Snippet dazu:

Excel-Export ohne Excel

Ab Office 2010 muss man die so erstellten Dateien (SpreadsheetML) zwingend als .xml speichern. Als xls/xlsx gespeichert kann man sie zwar öffnen, kriegt aber eine Warnung.

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Probiere ich mal aus - bei 2007, wenn ich die Dateiendung *.xml assoziier erhalte ich eine Warnung, mit *.xlsx nicht

Überleg ich mir noch

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Bin jetzt einige Schritte weiter und kann nun:

  1. Mein *.xml (bzw. *.xlsx) File erstellen
  2. Werte in Zellen schreiben

Jedoch (auch nach der Suche hier im Forum) finde ich nichts, wie ich für Zellen ForceColor, BackColor oder Borders bestimmen kann.

Kann mir dabei jemand helfen?

Momentan erstelle ich mein File so und schreibe etwas in eine Zelle (A1) hinein (die weiteren Unterfunktionen gebe ich jetzt nicht mit an.


public void SaveAs(string FileName, fileextension Fileextension = fileextension.xlsx, bool overwrite = true)
        {
            string[] _fileextension = { ".xml", ".xlsx" };
            //Create spreadsheetdocument
            SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(FileName + _fileextension[(int)Fileextension], SpreadsheetDocumentType.Workbook);

            //Add new workbookpart
            WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
            //Create new workbook
            workbookpart.Workbook = new Workbook();

            //Add new worksheetpart      
            WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
            //Create new worksheet
            worksheetPart.Worksheet = new Worksheet(new SheetData());

            //Add sheets to the workbook
            Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());

            //Append my sheets
            if (_workSheets.Count == 0)
            {
                Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Sheet1" };
                sheets.Append(sheet);
                workbookpart.Workbook.Save();
                spreadsheetDocument.Close();
            }
            else
            {
                workbookpart.Workbook.Save();
                spreadsheetDocument.Close();

                InsertText(FileName + _fileextension[(int)Fileextension], "Ein TestText");

            }
        }

Überleg ich mir noch

W
872 Beiträge seit 2005
vor 9 Jahren

Ich habe das bisher immer durch Excel selber herausgefunden, in dem ich ein Testsheet in Excel abgespeichert habe, xlxs entzippt und dann das xml angeschaut habe.

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Habe kurz nach meinem Post etwas gefunden, womit man arbeiten kann:

Cell styles in OpenXML spreadsheet (SpreadsheetML)

Arbeite damit und poste dann meine Erfahrungen damit hier. Evtl hilft es einem anderen weiter 😃

Überleg ich mir noch

G
genuin Themenstarter:in
41 Beiträge seit 2014
vor 9 Jahren

Komme sehr gut voran, arbeite momentan mit Stylesheets, um mein Excel-File Font-, Border- und Colortechnisch anzupassen.

Nur steh ich gerade völlig auf dem Schlauch, ich hoffe es hat jemand eine Idee:
Korrigiert mich, wenn ich falsch liege:

Ich bastel mir eine Klasse, wo ich das Stylesheet definiere (Borders, Fonts, NumberingFormats etc). Diese nenne ich beispielsweise

AdaptedStylesheet().

Dieser AdaptedStylesheet übergebe ich nun die Werte einer Zelle in meiner Klasse (die Zelle enthält Werte wie Border, Font, Color etc). Das sieht dann so aus:

stylesPart.Stylesheet = new AdaptedStylesheet(ws.Cell(row, column).Border, ws.Cell(row, column).Font, ws.Cell(row, column).Value, ws.Cell(row, column).ForeColor, ws.Cell(row, column).BackColor);
                            stylesPart.Stylesheet.Save();       

dann adde ich eine Zelle mit

newRow.AppendChild( new Cell() { CellValue = new CellValue (GetCellValue(ws.Cell(row, column).Value) == CellValues.Boolean ? ws.Cell(row, column).Value.ToString().ToLower() :  ws.Cell(row, column).Value.ToString()),
                                                             DataType = GetCellValue(ws.Cell(row, column).Value), 
                                                             StyleIndex = 0});

Jetzt habe ich aber folgendes Problem: Wenn ich mein Excel-file öffne, liegen alle Zellen in der Stylesheet-Form der letzten erstellten Zelle vor. Anscheinend wird mit jeder neuen Zelle, die erstellen wird, der Style für das ganze Worksheet neu bestimmt.

Gilt das Stylesheet etwa für ein ganzes Worksheet?
Wie kann ich darfür sorgen, dass ich dieses AdaptedStyleSheet() für jede Zelle individuell erstellen? Oder verstehe ich hier etwas vollkommen falsch?

Überleg ich mir noch