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
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
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
Ein xlsx ist ein OpenXML Dokument, daß anschliessend gezippt ist.
Also könntest Du ein xlsx erstellen und dann entzippen.
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
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
Nein; OpenXML ist nun mal der mittlerweile aktuelle Standard. Danach musst Du Dich einfach orientieren.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
Rainbird hat ein Snippet dazu:
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.
Probiere ich mal aus - bei 2007, wenn ich die Dateiendung *.xml assoziier erhalte ich eine Warnung, mit *.xlsx nicht
Überleg ich mir noch
Bin jetzt einige Schritte weiter und kann nun:
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
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.
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
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