转载出处: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) 并生成项目。

  1. class Utility
  2. {
  3. public static void CreatePackage(string sFile, string imageFileName)
  4. {
  5. try
  6. {
  7. // Create a spreadsheet document by supplying the filepath.
  8. SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(sFile, SpreadsheetDocumentType.Workbook);
  9.  
  10. // Add a WorkbookPart to the document.
  11. WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
  12. workbookpart.Workbook = new Workbook();
  13.  
  14. // Add a WorksheetPart to the WorkbookPart.
  15. WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
  16. worksheetPart.Worksheet = new Worksheet(new SheetData());
  17.  
  18. // Add Sheets to the Workbook.
  19. Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
  20.  
  21. // Append a new worksheet and associate it with the workbook.
  22. Sheet sheet = new Sheet()
  23. {
  24. Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
  25. SheetId = ,
  26. Name = "mySheet"
  27. };
  28. sheets.Append(sheet);
  29.  
  30. var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();
  31.  
  32. if (!worksheetPart.Worksheet.ChildElements.OfType<Drawing>().Any())
  33. {
  34. worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });
  35. }
  36.  
  37. if (drawingsPart.WorksheetDrawing == null)
  38. {
  39. drawingsPart.WorksheetDrawing = new WorksheetDrawing();
  40. }
  41.  
  42. var worksheetDrawing = drawingsPart.WorksheetDrawing;
  43.  
  44. var imagePart = drawingsPart.AddImagePart(ImagePartType.Jpeg);
  45.  
  46. using (var stream = new FileStream(imageFileName, FileMode.Open))
  47. {
  48. imagePart.FeedData(stream);
  49. }
  50.  
  51. Bitmap bm = new Bitmap(imageFileName);
  52. DocumentFormat.OpenXml.Drawing.Extents extents = new DocumentFormat.OpenXml.Drawing.Extents();
  53. var extentsCx = (long)bm.Width * (long)((float) / bm.HorizontalResolution);
  54. var extentsCy = (long)bm.Height * (long)((float) / bm.VerticalResolution);
  55. bm.Dispose();
  56.  
  57. var colOffset = ;
  58. var rowOffset = ;
  59. int colNumber = ;
  60. int rowNumber = ;
  61.  
  62. var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
  63. var nvpId = nvps.Count() > ?
  64. (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + :
  65. 1U;
  66.  
  67. var oneCellAnchor = new Xdr.OneCellAnchor(
  68. new Xdr.FromMarker
  69. {
  70. ColumnId = new Xdr.ColumnId((colNumber - ).ToString()),
  71. RowId = new Xdr.RowId((rowNumber - ).ToString()),
  72. ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
  73. RowOffset = new Xdr.RowOffset(rowOffset.ToString())
  74. },
  75. new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
  76. new Xdr.Picture(
  77. new Xdr.NonVisualPictureProperties(
  78. new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId, Description = imageFileName },
  79. new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true })
  80. ),
  81. new Xdr.BlipFill(
  82. new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
  83. new A.Stretch(new A.FillRectangle())
  84. ),
  85. new Xdr.ShapeProperties(
  86. new A.Transform2D(
  87. new A.Offset { X = , Y = },
  88. new A.Extents { Cx = extentsCx, Cy = extentsCy }
  89. ),
  90. new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
  91. )
  92. ),
  93. new Xdr.ClientData()
  94. );
  95.  
  96. worksheetDrawing.Append(oneCellAnchor);
  97.  
  98. workbookpart.Workbook.Save();
  99.  
  100. // Close the document.
  101. spreadsheetDocument.Close();
  102. }
  103. catch (Exception ex)
  104. {
  105. Console.WriteLine(ex.Message);
  106. }
  107. }
  108. }

运行示例

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

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

Program.cs文件中的代码

  1. //****************************** Module Header ******************************\
  2. //Module Name: Program.cs
  3. //Project: InsertImageIntoExcel
  4. //Copyright (c) Microsoft Corporation
  5.  
  6. //The project illustrates how to insert image into Excel using Open XML SDK
  7.  
  8. //This source is subject to the Microsoft Public License.
  9. //See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL.
  10. //All other rights reserved.
  11.  
  12. //*****************************************************************************/
  13. using System;
  14. using System.Collections.Generic;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Drawing;
  19.  
  20. namespace InsertImageIntoExcel
  21. {
  22. class Program
  23. {
  24. static void Main(string[] args)
  25. {
  26. try
  27. {
  28. string appPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  29.  
  30. string sFile = appPath + "\\InsertImage.xlsx";
  31.  
  32. string imageFile = appPath + "\\SampleImage.jpg";
  33.  
  34. // If the file exists, delete it
  35. if (File.Exists(sFile))
  36. {
  37. File.Delete(sFile);
  38. }
  39.  
  40. Utility.CreatePackage(sFile, imageFile);
  41. }
  42. catch(Exception ex)
  43. {
  44. Console.WriteLine(ex.Message);
  45. }
  46. }
  47. }
  48. }

