热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenXml创建Excel,读excel,将DataGrid数据导出到excel

仅此记录一下,有些许bug,但不重要,可以自行修改。excel的工具类。publicclassExcelUtils{注意:需要提前添加Docum

仅此记录一下,有些许bug,但不重要,可以自行修改。

excel的工具类。

public class ExcelUtils
    {///注意:  
     ///需要提前添加DocumentFormat.OpenXml.dll  
     ///openXml只能处理后缀为xlsx的excel文件,xls格式的不支持  
        private object m_objOpt = Missing.Value;

        private DocumentFormat.OpenXml.Packaging.SpreadsheetDocument m_objSpreadsheetDocument = null;
        private WorkbookPart m_objWorkbookPart = null;
        private WorksheetPart m_objWorksheetPart = null;
        private Worksheet m_objWorksheet = null;
        private SheetData m_objSheetData = null;

        List NormalSheets = new List();
        const int BranchCodeRow = 2;
        const int BranchCodeStartCol = 3;
        const int DataEndRow = 7;	

        #region CreateExcel Interop 2013  
        ///   
        /// 创建excel,并且把dataTable导入到excel中  
        ///          
        /// 保存路径  
        /// 数据源  
        /// excel中sheet的名称    
        public void CreateExcel(string destination, DataTable[] dataTables, string[] sheetNames = null)
        {
            using (var workbook = SpreadsheetDocument.Create(destination, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook))
            {
                var workbookPart = workbook.AddWorkbookPart();
                workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook();
                workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets();

                uint sheetId = 1;                
                foreach (DataTable table in dataTables)
                {
                    var sheetPart = workbook.WorkbookPart.AddNewPart();
                    var sheetData = new SheetData();
                    sheetPart.Worksheet = new Worksheet();                   
                    Columns headColumns = CrateColunms(table);
                    sheetPart.Worksheet.Append(headColumns);
                    DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild();
                    string relatiOnshipId= workbook.WorkbookPart.GetIdOfPart(sheetPart);

                    if (sheets.Elements().Count() > 0)
                    {
                        sheetId =
                            sheets.Elements().Select(s => s.SheetId.Value).Max() + 1;
                    }
                    string sheetName = string.Empty;
                    if (sheetNames != null)
                    {
                        if (sheetNames.Length >= sheetId)
                        {
                            sheetName = sheetNames[sheetId - 1].ToString();
                        }
                    }
                    else
                    {
                        sheetName = table.TableName ?? sheetId.ToString();
                    }

                    DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
                    sheets.Append(sheet);

                    DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row();

                    List columns = new List();
                    foreach (DataColumn column in table.Columns)
                    {
                        columns.Add(column.ColumnName);

                        DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                        cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                        cell.StyleIndex = 11;
                        cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName);
                        headerRow.AppendChild(cell);
                    }
                    sheetData.AppendChild(headerRow);

                    foreach (DataRow dsrow in table.Rows)
                    {
                        DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row();
                        foreach (String col in columns)
                        {
                            DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell();
                            cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String;
                            cell.StyleIndex = 10;
                            cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); //  
                            newRow.AppendChild(cell);
                        }
                        sheetData.AppendChild(newRow);
                    }
                    sheetPart.Worksheet.Append(sheetData);
                }
                workbook.Close();
            }
        }

        private Columns CrateColunms(DataTable table)
        {
            int numCols = table.Columns.Count;
            var columns = new Columns();
            for (int col = 0; col  columns = new List();
            foreach (DataColumn column in table.Columns)
            {
                columns.Add(column.ColumnName);

                Cell cell = new Cell();
                cell.StyleIndex = 11;
                cell.DataType = CellValues.String;
                cell.CellValue = new CellValue(column.ColumnName);
                headerRow.Append(cell);
            }

            sheetData.Append(headerRow);

            foreach (DataRow dsrow in table.Rows)
            {
                Row newRow = new Row();
                foreach (String col in columns)
                {
                    Cell cell = new Cell();
                    cell.StyleIndex = 10;
                    cell.DataType = CellValues.String;
                    cell.CellValue = new CellValue(dsrow[col].ToString()); //  
                    newRow.Append(cell);
                }

                sheetData.Append(newRow);
            }

            return sheetData;
        }
		#endregion

		public void ReadExcelFromStream(Stream stream, bool isEditable)
        {
            try
            {
                m_objSpreadsheetDocument = SpreadsheetDocument.Open(stream, isEditable);
                m_objWorkbookPart = m_objSpreadsheetDocument.WorkbookPart;
                m_objWorksheetPart = m_objWorkbookPart.WorksheetParts.First();
                m_objWorksheet = m_objWorksheetPart.Worksheet;
                m_objSheetData = m_objWorksheet.Elements().First();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                this.DisposeRead();
                throw;
            }
        }

        ///   
        /// 获取excel中cell的值  
        ///   
        ///   
        ///   
        ///   
        public string GetCellValue(string columnName, int rowIndex)
        {
            Cell cell = GetCell(columnName, rowIndex);
            if (cell == null)
            {
                return string.Empty;
            }
            if (cell.CellValue == null)
            {
                return string.Empty;
            }
            int cellId = Convert.ToInt32(cell.CellValue.Text);
            return m_objWorkbookPart.SharedStringTablePart.SharedStringTable.Elements().ElementAt(cellId).InnerText;
        }

        public Cell GetCell(string columnName, int rowIndex)
        {
            Row row = GetRow(Convert.ToUInt32(rowIndex));

            if (row == null)
            {
                return null;
            }
            return row.Elements().Where(c => string.Compare(c.CellReference.Value, columnName + rowIndex, true) == 0).First();
        }

        // Given a worksheet and a row index, return the row.  
        public Row GetRow(uint rowIndex)
        {
            if (m_objWorksheet == null)
            {
                return null;
            }
            return m_objWorksheet.GetFirstChild().Elements().Where(r => r.RowIndex == rowIndex).First();
        }

        public List GetRows()
        {
            if (m_objSheetData == null)
            {
                return null;
            }
            return m_objSheetData.Elements().ToList();
        }

        public void CloseRead()
        {
            if (m_objSpreadsheetDocument != null)
            {
                m_objSpreadsheetDocument.Dispose();
            }
        }

        public void DisposeRead()
        {
            if (m_objWorksheet != null)
            {
                Marshal.FinalReleaseComObject(m_objWorksheet);
            }
            if (m_objWorksheetPart != null)
            {
                Marshal.FinalReleaseComObject(m_objWorksheetPart);
            }
            if (m_objWorkbookPart != null)
            {
                Marshal.FinalReleaseComObject(m_objWorkbookPart);
            }
            if (m_objSpreadsheetDocument != null)
            {
                Marshal.FinalReleaseComObject(m_objSpreadsheetDocument);
                int intGeneration = GC.GetGeneration(m_objSpreadsheetDocument);
                m_objSpreadsheetDocument = null;
                GC.Collect(intGeneration);
            }
            GC.Collect();
            GC.Collect();
        }


        public List ReadAllSheetToList(Stream stream)
        {
            List tables = new List();

            //MemoryStream ms = new MemoryStream();  
            //stream.CopyTo(ms);  
            using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, false))
            {
                foreach (Sheet sheet in doc.WorkbookPart.Workbook.Descendants())
                {

                    WorksheetPart worksheet = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
                    List columnsNames = new List();
                    if (NormalSheets.Contains(sheet.Name.Value))
                    {
                        DataTable table = new DataTable(sheet.Name.Value);
                        foreach (Row row in worksheet.Worksheet.Descendants())
                        {
                            if (row.RowIndex == BranchCodeRow)
                            {
                                List colvalue = new List();
                                int colindex = 1;
                                int tablecolindex = 1;
                                table.Columns.Add("C" + tablecolindex.ToString());
                                foreach (Cell cell in row)
                                {
                                    tablecolindex++;
                                    if (colindex >= BranchCodeStartCol && !String.IsNullOrEmpty(GetCellValue(doc, cell).ToString().Trim()))
                                    {
                                        table.Columns.Add("C" + tablecolindex.ToString());
                                        colvalue.Add(GetCellValue(doc, cell).ToString().Trim());
                                    }
                                    colindex++;
                                }
                                DataRow dr1 = table.NewRow();
                                dr1[0] = "";
                                for (int i1 = 0; i1  BranchCodeRow && row.RowIndex <= DataEndRow)
                            {
                                DataRow dr = table.NewRow();
                                int colindex = 1;
                                int readindex = 0;
                                foreach (Cell cell in row)
                                {

                                    if (colindex >= BranchCodeStartCol - 1 && readindex = table.Columns.Count)
                                    {
                                        break;
                                    }
                                    colindex++;

                                }
                                table.Rows.Add(dr);
                            }
                            else if (row.RowIndex > DataEndRow)
                            {
                                break;
                            }
                        }
                        tables.Add(table);
                    }
                    else if (sheet.Name.Value == "Base")
                    {
                        DataTable table = new DataTable(sheet.Name.Value);
                        table.Columns.Add("c1");



                        foreach (Row row in worksheet.Worksheet.Descendants())
                        {
                            int colindex = 1;
                            if (row.RowIndex == 2 || row.RowIndex == 3)
                            {
                                foreach (Cell cell in row)
                                {
                                    if (colindex == 2)
                                    {
                                        DataRow dr1 = table.NewRow();
                                        dr1[0] = GetCellValue(doc, cell).ToString().Trim();
                                        table.Rows.Add(dr1);
                                        break;
                                    }
                                    colindex++;

                                }
                                if (row.RowIndex == 3)
                                {
                                    break;
                                }
                            }
                        }
                        tables.Add(table);
                    }
                    else if (sheet.Name.Value == "MO")
                    {

                        DataTable table = new DataTable(sheet.Name.Value);
                        foreach (Row row in worksheet.Worksheet.Descendants())
                        {

                            if (row.RowIndex == 2)
                            {

                                List colvalue = new List();
                                int colindex = 1;
                                int tablecolindex = 1;
                                table.Columns.Add("C" + tablecolindex.ToString());
                                foreach (Cell cell in row)
                                {

                                    if (colindex >= 3 && !String.IsNullOrEmpty(GetCellValue(doc, cell).ToString().Trim()))
                                    {
                                        tablecolindex++;
                                        table.Columns.Add("C" + tablecolindex.ToString());
                                        colvalue.Add(GetCellValue(doc, cell).ToString().Trim());
                                    }
                                    colindex++;
                                }
                                DataRow dr1 = table.NewRow();
                                dr1[0] = "";
                                for (int i1 = 0; i1 = 3 && row.RowIndex <= 7) || (row.RowIndex >= 11 && row.RowIndex <= 15) || (row.RowIndex >= 19 && row.RowIndex <= 23) || (row.RowIndex >= 27 && row.RowIndex <= 31))
                            {
                                DataRow dr = table.NewRow();
                                int colindex = 1;
                                int readindex = 0;
                                foreach (Cell cell in row)
                                {

                                    if (colindex >= 2 && readindex  table.Columns.Count)
                                    {
                                        break;
                                    }
                                    colindex++;

                                }
                                table.Rows.Add(dr);
                            }
                            else if (row.RowIndex > 31)
                            {
                                break;
                            }
                        }
                        tables.Add(table);
                    }
                    else
                    {
                        break;
                    }


                }
            }
            return tables;
        }

        ///   
        /// 将excel中第一个sheet的数据导入到DataTable  
        ///   
        ///   
        ///   
        public DataTable ReadFirstSheetData(Stream stream)
        {
            DataTable dt = new DataTable();
            SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(stream, false);
            WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
            IEnumerable sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild().Elements();
            //string relatiOnshipId= sheets.First().Id.Value = sheets.First(x => x.Name == "Sheet1").Id.Value;  
            string relatiOnshipId= sheets.First().Id.Value;
            WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
            Worksheet workSheet = worksheetPart.Worksheet;
            SheetData sheetData = workSheet.GetFirstChild();
            Row[] rows = sheetData.Descendants().ToArray();
            // Add columns  
            foreach (Cell cell in rows.ElementAt(0))
            {
                dt.Columns.Add((string)GetCellValue(spreadSheetDocument, cell));
            }
            // Add rows  
            for (int rowIndex = 1; rowIndex ().Count(); i++)
                {
                    tempRow[i] = GetCellValue(spreadSheetDocument, rows[rowIndex].Descendants().ElementAt(i));
                }
                dt.Rows.Add(tempRow);
            }
            // Release document  
            if (spreadSheetDocument != null)
            {
                int intGeneration = GC.GetGeneration(spreadSheetDocument);
                spreadSheetDocument.Dispose();
                spreadSheetDocument = null;
                GC.Collect(intGeneration);
            }
            return dt;
        }

        private string GetCellValue(SpreadsheetDocument document, Cell cell)
        {
            if (cell == null)
            {
                return string.Empty;
            }
            if (cell.CellValue == null)
            {
                return string.Empty;
            }
            return cell.CellValue.InnerXml;
        }
    }

