Я пытаюсь добавить логотип в таблицу Excel с помощью OpenXML. Вот демо/отладка кода, который я придумал: Обновление: Вот демо-репозиторий: https://github.com/LeeStevens318/so- 79064374. Вместо кода LINQPad
void Main()
{
// Template File
var templatePath = "C:\\Users\\Lee Stevens\\Downloads\\DEMO\\Blank.xlsx";
var templateSheetName = "Sheet1";
// Output File
var destinationPath = "C:\\Users\\Lee Stevens\\Downloads\\DEMO\\File.xlsx";
// Image to Add
var image = new ExcelSheetImage
{
Name = "Logo",
ImagePath = "C:\\Users\\Lee Stevens\\Downloads\\DEMO\\image1.png",
Column = 1,
Row = 1,
Width = 100,
Height = 100
};
AddImageToCell(templatePath, destinationPath, image, templateSheetName);
}
public void AddImageToCell(string templatePath, string filePath, ExcelSheetImage image, string worksheetName)
{
File.Copy(templatePath, filePath, overwrite: true);
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, true))
{
WorkbookPart workbookPart = document.WorkbookPart;
Sheet sheet = workbookPart.Workbook.Descendants().FirstOrDefault(s => s.Name == worksheetName);
if (sheet == null)
throw new ArgumentException("Worksheet not found.");
WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(sheet.Id);
DrawingsPart drawingsPart;
if (worksheetPart.DrawingsPart == null)
{
drawingsPart = worksheetPart.AddNewPart();
worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });
}
else
{
drawingsPart = worksheetPart.DrawingsPart;
}
ImagePart imagePart = drawingsPart.AddImagePart(ImagePartType.Png);
using (FileStream stream = new FileStream(image.ImagePath, FileMode.Open))
{
imagePart.FeedData(stream);
}
if (drawingsPart.WorksheetDrawing == null)
drawingsPart.WorksheetDrawing = new WorksheetDrawing();
WorksheetDrawing worksheetDrawing = drawingsPart.WorksheetDrawing;
NonVisualDrawingProperties nonVisualProperties = new NonVisualDrawingProperties
{
Id = new UInt32Value((uint)(worksheetDrawing.ChildElements.Count + 1)),
Name = image.Name
};
BlipFill blipFill = new BlipFill(
new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print },
new Stretch(new FillRectangle())
);
Transform2D transform = new Transform2D(
new Offset { X = 0, Y = 0 },
new Extents { Cx = image.Width * 9525, Cy = image.Height * 9525 } // Width & Height in EMUs (1 pixel = 9525 EMUs)
);
ShapeProperties shapeProperties = new ShapeProperties(transform,
new PresetGeometry(new AdjustValueList()) { Preset = ShapeTypeValues.Rectangle });
TwoCellAnchor twoCellAnchor = new TwoCellAnchor(
new FromMarker(
new ColumnId((image.Column - 1).ToString()),
new ColumnOffset("0"),
new RowId((image.Row - 1).ToString()),
new RowOffset("0")
),
new ToMarker(
new ColumnId(image.Column.ToString()), // Adjust if spanning multiple cells
new ColumnOffset("0"),
new RowId(image.Row.ToString()), // Adjust if spanning multiple rows
new RowOffset("0")
),
new Picture(
nonVisualProperties,
new NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }),
blipFill,
shapeProperties
),
new ClientData()
);
worksheetDrawing.Append(twoCellAnchor);
worksheetDrawing.Save(drawingsPart);
}
Process.Start(new ProcessStartInfo(filePath) { UseShellExecute = true });
}
public class ExcelSheetImage
{
public string Name { get; set; }
public string ImagePath { get; set; }
public int Column { get; set; }
public int Row { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}
Половина кода работает. Он добавляет изображение в целевой файл (если вы конвертируете его в zip и заглядываете в него), но при открытии документа я получаю: Мы обнаружили проблему с некоторым контекстом в «File.xlsx». Вы хотите, чтобы мы попытаться восстановить как можно больше?. Я нажимаю «Да», но все равно получаю пустой лист с сообщением «Восстановленные записи: рисунок из части /xl/drawings/drawing1.xml (фигура рисунка)
Если я удалю line worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) }); документ открывается нормально, но у меня все еще нет изображения в ячейке.
Я видел и просмотрел: C# и OpenXML: вставка изображения в документ Excel, но это не помогло мне решить проблему.
Я пытаюсь добавить логотип в таблицу Excel с помощью OpenXML. Вот демо/отладка кода, который я придумал: [b]Обновление:[/b] Вот демо-репозиторий: https://github.com/LeeStevens318/so- 79064374. Вместо кода LINQPad [code]void Main() { // Template File var templatePath = "C:\\Users\\Lee Stevens\\Downloads\\DEMO\\Blank.xlsx"; var templateSheetName = "Sheet1";
// Output File var destinationPath = "C:\\Users\\Lee Stevens\\Downloads\\DEMO\\File.xlsx";
// Image to Add var image = new ExcelSheetImage { Name = "Logo", ImagePath = "C:\\Users\\Lee Stevens\\Downloads\\DEMO\\image1.png", Column = 1, Row = 1, Width = 100, Height = 100 };
NonVisualDrawingProperties nonVisualProperties = new NonVisualDrawingProperties { Id = new UInt32Value((uint)(worksheetDrawing.ChildElements.Count + 1)), Name = image.Name };
BlipFill blipFill = new BlipFill( new Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = BlipCompressionValues.Print }, new Stretch(new FillRectangle()) );
Transform2D transform = new Transform2D( new Offset { X = 0, Y = 0 }, new Extents { Cx = image.Width * 9525, Cy = image.Height * 9525 } // Width & Height in EMUs (1 pixel = 9525 EMUs) );
ShapeProperties shapeProperties = new ShapeProperties(transform, new PresetGeometry(new AdjustValueList()) { Preset = ShapeTypeValues.Rectangle });
TwoCellAnchor twoCellAnchor = new TwoCellAnchor( new FromMarker( new ColumnId((image.Column - 1).ToString()), new ColumnOffset("0"), new RowId((image.Row - 1).ToString()), new RowOffset("0") ), new ToMarker( new ColumnId(image.Column.ToString()), // Adjust if spanning multiple cells new ColumnOffset("0"), new RowId(image.Row.ToString()), // Adjust if spanning multiple rows new RowOffset("0") ), new Picture( nonVisualProperties, new NonVisualPictureDrawingProperties(new PictureLocks { NoChangeAspect = true }), blipFill, shapeProperties ), new ClientData() );
public class ExcelSheetImage { public string Name { get; set; } public string ImagePath { get; set; } public int Column { get; set; } public int Row { get; set; } public int Width { get; set; } public int Height { get; set; } } [/code] Половина кода работает. Он добавляет изображение в целевой файл (если вы конвертируете его в zip и заглядываете в него), но при открытии документа я получаю: Мы обнаружили проблему с некоторым контекстом в «File.xlsx». Вы хотите, чтобы мы попытаться восстановить как можно больше?. Я нажимаю «Да», но все равно получаю пустой лист с сообщением «Восстановленные записи: рисунок из части /xl/drawings/drawing1.xml (фигура рисунка) Если я удалю line worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) }); документ открывается нормально, но у меня все еще нет изображения в ячейке. Я видел и просмотрел: C# и OpenXML: вставка изображения в документ Excel, но это не помогло мне решить проблему.