Utility.cs中的代码

  1. //****************************** Module Header ******************************\
  2. //Module Name: Utility.cs
  3. //Project: InsertImageIntoExcel
  4. //Copyright (c) Microsoft Corporation
  5.  
  6. //The project illustrates how to insert image into Excel using Open XML SDK
  7.  
  8. //This source is subject to the Microsoft Public License.
  9. //See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL.
  10. //All other rights reserved.
  11.  
  12. //*****************************************************************************/
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using DocumentFormat.OpenXml;
  19. using DocumentFormat.OpenXml.Spreadsheet;
  20. using DocumentFormat.OpenXml.Packaging;
  21. using System.IO;
  22. using DocumentFormat.OpenXml.Drawing.Spreadsheet;
  23. using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet;
  24. using A = DocumentFormat.OpenXml.Drawing;
  25. using System.Drawing;
  26.  
  27. namespace InsertImageIntoExcel
  28. {
  29. class Utility
  30. {
  31. public static void CreatePackage(string sFile, string imageFileName)
  32. {
  33. try
  34. {
  35. // Create a spreadsheet document by supplying the filepath.
  36. SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(sFile, SpreadsheetDocumentType.Workbook);
  37.  
  38. // Add a WorkbookPart to the document.
  39. WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
  40. workbookpart.Workbook = new Workbook();
  41.  
  42. // Add a WorksheetPart to the WorkbookPart.
  43. WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
  44. worksheetPart.Worksheet = new Worksheet(new SheetData());
  45.  
  46. // Add Sheets to the Workbook.
  47. Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.
  48. AppendChild<Sheets>(new Sheets());
  49.  
  50. // Append a new worksheet and associate it with the workbook.
  51. Sheet sheet = new Sheet()
  52. {
  53. Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
  54. SheetId = ,
  55. Name = "mySheet"
  56. };
  57. sheets.Append(sheet);
  58.  
  59. var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();
  60.  
  61. if (!worksheetPart.Worksheet.ChildElements.OfType<Drawing>().Any())
  62. {
  63. worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });
  64. }
  65.  
  66. if (drawingsPart.WorksheetDrawing == null)
  67. {
  68. drawingsPart.WorksheetDrawing = new WorksheetDrawing();
  69. }
  70.  
  71. var worksheetDrawing = drawingsPart.WorksheetDrawing;
  72.  
  73. var imagePart = drawingsPart.AddImagePart(ImagePartType.Jpeg);
  74.  
  75. using (var stream = new FileStream(imageFileName, FileMode.Open))
  76. {
  77. imagePart.FeedData(stream);
  78. }
  79.  
  80. Bitmap bm = new Bitmap(imageFileName);
  81. DocumentFormat.OpenXml.Drawing.Extents extents = new DocumentFormat.OpenXml.Drawing.Extents();
  82. var extentsCx = (long)bm.Width * (long)((float) / bm.HorizontalResolution);
  83. var extentsCy = (long)bm.Height * (long)((float) / bm.VerticalResolution);
  84. bm.Dispose();
  85.  
  86. var colOffset = ;
  87. var rowOffset = ;
  88. int colNumber = ;
  89. int rowNumber = ;
  90.  
  91. var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
  92. var nvpId = nvps.Count() > ?
  93. (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + :
  94. 1U;
  95.  
  96. var oneCellAnchor = new Xdr.OneCellAnchor(
  97. new Xdr.FromMarker
  98. {
  99. ColumnId = new Xdr.ColumnId((colNumber - ).ToString()),
  100. RowId = new Xdr.RowId((rowNumber - ).ToString()),
  101. ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
  102. RowOffset = new Xdr.RowOffset(rowOffset.ToString())
  103. },
  104. new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
  105. new Xdr.Picture(
  106. new Xdr.NonVisualPictureProperties(
  107. new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId, Description = imageFileName },
  108. new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true })
  109. ),
  110. new Xdr.BlipFill(
  111. new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
  112. new A.Stretch(new A.FillRectangle())
  113. ),
  114. new Xdr.ShapeProperties(
  115. new A.Transform2D(
  116. new A.Offset { X = , Y = },
  117. new A.Extents { Cx = extentsCx, Cy = extentsCy }
  118. ),
  119. new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
  120. )
  121. ),
  122. new Xdr.ClientData()
  123. );
  124.  
  125. worksheetDrawing.Append(oneCellAnchor);
  126.  
  127. workbookpart.Workbook.Save();
  128.  
  129. // Close the document.
  130. spreadsheetDocument.Close();
  131. }
  132. catch (Exception ex)
  133. {
  134. Console.WriteLine(ex.Message);
  135. }
  136. }
  137. }
  138. }
  1. //****************************** Module Header ******************************\
  2. //Module Name: Utility.cs
  3. //Project: InsertImageIntoExcel
  4. //Copyright (c) Microsoft Corporation
  5.  
  6. //The project illustrates how to insert image into Excel using Open XML SDK
  7.  
  8. //This source is subject to the Microsoft Public License.
  9. //See http://www.microsoft.com/en-us/openness/resources/licenses.aspx#MPL.
  10. //All other rights reserved.
  11.  
  12. //*****************************************************************************/
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using DocumentFormat.OpenXml;
  19. using DocumentFormat.OpenXml.Spreadsheet;
  20. using DocumentFormat.OpenXml.Packaging;
  21. using System.IO;
  22. using DocumentFormat.OpenXml.Drawing.Spreadsheet;
  23. using Xdr = DocumentFormat.OpenXml.Drawing.Spreadsheet;
  24. using A = DocumentFormat.OpenXml.Drawing;
  25. using System.Drawing;
  26.  
  27. namespace InsertImageIntoExcel
  28. {
  29. class Utility
  30. {
  31. public static void CreatePackage(string sFile, string imageFileName) //sFile指的是InsertImage.xlsx的路径;imageFileName指的是SampleImage.jpg路径
  32. {
  33. try
  34. {
  35. SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Create(sFile, SpreadsheetDocumentType.Workbook);//从指定的文件创建SpreadsheetDocument 类的一个新实例
  36. WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart(); //为SpreadsheetDocument添加Workbookpart
  37. workbookpart.Workbook = new Workbook();
  38. WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();//为WookBookPart添加WorksheetPart
  39. worksheetPart.Worksheet = new Worksheet(new SheetData());
  40. Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());//为WorkBook添加Sheets
  41. //追加一个worksheet新实例并连接到workbook
  42. Sheet sheet = new Sheet()
  43. {
  44. Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
  45. SheetId = ,
  46. Name = "mySheet"
  47. };
  48. sheets.Append(sheet);
  49. var drawingsPart = worksheetPart.AddNewPart<DrawingsPart>();
  50. if (!worksheetPart.Worksheet.ChildElements.OfType<Drawing>().Any())
  51. {
  52. worksheetPart.Worksheet.Append(new Drawing { Id = worksheetPart.GetIdOfPart(drawingsPart) });
  53. }
  54.  
  55. if (drawingsPart.WorksheetDrawing == null)
  56. {
  57. drawingsPart.WorksheetDrawing = new WorksheetDrawing();
  58. }
  59.  
  60. var worksheetDrawing = drawingsPart.WorksheetDrawing;
  61. var imagePart = drawingsPart.AddImagePart(ImagePartType.Jpeg);
  62. using (var stream = new FileStream(imageFileName, FileMode.Open))
  63. {
  64. imagePart.FeedData(stream);
  65. }
  66.  
  67. Bitmap bm = new Bitmap(imageFileName);
  68. DocumentFormat.OpenXml.Drawing.Extents extents = new DocumentFormat.OpenXml.Drawing.Extents();
  69. var extentsCx = (long)bm.Width * (long)((float) / bm.HorizontalResolution);
  70. var extentsCy = (long)bm.Height * (long)((float) / bm.VerticalResolution);
  71. bm.Dispose();
  72.  
  73. var colOffset = ;
  74. var rowOffset = ;
  75. int colNumber = ;
  76. int rowNumber = ;
  77.  
  78. var nvps = worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>();
  79. var nvpId = nvps.Count() > ?
  80. (UInt32Value)worksheetDrawing.Descendants<Xdr.NonVisualDrawingProperties>().Max(p => p.Id.Value) + :
  81. 1U;
  82.  
  83. var oneCellAnchor = new Xdr.OneCellAnchor(
  84. new Xdr.FromMarker
  85. {
  86. ColumnId = new Xdr.ColumnId((colNumber - ).ToString()),
  87. RowId = new Xdr.RowId((rowNumber - ).ToString()),
  88. ColumnOffset = new Xdr.ColumnOffset(colOffset.ToString()),
  89. RowOffset = new Xdr.RowOffset(rowOffset.ToString())
  90. },
  91. new Xdr.Extent { Cx = extentsCx, Cy = extentsCy },
  92. new Xdr.Picture(
  93. new Xdr.NonVisualPictureProperties(
  94. new Xdr.NonVisualDrawingProperties { Id = nvpId, Name = "Picture " + nvpId, Description = imageFileName },
  95. new Xdr.NonVisualPictureDrawingProperties(new A.PictureLocks { NoChangeAspect = true })
  96. ),
  97. new Xdr.BlipFill(
  98. new A.Blip { Embed = drawingsPart.GetIdOfPart(imagePart), CompressionState = A.BlipCompressionValues.Print },
  99. new A.Stretch(new A.FillRectangle())
  100. ),
  101. new Xdr.ShapeProperties(
  102. new A.Transform2D(
  103. new A.Offset { X = , Y = },
  104. new A.Extents { Cx = extentsCx, Cy = extentsCy }
  105. ),
  106. new A.PresetGeometry { Preset = A.ShapeTypeValues.Rectangle }
  107. )
  108. ),
  109. new Xdr.ClientData()
  110. );
  111.  
  112. worksheetDrawing.Append(oneCellAnchor);
  113. workbookpart.Workbook.Save();
  114. spreadsheetDocument.Close();
  115. }
  116. catch (Exception ex)
  117. {
  118. Console.WriteLine(ex.Message);
  119. }
  120. }
  121. }
  122. }

