C#/OpenXML Excel Добавить изображениеC#

Место общения программистов C#
Ответить
Anonymous
 C#/OpenXML Excel Добавить изображение

Сообщение Anonymous »

Я пытаюсь добавить логотип в таблицу 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, но это не помогло мне решить проблему.

Подробнее здесь: https://stackoverflow.com/questions/790 ... -add-image
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»