如何使用 Excel 对象将 DataGridView 数据导出到 Excel

Posted 眸眸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用 Excel 对象将 DataGridView 数据导出到 Excel相关的知识,希望对你有一定的参考价值。

转载出处:https://code.msdn.microsoft.com/How-to-insert-image-into-93964561

本项目阐述如何使用 Open XML SDK 将图像插入到 Excel 中

简介

本示例演示如何使用 Open XML SDK 将图像自动插入到电子表格中。一些客户经常在 MSDN 论坛上咨询此问题,但是 MSDN 上并不存在示例。因此,如果 MSDN 中存在此示例,客户将可以从此示例中获取帮助。

客户证明:

http://social.msdn.microsoft.com/Forums/zh-CN/oxmlsdk/thread/4c369c2f-72ed-4e86-9c62-ff606d29ace2

http://social.msdn.microsoft.com/Forums/zh-CN/oxmlsdk/thread/5c60076e-9884-4298-a443-c97d941cf09d

http://stackoverflow.com/questions/5793950/c-sharp-openxml-insert-an-image-into-an-excel-document

生成项目

在 Visual Studio 2013 中打开项目 (InsertImageIntoExcel.csproj) 并生成项目。

class Utility 
    { 
        public static void CreatePackage(string sFile, string imageFileName) 
        { 
            try 
            { 
                // Create a spreadsheet document by supplying the filepath. 
                SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(sFile, SpreadsheetDocumentType.Workbook); 
 
                // Add a WorkbookPart to the document. 
                WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); 
                workbookpart.Workbook = new Workbook(); 
 
                // Add a WorksheetPart to the WorkbookPart. 
                WorksheetPart worksheetPart = 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<Drawing>().Any()) 
                { 
                    worksheetPart.Worksheet.Append(new 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); 
            } 
        } 
    } 

运行示例

  1. 本示例使用 Open XML SDK 将图像插入到 Excel 文件中。
  2. 将图像文件 SampleImage.jpg 从项目位置复制到可执行文件位置。
  3. 运行可执行文件‘InsertImageIntoExcel.exe’。此操作将创建一个名为‘InsertImage .xlsx’的 Excel 文件并将指定的图像插入到新工作表中。
  4. 打开 Excel 文件 InsertImage.xlsx 并验证内容

从项目中复制出来的代码:

 Program.cs文件中的代码

//****************************** Module Header ******************************//Module Name:    Program.cs
//Project:        InsertImageIntoExcel
//Copyright (c) Microsoft Corporation

//The project illustrates how to insert image into Excel using Open XML SDK

//This source is subject to the Microsoft Public License.
//See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL.
//All other rights reserved.

//*****************************************************************************/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Drawing;

namespace InsertImageIntoExcel
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string appPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

                string sFile = appPath + "\\InsertImage.xlsx";

                string imageFile = appPath + "\\SampleImage.jpg";

                // If the file exists, delete it
                if (File.Exists(sFile))
                {
                    File.Delete(sFile);
                }

                Utility.CreatePackage(sFile, imageFile);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

 Utility.cs中的代码

//****************************** Module Header ******************************//Module Name:    Utility.cs
//Project:        InsertImageIntoExcel
//Copyright (c) Microsoft Corporation

//The project illustrates how to insert image into Excel using Open XML SDK

//This source is subject to the Microsoft Public License.
//See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL.
//All other rights reserved.

//*****************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Packaging;
using System.IO;
using DocumentFormat.OpenXml.Drawing.Spreadsheet;
using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet;
using A = DocumentFormat.OpenXml.Drawing;
using System.Drawing;

namespace InsertImageIntoExcel
{
    class Utility
    {
        public static void CreatePackage(string sFile, string imageFileName)
        {
            try
            {
                // Create a spreadsheet document by supplying the filepath.
                SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(sFile, SpreadsheetDocumentType.Workbook);

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

                // Add a WorksheetPart to the WorkbookPart.
                WorksheetPart worksheetPart = 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<Drawing>().Any())
                {
                    worksheetPart.Worksheet.Append(new 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);
            }
        }
    }
}

 

以上是关于如何使用 Excel 对象将 DataGridView 数据导出到 Excel的主要内容,如果未能解决你的问题,请参考以下文章

delphi 如何写入Excel

如何实现c# winform DataGridView添加一行,添加数据后,保存到数据库?

Excel VBA中的ThisCell属性如何使用?

使用ivx导出Excel表格的经验总结

如何将页面上的数据导入excel中

如何在 Python 中导入 COM 对象命名空间/枚举?