Open Xml 创建Excel并插入数据

转载地址:http://www.cnblogs.com/sshoub/archive/2012/08/28/2660152.html

  1. private static void CreateSpreadSheet()
  2. {
  3. string fileName = "E:\\01.xlsx";
  4. string sheetName = "test";
  5.  
  6. using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Create(fileName, SpreadsheetDocumentType.Workbook))
  7. {
  8. // create the workbook
  9. spreadSheet.AddWorkbookPart();
  10. spreadSheet.WorkbookPart.Workbook = new Workbook(); // create the worksheet
  11. spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
  12. spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet();
  13. SharedStringTablePart m_SharedStringTablePart = spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>();
  14.  
  15. // create sheet data
  16. SheetData m_SheetData = new SheetData();
  17. spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.AppendChild(m_SheetData);
  18.  
  19. // create row
  20. //spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().AppendChild(new Row());
  21. //// create cell with data
  22. //spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.First().First().AppendChild(new Cell() { CellValue = new CellValue("100") });
  23.  
  24. //Add Data
  25. Row row1 = new Row() { RowIndex = };
  26.  
  27. Cell cell1 = new Cell() { CellReference = "A1" };
  28. int index = InsertSharedStringItem("Sun", m_SharedStringTablePart);
  29. cell1.CellValue = new CellValue(index.ToString());
  30. cell1.DataType = new EnumValue<CellValues>(CellValues.SharedString);
  31.  
  32. row1.Append(cell1);
  33. m_SheetData.Append(row1);
  34.  
  35. // save worksheet
  36. spreadSheet.WorkbookPart.WorksheetParts.First().Worksheet.Save();
  37.  
  38. // create the worksheet to workbook relation
  39. spreadSheet.WorkbookPart.Workbook.AppendChild(new Sheets());
  40. spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>().AppendChild(new Sheet()
  41. {
  42. Id = spreadSheet.WorkbookPart.GetIdOfPart(spreadSheet.WorkbookPart.WorksheetParts.First()),
  43. SheetId = ,
  44. Name = sheetName
  45. });
  46.  
  47. spreadSheet.WorkbookPart.Workbook.Save();
  48. }
  49. }
  50.  
  51. private static int InsertSharedStringItem(string text, SharedStringTablePart shareStringPart)
  52. {
  53. // If the part does not contain a SharedStringTable, create one.
  54. if (shareStringPart.SharedStringTable == null)
  55. {
  56. shareStringPart.SharedStringTable = new SharedStringTable();
  57. shareStringPart.SharedStringTable.Count = ;
  58. shareStringPart.SharedStringTable.UniqueCount = ;
  59. }
  60.  
  61. int i = ;
  62. // Iterate through all the items in the SharedStringTable. If the text already exists, return its index.
  63. foreach (SharedStringItem item in shareStringPart.SharedStringTable.Elements<SharedStringItem>())
  64. {
  65. if (item.InnerText == text)
  66. {
  67. return i;
  68. }
  69. i++;
  70. }
  71.  
  72. // The text does not exist in the part. Create the SharedStringItem and return its index.
  73. shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new DocumentFormat.OpenXml.Spreadsheet.Text(text)));
  74. shareStringPart.SharedStringTable.Save();
  75.  
  76. return i;
  77. }

