c# - '文件已损坏,无法打开' OpenXML

标签 c# excel console-application openxml

我从 OpenXML sdk 获得了该代码,而不是 SpreadsheetDocument.Create,我使用了 SpreadsheetDocument.Open

此代码有效,在将图像添加到文件后,在 .xlsx 中添加图像。我打开显示的文件 ->

The file is corrupt and cannot be opened

如果您想了解更多详情,请!让我知道。

引用网址 -> https://code.msdn.microsoft.com/office/How-to-insert-image-into-93964561

感谢您的帮助!

    /// <summary>
    /// add sheet in xlsx then add image into it.
    /// </summary>
    /// <param name="sFile"></param>
    /// <param name="imageFileName"></param>
    public void InsertimginExcel(string sFile, string imageFileName)
    {
        try
        {
            // Create a spreadsheet document by supplying the filepath. 
            using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.
                Open(sFile, true))
            {

                // Add a WorkbookPart to the document. 
                //WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
                //workbookpart.Workbook = new Workbook();

                // Add a WorksheetPart to the WorkbookPart. 
                WorksheetPart worksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>();
                worksheetPart.Worksheet = new Worksheet(new SheetData());

                // Add Sheets to the Workbook. 
                Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
                    AppendChild<Sheets>(new Sheets());

                // Append a new worksheet and associate it with the workbook. 
                Sheet sheet = new Sheet()
                {
                    Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
                    SheetId = 1,
                    Name = "mySheet"
                };
                sheets.Append(sheet);

                var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();

                if (!worksheetPart.Worksheet.ChildElements.OfType<DocumentFormat.OpenXml.Spreadsheet.Drawing>().Any())
                {
                    worksheetPart.Worksheet.Append(new DocumentFormat.OpenXml.Spreadsheet.Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });
                }

                if (drawingsPart.WorksheetDrawing == null)
                {
                    drawingsPart.WorksheetDrawing = new WorksheetDrawing();
                }

                var worksheetDrawing = drawingsPart.WorksheetDrawing;

                var imagePart = drawingsPart.AddImagePart(ImagePartType.Jpeg);

                using (var stream = new FileStream(imageFileName, FileMode.Open))
                {
                    imagePart.FeedData(stream);
                }

                Bitmap bm = new Bitmap(imageFileName);
                DocumentFormat.OpenXml.Drawing.Extents extents = new DocumentFormat.OpenXml.Drawing.Extents();
                var extentsCx = (long)bm.Width * (long)((float)914400 / bm.HorizontalResolution);
                var extentsCy = (long)bm.Height * (long)((float)914400 / bm.VerticalResolution);
                bm.Dispose();

                var colOffset = 0;
                var rowOffset = 0;
                int colNumber = 5;
                int rowNumber = 10;

                var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
                var nvpId = nvps.Count() > 0 ?
                    (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + 1 :
                    1U;

                var oneCellAnchor = new Xdr.OneCellAnchor(
                    new Xdr.FromMarker
                    {
                        ColumnId = new Xdr.ColumnId((colNumber - 1).ToString()),
                        RowId = new Xdr.RowId((rowNumber - 1).ToString()),
                        ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
                        RowOffset = new Xdr.RowOffset(rowOffset.ToString())
                    },
                    new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
                    new Xdr.Picture(
                        new Xdr.NonVisualPictureProperties(
                            new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId, Description = imageFileName },
                            new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true })
                        ),
                        new Xdr.BlipFill(
                            new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
                            new A.Stretch(new A.FillRectangle())
                        ),
                        new Xdr.ShapeProperties(
                            new A.Transform2D(
                                new A.Offset { X = 0, Y = 0 },
                                new A.Extents { Cx = extentsCx, Cy = extentsCy }
                            ),
                            new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
                        )
                    ),
                    new Xdr.ClientData()
                );

                worksheetDrawing.Append(oneCellAnchor);

                //workbookpart.Workbook.Save();

                // Close the document. 
                spreadsheetDocument.Close();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            //log.Error("error occur while creating sheet and adding image --> " + ex.Message.ToString());
        }
    }

最佳答案

不确定一个 xlsx 文件可以处理多少个工作簿部分和工作表部分,以及 SheetId 是否必须是所有工作表的唯一文档。尝试将 Id 更改为例如5 如果这没有帮助:不要为工作表创建新的工作簿部分,如果可能,使用现有的工作簿部分。

关于c# - '文件已损坏,无法打开' OpenXML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49727901/

相关文章:

c# - Xml 序列化在简单类上因 NullReferenceException 而失败

c# - 使用不同的配置文件多次运行控制台应用程序

delphi - XE7 ReadLn 命令中的 UTF8 文本问题

用于打开 MSG 文件的 C# Outlook 互操作和 OpenSharedItem

c# - 需要在 ASP.NET 网络表单中包装表行和控件

C# - 如何以编程方式添加 Excel 工作表 - Office XP/2003

java - 使用java读取excel中嵌入的对象

c# - 如何使用控制台应用程序和流阅读器的拖放功能

c# - 管理 C# WPF 应用程序客户端 PC 文件夹中的 3000 个文件

vba - 使宏在特定工作簿中运行