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也什么都不显示,因为没有定义列,同时也没有自动让他自己生成列)

WPF中Grid绑定DataTable数据。的更多相关文章

  1. 封装:WPF中可以绑定的BindPassWord控件

    原文:封装:WPF中可以绑定的BindPassWord控件 一.目的:本身自带的PassWord不支持绑定 二.Xaml部分 <UserControl x:Class="HeBianG ...

  2. WPF中Grid布局

    WPF中Grid布局XMAl与后台更改,最普通的登录界面为例. <Grid Width="200" Height="100" > <!--定义 ...

  3. WPF 中双向绑定通知机制之ObservableCollection使用

    msdn中   ObservableCollection<T> 类    表示一个动态数据集合,在添加项.移除项或刷新整个列表时,此集合将提供通知. 在许多情况下,所使用的数据是对象的集合 ...

  4. WPF中Grid容器中VerticalAlignment和HorizonAlignment和Margin的关系。

    在WPF中,经常使用Grid容器,来布局我们想要显示的对象. 这就不可避免的要和布局在其中的控件的VerticalAlignment特性,HorizonAlignment特性,以及Magin特性打交道 ...

  5. WPF中RadioButton绑定数据的正确方法

    RadioButton一般用于单选的时候,也就是从一组值中选择一个值. 比如性别有“男”和“女”两种取值,而对于一个员工的实例来说,性别的取值要么是男,要么是女. 这种时候一般就会用到RadioBut ...

  6. WPF中ComboBox绑定数据库自动读取产生数据

    前台端 <ComboBox HorizontalAlignment="Name="cmb_SSBM" DisplayMemberPath="NAME&qu ...

  7. ComboBox在WPF中的绑定示例:绑定项、集合、转换,及其源代码

    示例1.Selector(基类) 的示例Controls/SelectionControl/SelectorDemo.xaml <Page x:Class="Windows10.Con ...

  8. <转>WPF 中的绑定

    在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...

  9. WPF中为ListView动态绑定数据(可参考)

    GridView gv = new GridView(); DataTable dt = fieldManageBLL.GetFieldManage(moduleName); for(int i=0; ...

随机推荐

  1. Xcode UUID查询

    打开终端,输入: defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

  2. EntityFrame CodeFirst 自动生成表

    来源:http://msdn.microsoft.com/zh-cn/data/jj193542 本视频和分步演练介绍通过 Code First 开发建立新数据库.这个方案包括建立不存在的数据库(Co ...

  3. 【资源】NOIP2013测试数据senior/junior 普及/提高 数据

    https://yunpan.cn/cRSepfcG4XX3V  访问密码 48e1 NOIP2013测试数据senior/junior 普及/提高 数据都在了

  4. apace日常操作和配置

    [root@limt modules]# /usr/sbin/apachectl -h Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file ...

  5. 【JAE】JAE京东云擎部署首个Java应用

    前几天一直在寻找好用并且免费的PaaS最终就发现了国内的京东云擎JAE和国外的Heroku.我首先选择的是Heroku,因为他有一个非常强大的eclipse插件 为开发带来了很大的方便.用它提交后的代 ...

  6. Self-introduction (自我介绍)

     * 姓名,本名不想这样就暴露,Rachel我英文名,不愿意叫算了,直接叫我米蟲就好了.   * 性格, 偏执一些,表里不一,表面和善,骨子倔强,我这一生都在追求高逼格,从未间断过 偶尔像个小疯子,有 ...

  7. Daily Scrum02 12.10

    不同于往常,今天我们在中午体育课后,就简单的进行了一次小组会议,主要是讨论了一下,我们的单词软件的查询功能的优化的进度与暂时达到的效果,界面的各个按钮等元素的素材的准备有点拖慢,由于要反复修改,查看效 ...

  8. 错误Batch update returned unexpected row count from update [0]; actual row count: 0;

    参考:http://blog.csdn.net/ssyan/article/details/7471343 也是出现类似问题,在前台页面的隐藏域中判断id是否为null,而没有去判断是否为空字符串. ...

  9. Ubuntu下的PHP开发环境架设

    Ubuntu下的PHP开发环境架设   今天重新装了ubuntu那么就吧过程记录下. 打开终端,也就是命令提示符. 我们先来最小化组建安装,按照自己的需求一步一步装其他扩展.命令提示符输入如下命令: ...

  10. Oracle数据库的导入导出

    1.导出Oracle数据 A.使用命令行导出数据 exp username/password @database file= fullpath(如:D:\data.dmp) full=y B.使用工具 ...