Excel 数据读入到DataSet

转载地址:http://www.cnblogs.com/tianjinquan/p/3972346.html

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Data;
  5. using System.IO;
  6. using System.Xml;
  7. using DocumentFormat.OpenXml.Packaging;
  8. using DocumentFormat.OpenXml.Spreadsheet;
  9. using DocumentFormat.OpenXml;
  10.  
  11. namespace ECLink.Common
  12. {
  13. /// <summary>
  14. /// 采用openxml方式把excel转换成DataSet
  15. /// </summary>
  16. public class ExcelHelper
  17. {
  18. public ExcelHelper()
  19. {
  20.  
  21. }
  22. /// <summary>
  23. /// 将Excel多单一表转化为DataSet数据集对象
  24. /// </summary>
  25. /// <param name="filePath">Excel文件路径</param>
  26. /// <returns>转化的数据集</returns>
  27. public DataSet ExcelToDataSet(string filePath)
  28. {
  29. DataSet dataSet = new DataSet();
  30. try
  31. {
  32. using (SpreadsheetDocument spreadDocument = SpreadsheetDocument.Open(filePath, false))
  33. {
  34. //指定WorkbookPart对象
  35. WorkbookPart workBookPart = spreadDocument.WorkbookPart;
  36. //获取Excel中SheetName集合
  37. List<string> sheetNames = GetSheetNames(workBookPart);
  38.  
  39. foreach (string sheetName in sheetNames)
  40. {
  41. DataTable dataTable = WorkSheetToTable(workBookPart, sheetName);
  42. if (dataTable != null)
  43. {
  44. dataSet.Tables.Add(dataTable);//将表添加到数据集
  45. }
  46. }
  47. }
  48. }
  49. catch (Exception exp)
  50. {
  51. throw new Exception("可能Excel正在打开中,请关闭重新操作!");
  52. }
  53. return dataSet;
  54. }
  55.  
  56. /// <summary>
  57. /// 根据WorkbookPart和表名创建DataTable对象
  58. /// </summary>
  59. /// <param name="workBookPart">WorkbookPart对象</param>
  60. /// <param name="tableName">表名</param>
  61. /// <returns>转化后的DataTable</returns>
  62. public DataTable WorkSheetToTable(WorkbookPart workBookPart, string sheetName)
  63. {
  64. //创建Table
  65. DataTable dataTable = new DataTable(sheetName);
  66.  
  67. //根据WorkbookPart和sheetName获取该Sheet下所有行数据
  68. IEnumerable<Row> sheetRows = GetWorkBookPartRows(workBookPart, sheetName);
  69. IEnumerable<Column> sheetColumns = GetWorkBookPartColumns(workBookPart, sheetName);
  70.  
  71. if (sheetRows == null || sheetRows.Count() <= )
  72. {
  73. return null;
  74. }
  75.  
  76. SharedStringTable stringTable = workBookPart.SharedStringTablePart.SharedStringTable;
  77. //将数据导入DataTable,假定第一行为列名,第二行以后为数据
  78. foreach (Row row in sheetRows)
  79. {
  80. //获取Excel中的列头
  81. if (row.RowIndex == )
  82. {
  83. GetDataColumn(row, stringTable, ref dataTable);
  84. }
  85. else
  86. {
  87. GetDataRow(row, stringTable, ref dataTable);
  88. }
  89. }
  90. return dataTable;
  91. }
  92.  
  93. /// <summary>
  94. /// 根据WorkbookPart获取所有SheetName
  95. /// </summary>
  96. /// <param name="workBookPart"></param>
  97. /// <returns>SheetName集合</returns>
  98. private List<string> GetSheetNames(WorkbookPart workBookPart)
  99. {
  100. List<string> sheetNames = new List<string>();
  101. Sheets sheets = workBookPart.Workbook.Sheets;
  102. foreach (Sheet sheet in sheets)
  103. {
  104. string sheetName = sheet.Name;
  105. if (!string.IsNullOrEmpty(sheetName))
  106. {
  107. sheetNames.Add(sheetName);
  108. }
  109. }
  110. return sheetNames;
  111. }
  112.  
  113. /// <summary>
  114. /// 根据WorkbookPart和sheetName获取该Sheet下所有Row数据
  115. /// </summary>
  116. /// <param name="workBookPart">WorkbookPart对象</param>
  117. /// <param name="sheetName">SheetName</param>
  118. /// <returns>该SheetName下的所有Row数据</returns>
  119. public IEnumerable<Row> GetWorkBookPartRows(WorkbookPart workBookPart, string sheetName)
  120. {
  121. IEnumerable<Row> sheetRows = null;
  122. //根据表名在WorkbookPart中获取Sheet集合
  123. IEnumerable<Sheet> sheets = workBookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
  124. if (sheets.Count() == )
  125. {
  126. return null;//没有数据
  127. }
  128.  
  129. WorksheetPart workSheetPart = workBookPart.GetPartById(sheets.First().Id) as WorksheetPart;
  130. //获取Excel中得到的行
  131. sheetRows = workSheetPart.Worksheet.Descendants<Row>();
  132. return sheetRows;
  133. }
  134.  
  135. /// <summary>
  136. /// 根据WorkbookPart和sheetName获取该Sheet下所有Row数据
  137. /// </summary>
  138. /// <param name="workBookPart">WorkbookPart对象</param>
  139. /// <param name="sheetName">SheetName</param>
  140. /// <returns>该SheetName下的所有Row数据</returns>
  141. public IEnumerable<Column> GetWorkBookPartColumns(WorkbookPart workBookPart, string sheetName)
  142. {
  143. IEnumerable<Column> sheetColumns = null;
  144. //根据表名在WorkbookPart中获取Sheet集合
  145. IEnumerable<Sheet> sheets = workBookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
  146. if (sheets.Count() == )
  147. {
  148. return null;//没有数据
  149. }
  150.  
  151. WorksheetPart workSheetPart = workBookPart.GetPartById(sheets.First().Id) as WorksheetPart;
  152.  
  153. sheetColumns = workSheetPart.Worksheet.Descendants<Column>(); //获取Excel中得到的行
  154.  
  155. return sheetColumns;
  156. }
  157.  
  158. /// <summary>
  159. /// 获取Excel中多表的表名
  160. /// </summary>
  161. /// <param name="filePath"></param>
  162. /// <returns></returns>
  163. private List<string> GetExcelSheetNames(string filePath)
  164. {
  165. string sheetName = string.Empty;
  166. List<string> sheetNames = new List<string>();//所有Sheet表名
  167. using (SpreadsheetDocument spreadDocument = SpreadsheetDocument.Open(filePath, false))
  168. {
  169. WorkbookPart workBook = spreadDocument.WorkbookPart;
  170. Stream stream = workBook.GetStream(FileMode.Open);
  171. XmlDocument xmlDocument = new XmlDocument();
  172. xmlDocument.Load(stream);
  173.  
  174. XmlNamespaceManager xmlNSManager = new XmlNamespaceManager(xmlDocument.NameTable);
  175. xmlNSManager.AddNamespace("default", xmlDocument.DocumentElement.NamespaceURI);
  176. XmlNodeList nodeList = xmlDocument.SelectNodes("//default:sheets/default:sheet", xmlNSManager);
  177.  
  178. foreach (XmlNode node in nodeList)
  179. {
  180. sheetName = node.Attributes["name"].Value;
  181. sheetNames.Add(sheetName);
  182. }
  183. }
  184. return sheetNames;
  185. }
  186.  
  187. #region 采用openxml方式把excel转换成dataTable
  188.  
  189. /// <summary>
  190. /// 构建DataTable的列
  191. /// </summary>
  192. /// <param name="row">OpenXML定义的Row对象</param>
  193. /// <param name="stringTablePart"></param>
  194. /// <param name="dt">须要返回的DataTable对象</param>
  195. /// <returns></returns>
  196. public void GetDataColumn(Row row, SharedStringTable stringTable, ref DataTable dt)
  197. {
  198. DataColumn col = new DataColumn();
  199. Dictionary<string, int> columnCount = new Dictionary<string, int>();
  200. foreach (Cell cell in row)
  201. {
  202. string cellVal = GetValue(cell, stringTable);
  203. col = new DataColumn(cellVal);
  204. if (IsContainsColumn(dt, col.ColumnName))
  205. {
  206. if (!columnCount.ContainsKey(col.ColumnName))
  207. columnCount.Add(col.ColumnName, );
  208. col.ColumnName = col.ColumnName + (columnCount[col.ColumnName]++);
  209. }
  210. dt.Columns.Add(col);
  211. }
  212. }
  213. /// <summary>
  214. /// 构建DataTable的每一行数据,并返回该Datatable
  215. /// </summary>
  216. /// <param name="row">OpenXML的行</param>
  217. /// <param name="stringTablePart"></param>
  218. /// <param name="dt">DataTable</param>
  219. private void GetDataRow(Row row, SharedStringTable stringTable, ref DataTable dt)
  220. {
  221. // 读取算法:按行一一读取单位格,若是整行均是空数据
  222. DataRow dr = dt.NewRow();
  223. int i = ;
  224. int nullRowCount = i;
  225. foreach (Cell cell in row)
  226. {
  227. string cellVal = GetValue(cell, stringTable);
  228. if (cellVal == string.Empty)
  229. {
  230. nullRowCount++;
  231. }
  232. dr[i] = cellVal;
  233. i++;
  234. }
  235. if (nullRowCount != i)
  236. {
  237. dt.Rows.Add(dr);
  238. }
  239. }
  240. /// <summary>
  241. /// 获取单位格的值
  242. /// </summary>
  243. /// <param name="cell"></param>
  244. /// <param name="stringTablePart"></param>
  245. /// <returns></returns>
  246. private string GetValue(Cell cell, SharedStringTable stringTable)
  247. {
  248. //因为Excel的数据存储在SharedStringTable中,须要获取数据在SharedStringTable 中的索引
  249. string value = string.Empty;
  250. try
  251. {
  252. if (cell.ChildElements.Count == )
  253. return value;
  254. value = double.Parse(cell.CellValue.InnerText).ToString();
  255. if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
  256. {
  257. value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
  258. }
  259. }
  260. catch (Exception)
  261. {
  262. value = "N/A";
  263. }
  264. return value;
  265. }
  266. /// <summary>
  267. /// 判断网格是否存在列
  268. /// </summary>
  269. /// <param name="dt">网格</param>
  270. /// <param name="columnName">列名</param>
  271. /// <returns></returns>
  272. public bool IsContainsColumn(DataTable dt, string columnName)
  273. {
  274. if (dt == null || columnName == null)
  275. {
  276. return false;
  277. }
  278. return dt.Columns.Contains(columnName);
  279. }
  280.  
  281. #endregion
  282.  
  283. #region SaveCell
  284. private void InsertTextCellValue(Worksheet worksheet, string column, uint row, string value)
  285. {
  286. Cell cell = ReturnCell(worksheet, column, row);
  287. CellValue v = new CellValue();
  288. v.Text = value;
  289. cell.AppendChild(v);
  290. cell.DataType = new EnumValue<CellValues>(CellValues.String);
  291. worksheet.Save();
  292. }
  293. private void InsertNumberCellValue(Worksheet worksheet, string column, uint row, string value)
  294. {
  295. Cell cell = ReturnCell(worksheet, column, row);
  296. CellValue v = new CellValue();
  297. v.Text = value;
  298. cell.AppendChild(v);
  299. cell.DataType = new EnumValue<CellValues>(CellValues.Number);
  300. worksheet.Save();
  301. }
  302. private static Cell ReturnCell(Worksheet worksheet, string columnName, uint row)
  303. {
  304. Row targetRow = ReturnRow(worksheet, row);
  305.  
  306. if (targetRow == null)
  307. return null;
  308.  
  309. return targetRow.Elements<Cell>().Where(c =>
  310. string.Compare(c.CellReference.Value, columnName + row,
  311. true) == ).First();
  312. }
  313. private static Row ReturnRow(Worksheet worksheet, uint row)
  314. {
  315. return worksheet.GetFirstChild<SheetData>().
  316. Elements<Row>().Where(r => r.RowIndex == row).First();
  317. }
  318. #endregion
  319. }
  320. }

 此代码示例使用 Open XML SDK 2.5 中的类来创建最小空白工作簿  

  1. Imports DocumentFormat.OpenXml.Packaging
  2. Imports DocumentFormat.OpenXml
  3. Imports DocumentFormat.OpenXml.Spreadsheet
  4. Module Module1
  5.  
  6. Sub Main()
  7. CreateSpreadsheetWorkbook("D:\000.xlsx")
  8. End Sub
  9. Public Sub CreateSpreadsheetWorkbook(ByVal filepath As String)
  10. ' Create a spreadsheet document by supplying the filepath.
  11. ' By default, AutoSave = true, Editable = true, and Type = xlsx.
  12. Dim spreadsheetDocument As SpreadsheetDocument = spreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook)
  13.  
  14. ' Add a WorkbookPart to the document.
  15. Dim workbookpart As WorkbookPart = spreadsheetDocument.AddWorkbookPart
  16. workbookpart.Workbook = New Workbook
  17.  
  18. ' Add a WorksheetPart to the WorkbookPart.
  19. Dim worksheetPart As WorksheetPart = workbookpart.AddNewPart(Of WorksheetPart)()
  20. worksheetPart.Worksheet = New Worksheet(New SheetData())
  21.  
  22. ' Add Sheets to the Workbook.
  23. Dim sheets As Sheets = spreadsheetDocument.WorkbookPart.Workbook.AppendChild(Of Sheets)(New Sheets())
  24.  
  25. ' Append a new worksheet and associate it with the workbook.
  26. Dim sheet As Sheet = New Sheet
  27. sheet.Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart)
  28. sheet.SheetId =
  29. sheet.Name = "mySheet"
  30. sheets.Append(sheet)
  31. workbookpart.Workbook.Save()
  32.  
  33. ' Close the document.
  34. spreadsheetDocument.Close()
  35. End Sub
  36.  
  37. End Module

