2010-04-12 12 views
9

Wir versuchen, MS Excel-Arbeitsmappe zu generieren, die OOXML verwendet, und Daten mit SSIS aufzufüllen. Wir sind in der Lage, Arbeitsmappe und Arbeitsblätter zu erstellen, auch Spalten zu erstellen und Daten in die Kopfzeile einzufügen. Wir können Daten auch mit SSIS auffüllen.Verwenden Sie SSIS, um Excel-Arbeitsmappe zu füllen, die mit OOXML generiert wird

Aber das Blatt (DocumentFormat.OpenXml.Spreadsheet.Sheet) und alle Zellen (DocumentFormat.OpenXml.Spreadsheet.Cell) werden OpenXmlUnknownElement. Daher können wir das Blatt/die Zelle nicht mit folgendem Code lesen: Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == "Sheet1").SingleOrDefault<Sheet>();

Wir können dieselbe Datei lesen, wenn wir sie zuerst mit MS Excel öffnen und speichern. Weiß jemand, wie man das löst?

+2

Können Sie den Code zeigen, den Sie erstellen und die Zellen hinzufügen? –

+0

Haben Sie das Dokument geschlossen, bevor Sie es erneut lesen? –

+0

ist ein Namespace beteiligt? xmlns? – D3vtr0n

Antwort

1

Sie haben wahrscheinlich vergessen, Ihrem Blatt einen Namen zu geben. Sie können dies sehen von

Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault 

mit und Sie werden sehen, dass Ihr Blattnamen entweder nicht definiert oder Müll Text.

Wenn das nicht hilft. Erstellen Sie ein einfaches Dokument in Code, speichern Sie es in OOXML und öffnen Sie es in einem XML-Viewer. dann erstellen Sie eine Kopie öffnen Sie es in Excel und speichern Sie es und sehen Sie den Unterschied in XML. Das ist oft ein guter Anfang, wenn Sie sehen, was Excel dem Dokument standardmäßig hinzugefügt hat.

Excel ist sehr tolerant gegenüber Dingen, die Sie beim Erstellen des Dokuments im Code falsch gemacht haben, und repariert sie beim erneuten Öffnen des Dokuments.

Ein schlechter Hack würde Interop verwenden, um das Dokument zu öffnen, das es im Code wieder speichert. was alles für dich reparieren würde.

Workbook wrkbk = app.Workbooks.Open(@"c:\del.xls"); 
    wrkbk.Save(); 
    wrkbk.Close();