主窗口:

		public MainWindow()
		{
			InitializeComponent();
		}

		private void btn_creatExcel(object sender, RoutedEventArgs e)
		{
			ExcelUtils excelUtils = new ExcelUtils();
			excelUtils.CreateExcel(GetFileString(), new DataTable[] { CreatTable() }, new string[] { "caocao" });
		}

		public string GetFileString()
		{
			string filePath = "";
			System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog();
			saveFileDialog.Filter = "Excel file (*.xlsx)|*.xlsx";
			if (saveFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				filePath = saveFileDialog.FileName;
			}
			return filePath;
		}
		public string GetOpenFileString()
		{
			string filePath = "";
			System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog();
			openFileDialog.Filter = "Excel file (*.xlsx)|*.xlsx";
			if (openFileDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
			{
				filePath = openFileDialog.FileName;
			}
			return filePath;
		}
		private DataTable CreatTable()
		{
			//创建DataSet对象
			DataSet ds = new DataSet();
			//创建DataTable对象
			DataTable dt = new DataTable();
			//创建列
			dt.Columns.Add("姓名", typeof(string));
			dt.Columns.Add("学号", typeof(int));
			//创建行
			DataRow row = dt.NewRow();
			//添加数据
			row[0] = "ACB";
			row[1] = 123;
			//将行添加到数据表的行集合中
			dt.Rows.Add(row);
			return dt;
		}

		private void btn_readExcel(object sender, RoutedEventArgs e)
		{
			DataTable dt = new DataTable();
			string filePath = GetOpenFileString();
			ExcelUtils excelUtils = new ExcelUtils();
			dt= excelUtils.ReadFirstSheetData(new System.IO.FileStream(filePath, System.IO.FileMode.Open));
			this.dataGrid.ItemsSource = dt.DefaultView;
		}

		private void btn_exportExcel(object sender, RoutedEventArgs e)
		{
			string filePath = GetFileString();
			ExcelUtils excelUtils = new ExcelUtils();
			DataTable dt = new DataTable();
			excelUtils.CreateExcel(filePath, new DataTable[] { (this.dataGrid.ItemsSource as System.Data.DataView).Table }, new string[] { "abc" });
		}
	}



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 判断数组是否全为0_连续子数组的最大和的解题思路及代码方法一_动态规划
    本文介绍了判断数组是否全为0以及求解连续子数组的最大和的解题思路及代码方法一,即动态规划。通过动态规划的方法,可以找出连续子数组的最大和,具体思路是尽量选择正数的部分,遇到负数则不选择进去,遇到正数则保留并继续考察。本文给出了状态定义和状态转移方程,并提供了具体的代码实现。 ... [详细]
author-avatar
傻孩纸黄国帅哟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有