重要电子表格部分


              

通过使用 Open XML SDK 2.5 for Office,可以使用 SpreadsheetML 元素所对应的强类型类创建文档结构和内容。可以在 DocumentFormat.OpenXML.Spreadsheet 命名空间中找到这些类。下表列出了一些重要电子表格元素所对应类的类名称。

 

包部分

顶级 SpreadsheetML 元素

Open XML SDK 2.5 类

说明

工作簿

workbook

Workbook

主文档部件的根元素。

工作表

worksheet

Worksheet

表示包含文本、数字、日期或公式的单元格网格的工作表类型。有关详细信息,请参阅使用工作表

图表工作表

chartsheet

Chartsheet

表示存储为自己的工作表的图表的工作表。有关详细信息,请参阅使用工作表

table

Table

指定属于单个数据集的一系列数据的逻辑构造。有关详细信息,请参阅使用表格 (SpreadsheetML)

数据透视表

pivotTableDefinition

PivotTableDefinition

显示可理解布局中数据的聚合视图的逻辑构造。有关详细信息,请参阅使用数据透视表 (Open XML SDK)

透视缓存

pivotCacheDefinition

PivotCacheDefinition

定义数据透视表中的数据源的构造。有关详细信息,请参阅使用数据透视表 (Open XML SDK)

