c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable

1.须要引用的dll :  DocumentFormat.OpenXml.dll  ---须要安装一下OpenXml再引用

WindowsBase  ---直接在项目里加入引用

2.方法:

/// <summary>
        /// 读取.xlsx格式的Excel文件数据,读取其特定名称的工作薄
        /// </summary>
        /// <param name="filePath">文件路径 如 D:\\excel1.xls</param>
        /// <param name="sheetName">工作薄名称 如 Sheet1</param>
        /// <param name="fieldNames">要转化成的DataTable的列名数组</param>
        /// <returns></returns>
        public static DataTable ReadExcelToDataTable(Stream fileStream, string sheetName, string[] fieldNames)
        {

              using (var document = SpreadsheetDocument.Open(fileStream, false))
            {
                var sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(p => p.Name == sheetName);
                var enumerable = sheets as Sheet[] ??

sheets.ToArray();
                if (!enumerable.Any())
                {
                    return null;
                }
                var wsp = (WorksheetPart)document.WorkbookPart.GetPartById(enumerable.First().Id);
                //获取Excel中共享数据
                var stringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
                var rows = wsp.Worksheet.Descendants<Row>();//获得Excel中得数据行
                DataTable table = new DataTable();
                foreach (var name in fieldNames)
                {
                    table.Columns.Add(name, typeof(string));
                }
                //由于需要将数据导入到DataTable中,所以我们假定Excel的第一行是列名,从第二行开端是行数据
                var _count = 0;
                var enumerable1 = rows as Row[] ?? rows.ToArray();
                var total = enumerable1.Count() - 1;
                foreach (var row in enumerable1)
                {
                    if (row.RowIndex > 1)
                    {
                        _count++;
                        GetDataRow(row, stringTable, ref table, fieldNames); //Excel第二行同一时候为DataTable的第一行数据
                        if (_count % 100 != 0) continue;
                        var per = (100 * _count / total - 5) <= 0 ? 1 : (100 * _count / total - 5);
                        var perS = per.ToString(CultureInfo.InvariantCulture) + "%";

                        HttpContext.Current.Response.Write("<script>top.process(‘" + perS + "‘);</script>");
                        HttpContext.Current.Response.Flush();
                    }
                }
                return table;
            }
        }
        /// 获取Excel行数据
        private static void GetDataRow(IEnumerable<OpenXmlElement> row, OpenXmlElement stringTable, ref DataTable table, string[] fieldNames)
        {
            if (stringTable == null) throw new ArgumentNullException("stringTable");
            var dic = new Dictionary<int, string>();
            var i = 0;
            foreach (Cell cell in row)
            {
                GetValue(i, cell, stringTable, ref dic);
                i++;
            }
            if (dic.Count == 0)
            {
                return;
            }
            var dr = table.NewRow();
            int index = 0;
            foreach (var name in fieldNames)
            {
                dr[name] = dic[index];
                index++;
            }
            table.Rows.Add(dr);
        }
        /// 获取Excel单元格数据
        private static void GetValue(int i, CellType cell, OpenXmlElement stringTable, ref Dictionary<int, string> dic)
        {
            if (stringTable == null) throw new ArgumentNullException("stringTable");
            //由于Excel的数据存储在SharedStringTable中,需要获取数据在SharedStringTable 中的索引
            var value = string.Empty;
            try
            {
                if (cell.ChildElements.Count == 0)
                    return;
                value = cell.CellValue.InnerText;
                if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
                {
                    value = stringTable.ChildElements[Int32.Parse(value)].InnerText;
                }
                dic.Add(i, value);

            }
            catch (Exception)
            {
            }
        }
时间: 2024-10-16 11:58:49

c# 用OpenXmL读取.xlsx格式的Excel文件 返回DataTable的相关文章

通过XML转换下载.xlsx格式的excel文件

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件. &lt;img class="alignnone size-full wp-image-2802" src="http://www.baidusap.com/wp-content/uploads/2017-02-04_15-28-29.png"

