hinzufügen ich momentan meinen Kopf mache hier in der Arbeit über die OpenXML 2.5 Framework auf der MSDN-Website, https://msdn.microsoft.com/en-us/library/office/cc861607.aspxOpenXML Cell Arbeitsblatt
Alle Methoden, die ich versucht habe, eine Zelle zu einem vorhandenen Arbeitsblatt korrupt die Arbeitsmappe als das hinzufügen Auf der MSDN-Website wird nur das Erstellen des Arbeitsblatts und das Ändern des Arbeitsblatts skizziert.
Jedes Mal, wenn ich eine Zelle hinzufüge, will das System ein ganz neues Arbeitsblatt und erlaubt nicht das Hinzufügen einer Zelle zu einem vorhandenen Arbeitsblatt. Ich habe mir stundenlang den Kopf geschlagen, über MSDN gegangen und das ohne Glück gegoogelt.
Das Problem ist, ich brauche eine Klasse, die Zeichenfolgen empfangen und die Excel-Datei aktualisieren kann. Hat jemand eine Zelle zu einem vorhandenen Arbeitsblatt hinzufügen können? Mein Problem scheint auf eine String-für-String-Lösung zurückzuführen zu sein.
Arbeitseingang (Powershell) funktioniert nur, wenn ein neues Arbeitsblatt für die Zelle erstellt wird,
[CmdletBinding(SupportsShouldProcess=$true, ConfirmImpact='Medium')]
$cSharpData = (
[Reflection.Assembly]::LoadWithPartialName("DocumentFormat.OpenXml"),
[Reflection.Assembly]::LoadWithPartialName("WindowsBase"),
[Reflection.Assembly]::LoadWithPartialName("System.Linq")
)
[String]$cSharpClass = Get-Content .\method.cs
$cSharpType = Add-Type -ReferencedAssemblies $cSharpData -TypeDefinition $cSharpClass
$testData = Get-WmiObject Win32_QuickFixEngineering
[DoExcelMethod]::CreateXLSX('.\test.xlsx')
$locNo = 1
[DoExcelMethod]::AddSheetData('.\test.xlsx', $testData, 'TestWS', 'A', $locNo)
Die Datei ist dies Punkt hat die folgenden,
using System;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
public class DoExcelMethod {
private static int SharedDataItem(string sData, SharedStringTablePart ssPart) {
if (ssPart.SharedStringTable == null) {
ssPart.SharedStringTable = new SharedStringTable();
}
int cnt = 0;
foreach (SharedStringItem sspItem in ssPart.SharedStringTable.Elements<SharedStringItem>()) {
if (sspItem.InnerText == sData) {
return cnt;
}
cnt++;
}
ssPart.SharedStringTable.AppendChild(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text(sData)));
ssPart.SharedStringTable.Save();
return cnt;
}
private static WorksheetPart InsertWorksheet(string wsName, WorkbookPart wbPart) {
WorksheetPart newWsPart = wbPart.AddNewPart<WorksheetPart>();
newWsPart.Worksheet = new Worksheet(new SheetData());
newWsPart.Worksheet.Save();
Sheets sheets = wbPart.Workbook.GetFirstChild<Sheets>();
string relId = wbPart.GetIdOfPart(newWsPart);
uint sheetId = 1;
if (sheets.Elements<Sheet>().Count() > 0) {
sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
}
Sheet sheet = new Sheet() { Id = relId, SheetId = sheetId, Name = wsName };
sheets.Append(sheet);
wbPart.Workbook.Save();
return newWsPart;
}
private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart) {
Worksheet worksheet = worksheetPart.Worksheet;
SheetData sheetData = worksheet.GetFirstChild<SheetData>();
string cellReference = columnName + rowIndex;
Row row;
if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0) {
row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
} else {
row = new Row() { RowIndex = rowIndex };
sheetData.Append(row);
}
if (row.Elements<Cell>().Where(c => c.CellReference.Value == columnName + rowIndex).Count() > 0) {
return row.Elements<Cell>().Where(c => c.CellReference.Value == cellReference).First();
} else {
Cell refCell = null;
foreach (Cell cell in row.Elements<Cell>()) {
if (string.Compare(cell.CellReference.Value, cellReference, true) > 0) {
refCell = cell;
break;
}
}
Cell newCell = new Cell() { CellReference = cellReference };
row.InsertBefore(newCell, refCell);
worksheet.Save();
return newCell;
}
}
public static void CreateXLSX(string xlsxFile) {
SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(xlsxFile, SpreadsheetDocumentType.Workbook);
WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
Sheet sheet = new Sheet() { Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart), SheetId = 1, Name = "Default" };
sheets.Append(sheet);
workbookpart.Workbook.Save();
spreadsheetDocument.Close();
}
public static void AddSheetData(string xlsxFile, string psData, string wsName, string psCol, uint psRow) {
using (SpreadsheetDocument sSheet = SpreadsheetDocument.Open(xlsxFile, true)) {
SharedStringTablePart ssPart;
if (sSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().Count() > 0) {
ssPart = sSheet.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
} else {
ssPart = sSheet.WorkbookPart.AddNewPart<SharedStringTablePart>();
}
int ssIns = SharedDataItem(psData, ssPart);
WorksheetPart wsPart = InsertWorksheet(wsName, sSheet.WorkbookPart);
Cell cell = InsertCellInWorksheet(psCol, psRow, wsPart);
cell.CellValue = new CellValue(ssIns.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
wsPart.Worksheet.Save();
}
}
}
Also trotz dieser Arbeit I kann nicht eine Zelle in ein vorhandenes Arbeitsblatt, kann jemand helfen, wie ich verrückt werde :(
Dank alle
OpenXML ist groß in dem Sinne, dass es verfügbar ist, aber schlecht, dass es brutal schwierig, mit zu arbeiten, fast, als ob Microsoft doesn‘ Das wollen wir wirklich. Die gute Nachricht ist, dass Sie für Excel [EPPlus] (http://epplus.codeplex.com/) verwenden können, das eine viel einfachere Syntax bietet. Ich würde es sofort benutzen. –
Es gibt auch eine Bibliothek namens closedXML, die ich benutze, wenn ich Excel in C# erstellen muss, es ist wirklich einfach zu verwenden wie Dateien, Arbeitsblätter und Zellen https://closedxml.codeplex.com –
Danke Scott, dem Link folgend Ich sehe, dies bezieht sich auf Office 2007/Office 2010. Wissen Sie, ob dies mit Office 2013/2016 funktioniert? Ich habe 2 voll funktionsfähige Lösungen, eine mit PowerShell Export-XLSX, aber das ist Office 2007 und funktioniert nicht für Office 2013/16, die andere war, Excel zu öffnen und Daten (über Code) einzufügen, aber dann können Sie Excel auf einem Server nicht lizenzieren .Wird gut sein, über die Kompatibilität zu wissen, wenn dies bekannt ist, Danke – jaradsc