using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Xml; using DocumentFormat.OpenXml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; using DocumentFormat.OpenXml.Spreadsheet; namespace OpenXmlOficeDemo { /// <summary> /// Open XML SDK 2.0 for Microsoft Office http://www.microsoft.com/en-us/download/details.aspx?id=5124 /// Open XML SDK 2.5 for Microsoft Office http://www.microsoft.com/en-us/download/details.aspx?id=30425 /// Open XML SDK open source https://github.com/officedev/open-xml-sdk /// Open XML SDK 2.5 类库参考 https://msdn.microsoft.com/ZH-CN/library/gg278315.aspx /// http://openxmldeveloper.org/ /// https://github.com/OfficeDev/Open-Xml-PowerTools /// https://msdn.microsoft.com/en-us/library/office/bb448854.aspx /// https://github.com/OfficeDev /// </summary> public partial class Form1 : Form { /// <summary> /// /// </summary> public Form1() { InitializeComponent(); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { } /// <summary> /// /// </summary> public class Package { public string Company { get; set; } public double Weight { get; set; } public long TrackingNumber { get; set; } public DateTime DateOrder { get; set; } public bool HasCompleted { get; set; } } /// <summary> /// 生成EXCEL文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { string timeMark = DateTime.Now.ToString("yyyyMMddHHmmss"); string excelPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "geovindu" + timeMark + ".xlsx"); List<Package> packages = new List<Package> { new Package { Company = "Coho Vineyard", Weight = 25.2, TrackingNumber = 89453312L, DateOrder = DateTime.Today, HasCompleted = false }, new Package { Company = "Lucerne Publishing", Weight = 18.7, TrackingNumber = 89112755L, DateOrder = DateTime.Today, HasCompleted = false }, new Package { Company = "Wingtip Toys", Weight = 6.0, TrackingNumber = 299456122L, DateOrder = DateTime.Today, HasCompleted = false }, new Package { Company = "Adventure Works", Weight = 33.8, TrackingNumber = 4665518773L, DateOrder = DateTime.Today.AddDays(-4), HasCompleted = true }, new Package { Company = "Test Works", Weight = 35.8, TrackingNumber = 4665518774L, DateOrder = DateTime.Today.AddDays(-2), HasCompleted = true }, new Package { Company = "Good Works", Weight = 48.8, TrackingNumber = 4665518775L, DateOrder = DateTime.Today.AddDays(-1), HasCompleted = true }, }; List<string> headerNames = new List<string> { "Company", "Weight", "Tracking Number", "Date Order", "Completed" }; ExcelFacade excelFacade = new ExcelFacade(); excelFacade.Create<Package>(excelPath, packages, "Packages", headerNames); } /// <summary> /// 读取工作表 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button2_Click(object sender, EventArgs e) { string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Sample.xlsx"); List<SheetNameInfo> sheets = new List<SheetNameInfo>(); sheets = GetSheets(file); this.comboBox1.DataSource = sheets; comboBox1.DisplayMember = "SheetName"; comboBox1.ValueMember = "SheetID"; //1 //OpenXmlOficeDemo.SLExcelUtility.SLExcelReader read = new SLExcelUtility.SLExcelReader(); //var data = (new OpenXmlOficeDemo.SLExcelUtility.SLExcelReader()).ReadExcel(file); //this.dataGridView1.DataSource = data.DataRows; //2 //FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read); //DataTable dt = ReadAsDataTable(file); //this.dataGridView1.DataSource = dt; // fs.Close(); // fs.Dispose(); } /// <summary> /// /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button3_Click(object sender, EventArgs e) { string file = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Sample.xlsx"); //FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read); DataTable dt = ReadAsDataTable(file);// ReadExcel(this.comboBox1.SelectedText, fs); this.dataGridView1.DataSource = dt; //fs.Close(); //fs.Dispose(); } /// <summary> /// 读取工作表 /// EXCEL 2007版以上 /// </summary> /// <param name="strFileName"></param> /// <returns></returns> public static List<SheetNameInfo> GetSheets(String strFileName) { // Fill this collection with a list of all the sheets. List<SheetNameInfo> sheets = new List<SheetNameInfo>(); using (SpreadsheetDocument xlPackage = SpreadsheetDocument.Open(strFileName, false)) { WorkbookPart workbook = xlPackage.WorkbookPart; Stream workbookstr = workbook.GetStream(); XmlDocument doc = new XmlDocument(); doc.Load(workbookstr); XmlNamespaceManager nsManager = new XmlNamespaceManager(doc.NameTable); nsManager.AddNamespace("default", doc.DocumentElement.NamespaceURI); XmlNodeList nodelist = doc.SelectNodes("//default:sheets/default:sheet", nsManager); int k = 0; foreach (XmlNode node in nodelist) { SheetNameInfo sheetNameInfo = new SheetNameInfo(); String sheetName = String.Empty; sheetName = node.Attributes["name"].Value; sheetNameInfo.SheetID = k; sheetNameInfo.SheetName = sheetName; sheets.Add(sheetNameInfo); k++; } } return sheets; } /// <summary> /// /// </summary> /// <param name="cell"></param> /// <param name="stringTablePart"></param> /// <returns></returns> public static String GetValue(Cell cell, SharedStringTablePart stringTablePart) { if (cell.ChildElements.Count == 0) return null; //get cell value String value = cell.CellValue.InnerText; //Look up real value from shared string table if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString)) value = stringTablePart.SharedStringTable .ChildElements[Int32.Parse(value)] .InnerText; return value; } /// <summary> /// /// </summary> /// <param name="fileName"></param> /// <returns></returns> public static DataTable ReadAsDataTable(string fileName) { DataTable dataTable = new DataTable(); using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(fileName, false)) { WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart; IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>(); string relationshipId = sheets.First().Id.Value; WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId); Worksheet workSheet = worksheetPart.Worksheet; SheetData sheetData = workSheet.GetFirstChild<SheetData>(); IEnumerable<Row> rows = sheetData.Descendants<Row>(); foreach (Cell cell in rows.ElementAt(0)) { dataTable.Columns.Add(GetCellValue(spreadSheetDocument, cell)); } foreach (Row row in rows) { DataRow dataRow = dataTable.NewRow(); for (int i = 0; i < row.Descendants<Cell>().Count(); i++) { dataRow[i] = GetCellValue(spreadSheetDocument, row.Descendants<Cell>().ElementAt(i)); } dataTable.Rows.Add(dataRow); } } dataTable.Rows.RemoveAt(0); return dataTable; } /// <summary> /// /// </summary> /// <param name="document"></param> /// <param name="cell"></param> /// <returns></returns> private static string GetCellValue(SpreadsheetDocument document, Cell cell) { SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart; string value = cell.CellValue.InnerXml; if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString) { return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText; } else { return value; } }
时间: 2024-10-28 20:25:09