透视缓存记录

pivotCacheRecords

PivotCacheRecords

数据透视表的源数据的缓存。有关详细信息,请参阅使用数据透视表 (Open XML SDK)

计算链

calcChain

CalculationChain

指定上次计算工作簿中单元格的顺序的构造。有关详细信息,请参阅使用计算链 (Open XML SDK)

共享字符串表

sst

SharedStringTable

包含每个唯一字符串在工作簿中的所有工作表上的出现次数的构造。有关详细信息,请参阅使用共享字符串表 (Open XML SDK)

条件格式

conditionalFormatting

ConditionalFormatting

定义应用于一个单元格或一系列单元格的格式的构造。有关详细信息,请参阅使用条件格式设置 (Open XML SDK)

公式

f

CellFormula

定义包含公式的单元格的公式文本的构造。有关详细信息,请参阅使用公式 (Open XML SDK)

如何使用 Excel 对象将 DataGridView 数据导出到 Excel的更多相关文章

  1. 学习笔记 DataGridView数据导出为Excel

    DataGridView数据导出为Excel   怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...

  2. vb.net-三种将datagridview数据导出为excel文件的函数

    第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll  office.dll #Region "导出excel函数 ...

  3. Asp.net网页中DataGridView数据导出到Excel

    经过上网找资料,终于找到一种可以直接将GridView中数据导出到Excel文件的方法,归纳方法如下: 1. 注:其中的字符集格式若改为“GB2312”,导出的部分数据可能为乱码: 导出之前需要关闭分 ...

  4. C#创建Excel文件并将数据导出到Excel文件

    工具原料: Windows 7,Visual Studio 2010, Microsoft Office 2007 创建解决方案 菜单>新建>项目>Windows窗体应用程序: 添加 ...

  5. datagridview数据导出到excel

    /// <summary> /// 导出Excel /// </summary> /// <param name="mydgv">控件 Data ...

  6. 将datagrid中数据导出到excel中 -------<<工作日志2014-6-6>>

    前台datagrid数据绑定 #region 导出到excel中    /// <summary>    /// 2014-6-6    /// </summary>    / ...

  7. 使用PHPExcel将数据导出至Excel

    安装类库 从GitHub上下载PHPExcel类库 地址:https://github.com/PHPOffice/PHPExcel 解压后将Classes文件夹移动到ThinkPHP的extend目 ...

  8. 将Datagridview中的数据导出至Excel中

        首先添加一个模块ImportToExcel,并添加引用         然后导入命名空间: Imports Microsoft.Office.Interop Imports System.Da ...

  9. 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm

    using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...

