zoukankan      html  css  js  c++  java
  • 用openXML读取Excel数据 和用OleDbConnection 连接读取excel

     先见excel加入到文件流:

    FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
     DataTable table = ImportExcel.ReadExcel("Sheet1", fs);
     fs.Dispose();

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.Data.OleDb;
    using System.IO;
    using DocumentFormat.OpenXml;
    using DocumentFormat.OpenXml.Spreadsheet;
    using DocumentFormat.OpenXml.Packaging;
    namespace Web.Manage.Models
    {
        public class ImportExcel
        {

            public ImportExcel()
            {
                //          
                // TODO: 在此处添加构造函数逻辑          
                //      
            }
            static OleDbConnection GetConnection(string path)
            {
                var strConn = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0;", path);
                var conn = new OleDbConnection(strConn);
                conn.Open();
                return conn;
            }
            ///        
            /// 获取Excel的表名[Sheet1$]      
            /// ///       
            /// /// Excel的路径       
            /// DataTable      
            public static System.Data.DataTable GetExcelTableName(string path)
            {
                var conn = GetConnection(path);
                var dt = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                conn.Close();
                return dt;
            }

            /// <summary>
            /// 根据excel工作表名获取内容
            /// </summary>
            /// <param name="tableName">表名</param>
            /// <param name="path">文件路径</param>
            /// <returns>DataTable</returns>

            public static System.Data.DataTable GetExcelTable(string tableName, string path)
            {

                var sql = string.Format("SELECT * FROM [{0}]", tableName);
                var conn = GetConnection(path);
                var myCommand = new OleDbDataAdapter(sql, conn);
                var myDataSet = new DataSet();
                myCommand.Fill(myDataSet);
                conn.Close();
                return myDataSet.Tables[0];
            }
            /// <summary>
            /// 删除文件
            /// </summary>
            /// <param name="path"></param>
            public static void DeleteFile(string path)
            {
                try
                {
                    File.Delete(path);
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
            /// <summary>
            /// 流式下载文件
            /// </summary>
            public static void DownLoadFile()
            {
                string fileName = "Parameter_Alias_Import_Template.xlsx";//客户端保存的文件名

                string filePath = HttpContext.Current.Server.MapPath("../File/Temp/Parameter_Alias_Import_Template.xlsx");//路径 //以字符流的形式下载文件

                FileStream fs = new FileStream(filePath, FileMode.Open);

                byte[] bytes = new byte[(int)fs.Length]; fs.Read(bytes, 0, bytes.Length);

                fs.Close();

                HttpContext.Current.Response.ContentType = "application/octet-stream";

                HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));//通知浏览器下载文件而不是打开

                HttpContext.Current.Response.BinaryWrite(bytes);

                HttpContext.Current.Response.Flush();

                HttpContext.Current.Response.End();
            }
            #region 采用openxml方式把excel转换成dataTable
            /// <summary>
            /// Excel流组织成Datatable
            /// </summary>
            /// <param name="stream">Excel文件流</param>
            /// <param name="sheetName">须要读取的Sheet</param>
            /// <returns>DataTable</returns>
            public  DataTable ReadExcel(string sheetName, Stream stream)
            {
                using (SpreadsheetDocument document = SpreadsheetDocument.Open(stream, false))
                {//打开Stream
                    IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);
                    if (sheets.Count() == 0)
                    {//找出合适前提的sheet,没有则返回
                        return null;
                    }
                    WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id);
                    //获取Excel中共享数据
                    SharedStringTable stringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
                    IEnumerable<Row> rows = worksheetPart.Worksheet.Descendants<Row>();//获得Excel中得数据行
                    DataTable dt = new DataTable("Excel");
                    foreach (Row row in rows)
                    {
                        if (row.RowIndex == 1)
                        {//Excel第一行动列名
                            GetDataColumn(row, stringTable, ref dt);
                        }
                        else
                        {
                            GetDataRow(row, stringTable, ref dt);//Excel第二行同时为DataTable的第一行数据
                        }
                      
                    }
                    return dt;
                }
            }
            /// <summary>
            /// 构建DataTable的列
            /// </summary>
            /// <param name="row">OpenXML定义的Row对象</param>
            /// <param name="stringTablePart"></param>
            /// <param name="dt">须要返回的DataTable对象</param>
            /// <returns></returns>
            public void GetDataColumn(Row row, SharedStringTable stringTable, ref DataTable dt)
            {
                DataColumn col = new DataColumn();
                Dictionary<string, int> columnCount = new Dictionary<string, int>();
                foreach (Cell cell in row)
                {
                    string cellVal = GetValue(cell, stringTable);
                    col = new DataColumn(cellVal);
                    if (IsContainsColumn(dt, col.ColumnName))
                    {
                        if (!columnCount.ContainsKey(col.ColumnName))
                            columnCount.Add(col.ColumnName, 0);
                        col.ColumnName = col.ColumnName + (columnCount[col.ColumnName]++);
                    }
                    dt.Columns.Add(col);
                }
            }
            /// <summary>
            /// 构建DataTable的每一行数据,并返回该Datatable
            /// </summary>
            /// <param name="row">OpenXML的行</param>
            /// <param name="stringTablePart"></param>
            /// <param name="dt">DataTable</param>
            private void GetDataRow(Row row, SharedStringTable stringTable, ref DataTable dt)
            {
                // 读取算法:按行一一读取单位格,若是整行均是空数据
                DataRow dr = dt.NewRow();
                int i = 0;
                int nullRowCount = i;
                foreach (Cell cell in row)
                {
                    string cellVal = GetValue(cell, stringTable);
                    if (cellVal == string.Empty)
                    {
                        nullRowCount++;
                    }
                    dr[i] = cellVal;
                    i++;
                }
                if (nullRowCount != i)
                {
                    dt.Rows.Add(dr);
                }
            }
            /// <summary>
            /// 获取单位格的值
            /// </summary>
            /// <param name="cell"></param>
            /// <param name="stringTablePart"></param>
            /// <returns></returns>
            private string GetValue(Cell cell, SharedStringTable stringTable)
            {
                //因为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 = stringTable.ChildElements[Int32.Parse(value)].InnerText;
                    }
                }
                catch (Exception)
                {
                    value = "N/A";
                }
                return value;
            }
            /// <summary>
            /// 判断网格是否存在列
            /// </summary>
            /// <param name="dt">网格</param>
            /// <param name="columnName">列名</param>
            /// <returns></returns>
            public bool IsContainsColumn(DataTable dt, string columnName)
            {
                if (dt == null || columnName == null)
                {
                    return false;
                }
                return dt.Columns.Contains(columnName);
            }

            #endregion 采用openxml方式把excel转换成dataTable
        }
    }

  • 相关阅读:
    一个Electron的设计缺陷及应对方案
    如何点击穿透Electron不规则窗体的透明区域
    Electron团队为什么要干掉remote模块
    Clickhouse 单机双实例
    Kafka安全认证SASL/PLAIN
    Syslog的使用
    Kafka Consumer
    Kafka Producer客户端
    Kafka客户端操作
    springboot集成flyway实践
  • 原文地址:https://www.cnblogs.com/yshj/p/2880170.html
Copyright © 2011-2022 走看看