zoukankan      html  css  js  c++  java
  • WPF中Grid绑定DataTable数据。

    1.首先引用DocumentFormat.OpenXml.dll

    2.然后新建一个OpenExcelHelper类,将Excel转化为Datatable。

            /// <summary>
            /// 根据指定EXCEL流组织成DataTable
            /// </summary>
            /// <param name="sheetName">需要读取的SHEET</param>
            /// <param name="stream">EXCEL文件流</param>
            /// <returns>DataTable</returns>
            public static  DataTable GetExcelData(string sheetName, string stream)
            {

                using (SpreadsheetDocument document = SpreadsheetDocument.Open(stream, false))
                {
                    //打开Excel
                    IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
                    if (sheets.Count() == 0)
                    {
                        return null;
                    }
                    WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);
                    //获取Excel中共享数据
                    SharedStringTable sst = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
                    //得到Excel中得数据行
                    IEnumerable<Row> rows = worksheetPart.Worksheet.Descendants<Row>();
                    DataTable dt = new DataTable();
                    //因为需要将数据导入到DataTable中,所以我们假定Excel的第一行是列名,从第二行开始是行数据
                    foreach (Row row in rows)
                    {
                        if (row.RowIndex == 1)
                        {
                            //Excel第一行为列名
                            GetDataColumn(row, sst, ref dt);
                        }
                        //Excel第二行同时为DataTable的第一行数据
                        GetDataRow(row, sst, ref dt);
                    }
                    return dt;
                }
            }
            private static void GetDataColumn(Row row, SharedStringTable sst, ref DataTable dt)
            {
                DataColumn dc = new DataColumn();
                foreach (Cell cell in row)
                {
                    string cellValue = GetcellValue(cell, sst);
                    dc = new DataColumn(cellValue);
                    dt.Columns.Add(dc);
                }
            }
            /// <summary>
            /// 构建DataTable的列
            /// </summary>
            /// <param name="row">OpenXML定义的Row对象</param>
            /// <param name="sst"></param>
            /// <param name="dt">需要返回的DataTable对象</param>
            private static  void GetDataRow(Row row, SharedStringTable sst, ref DataTable dt)
            {
                DataRow dr = dt.NewRow();
                int i = 0;
                int nullRowCount = i;
                foreach (Cell cell in row)
                {
                    string cellVal = GetcellValue(cell, sst);
                    if (cellVal == string.Empty)
                    {
                        nullRowCount++;
                    }
                    dr[i] = cellVal;
                    i++;
                }
                if (nullRowCount != i)
                {
                    dt.Rows.Add(dr);
                }

            }
            /// <summary>
            /// 获取单元格的值
            /// </summary>
            /// <param name="cell"></param>
            /// <param name="sst"></param>
            /// <returns></returns>
            private static  string GetcellValue(Cell cell, SharedStringTable sst)
            {
                //由于Excel的数据存储在SharedStringTable中,需要获取数据在SharedStringTable 中的索引
                string value = string.Empty;
                try
                {
                    if (cell.ChildElements.Count == 0)
                    {
                        return value;

                    }
                    value = double.Parse(cell.CellValue.InnerText).ToString();
                    if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
                    {
                        value = sst.ChildElements[Int32.Parse(value)].InnerText;
                    }
                }
                catch (Exception)
                {

                    value = "N/A";
                }
                return value;

            }

    3.页面对应的代码。

    4页面(AutoGenerateColumns一定要设置为true。AutoGenerateColumns 就是自动产生列的意思
    gridview等控件,如果设置了 AutoGenerateColumns=true,就能够根据数据源的实际情况,自动生成gridview表格列,如果设置为 AutoGenerateColumns=flase,那么就必须要手动编写gridview控件的columns集合,否则即使正确帮定了数 据,gridvew也什么都不显示,因为没有定义列,同时也没有自动让他自己生成列)

     



          

  • 相关阅读:
    context-annotation
    bean-annotation
    K-means算法
    基于概率的分类-贝叶斯分类
    Application
    ConfigurableApplicationContext
    相关性分析
    方差分析
    Java 大写金额转换成数字
    linux 遍历文件添加index
  • 原文地址:https://www.cnblogs.com/qian3344/p/4682638.html
Copyright © 2011-2022 走看看