随机推荐

  1. Hbase 系统架构(zhuan)

    一.系统架构 客户端连接hbase依赖于zookeeper,hbase存储依赖于hadoop client: 1.包含访问 hbase 的接口, client 维护着一些 cache(缓存) 来加快对 ...

  2. WebForm母版页

    母版页:可以把界面的部分代码进行重用 添加新项-母版页 在母版页中界面代码不要写在 <asp:ContentPlaceHolder ID="head" runat=" ...

  3. write RE validation

    正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则) ...

  4. 使用addeventlistener为js动态创建的元素添加事件监听

    点击li弹出内容,并且动态添加li之后有效 <button onclick="addFunction()">点我增加</button> <ul> ...

  5. VMware vSphere 5.x 与 vSphere 6.0各版本功能特性对比

    各版本中的新特性及功能对比:   VMware vSphere 5.0 VMware vSphere 5.1 VMware vSphere 5.5 VMware vSphere 6.0 ESXi 5. ...

  6. Scala--reduceLeft

    reduceLeft神语法 val a = Array(20, 12, 6, 15, 2, 9) 1 2 3 4 5 6 7 8 scala> a.reduceLeft(_ + _)  // 数 ...

  7. 定位bug的基本要求

    很多人觉得qa只是负责发现问题,这个实在太狭隘了,现代qa除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产 ...

  8. layer(jQuery弹出层插件)

    弹窗alert:默认确定按钮+右上角关闭 top.layer.alert("请选择要删除的记录!",{shade: 0.3,offset:'250px'}); 弹窗alert:默认 ...

  9. 剑指offer(29)最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的 ...

  10. 分类统计的controller和service

    SpringMVC框架下的 部分代码: Controller控制器: @Resource ReviewTitleService reviewTitleService;//调用ReviewTitleSe ...