◆◆0通过XML转换下载.xlsx格式的excel文件

在SAP系统中,通过SE11显示一个table的内容,可以发现ALV grid的显示界面上有个spread sheet的标准按钮,点击这个按钮可以将显示的内容下载成excel文件,其中也包括扩展名.xlsx的文件. 这个功能很方便,因为下载的结果和ALV中看到的是一样的. debug研究了一下标准代码,发现是将需要下载的内表先转换成XML stream,然后再通过gui_download的BIN模式将xml stream下载成.xlsx文件. 写了一个简单的程序供大家参考 1 2 3 4 5 6

RHEL 6.4 64bit kettle5.01导入xlsx格式的excel时报错

环境:RHEL 6.4 64bit : kettle5.01:xlsx格式的excel 创建的job,在spoon里面运行都没有问题(Linux和windows) 在windows的命令行运行也没有问题,但是在Linux的命令行运行就有问题了报[[email protected] data-integration]$ ./kitchen.sh -rep:"rui_test_repository" -job:"job_one" -dir:/ -user:admin -

读取指定路径的Excel内容到DataTable中

1 /// <summary> 2 /// 读取指定路径的Excel内容到DataTable中 3 /// </summary> 4 /// <param name="path"></param> 5 /// <returns></returns> 6 public DataTable ImportToDataSet(string path) 7 { 8 string strConn = "Provide

用python读取带密码的excel文件中的数据

用python读取带密码的excel文件中的数据,程序代码如下: #filename:readingxls.py ''' 此程序的作用为:用python读取带密码的excel文件中的数据. 首先通过pip安装xlrd第三方库 pip3 install xlrd 请输入excel文件路径:D:\x1.xls ''' import xlrd path=input("请输入excel文件路径:") workbook=xlrd.open_workbook(path) b=len(workboo

利用PHPExcel将数据导出到xls格式的excel文件

在开发某地的经营许可证管理系统的时候需要将数据导出打excel文件,虽然一年前做某集团的ERP的时候用到过一次导入和导出,但是那时候太忙没时间写博客,一年过去了我也忘的差不多了,所以趁着今天将此次的使用写到博客中,作为以后开发的一个参考,免得再次使用的时候需要导出找资料,也给其他同行一个参考.作者:DragonDean,博客地址:http://www.cnblogs.com/dragondean/ 什么是PHPExcel? PHPExcel 是用来操作Office Excel 文档的一个PHP类

ci框架读取上传的excel文件数据

原文链接: https://blog.csdn.net/qq_38148394/article/details/87921373 此功能实现使用到PHPExcel类库,PHPExcel是一个PHP类库,用来帮助我们简单.高效实现从Excel读取Excel的数据和导出数据到Excel.也是我们日常开发中,经常会遇到的使用场景. (一) PHPExcel下载 类库下载地址:https://github.com/PHPOffice/PHPExcel (二) PHPExcel引入到CI框架 1) 解压压

pdmreader支持读取xml格式的pdm文件,无法读取二进制格式的pdm文件。

您的Pdm数据字典文件可能不被PDMReader读取,可能是因为pdm文件版本的问题.但 您可以通过PowerDesigner12(下载PowerDesigner12)进行转换 后进行读取. 您要做的就是将bin格式的pdm文件转换为xml格式的pdm文件.如下图.(建议使用PowerDesigner12版本进行转换) 1.转换为XML格式很简单, 用PowerDesigener 12.0(下载PowerDesigner12),打开 您的*.PDM文件    2.选择FILE,然后选择save

[转] 从数据库中读取图片并导入Excel文件,C#方式

原文地址, 作者 Lvyou1980 直接源码吧. using System; using System.IO; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms; using Excel; private void EduceExcel() { string picPath=Directory.GetCurrentDirectory()+'\\Exc