winfrom 操作Excel

利用 Aspose.Cells.dll 操作Excel,内容如下:

1、界面设计:

2、逻辑:

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;

namespace ReadyExcel
{
    public partial class frmMatchingExcel : Form
    {
        public frmMatchingExcel()
        {
            InitializeComponent();
        }

        Stream cardStream;
        Stream priceStream;
        string importExcelPath = @"D:\importExcel";
        string importErrorExcelPath = @"D:\importExcelError";

        //读取到流量卡数据
        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = "[" + DateTime.Now.ToString() + "] " + "正在读取中...";
            OpenFileDialog openfile = new OpenFileDialog();
            openfile.Filter = "excel文件|*.xls;*.xlsx;*.*";
            if (openfile.FilterIndex == 1 && openfile.ShowDialog() == DialogResult.OK)
            {
                cardStream = openfile.OpenFile();
            }

            //读取成功,但没读到数据
            if (cardStream == null)
            {
                richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "没有读取到流量卡数据";
            }
            else
            {
                richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "读取完毕";
            }
        }

        //流量卡价格数据
        private void button2_Click(object sender, EventArgs e)
        {
            if (cardStream != null)
            {
                richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "正在读取中...";
                OpenFileDialog openfile = new OpenFileDialog();
                openfile.Filter = "excel文件|*.xls;*.xlsx;*.*";
                if (openfile.FilterIndex == 1 && openfile.ShowDialog() == DialogResult.OK)
                {
                    priceStream = openfile.OpenFile();
                }

                if (priceStream == null)
                {
                    richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "没有读取到流量卡价格数据";
                }
                else
                {
                    richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "读取完毕";
                }
            }
            else
            {
                richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "请先选择‘流量卡数据’表";
            }
        }

        //匹配流量卡价格 
        private void button3_Click(object sender, EventArgs e)
        {
            richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "正在匹配流量卡价格...";
            //读取成功
            if (cardStream != null && priceStream != null)
            {
                string isOk = string.Empty;
                List<CarEntity> importExcelData = ImportExcelToDataTable.AnalysisExcel(cardStream, priceStream, importExcelPath, importErrorExcelPath, out isOk);
                if (string.IsNullOrEmpty(isOk))
                    richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "成功匹配完流量卡价格";
                else
                    richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "匹配流量卡价格操作失败:" + isOk;

                //初始化文件流信息
                cardStream = null;
                priceStream = null;
            }
            else
            {
                richTextBox1.Text += "\r\n\r\n[" + DateTime.Now.ToString() + "] " + "请先选择‘流量卡’和‘流量卡价格’数据表";
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}

3、公用类:

====ImportExcelToDataTable==== 

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Aspose.Cells;
using System.Collections.Concurrent;

namespace ReadyExcel
{
    public class ImportExcelToDataTable
    {
        /// <summary>
        /// 解析文件流到Excel
        /// </summary>
        /// <param name="cardStream"></param>
        /// <param name="priceStream"></param>
        /// <param name="fileparh"></param>
        /// <param name="importErrorExcelPath"></param>
        /// <param name="rmg"></param>
        /// <returns></returns>
        public static List<CarEntity> AnalysisExcel(Stream cardStream, Stream priceStream, string fileparh, string importErrorExcelPath, out string rmg)
        {
            string isok = string.Empty;
            List<CarEntity> importExcelData = new List<CarEntity>();
            List<CarEntity> errorData = new List<CarEntity>();
            try
            {
                //获取流量卡信息
                Workbook book_Card = new Workbook(cardStream);
                Worksheet sheet_Card = book_Card.Worksheets[0];
                DataTable dtCard = sheet_Card.Cells.ExportDataTableAsString(0, 0, sheet_Card.Cells.MaxDataRow + 1, sheet_Card.Cells.MaxDataColumn + 1, true);
                List<CarEntity> _listCard = ConvertHelper.ToList<CarEntity>(dtCard).ToList();
                ConcurrentQueue<CarEntity> queueCard = new ConcurrentQueue<CarEntity>();
                Parallel.ForEach(_listCard, item => { queueCard.Enqueue(item); });

                //获取流量卡价格信息
                Workbook book_Price = new Workbook(priceStream);
                Worksheet sheet_Price = book_Price.Worksheets[0];
                DataTable dtPrice = sheet_Price.Cells.ExportDataTableAsString(0, 0, sheet_Price.Cells.MaxDataRow + 1, sheet_Price.Cells.MaxDataColumn + 1, true);
                List<CarPrice> _listPrice = ConvertHelper.ToList<CarPrice>(dtPrice).ToList();
                ConcurrentQueue<CarPrice> queuePrice = new ConcurrentQueue<CarPrice>();
                Parallel.ForEach(_listPrice, item => { queuePrice.Enqueue(item); });

                //设置流量卡渠道价                
                foreach (var item in _listCard)
                {
                    CarPrice _price = _listPrice.Where(i => i.CarNo.IndexOf(item.SIMNo) > 0
                    || (i.CarNo.Split('-').Length == 2 ? (Convert.ToInt64(i.CarNo.Split('-')[0]) <= Convert.ToInt64(item.SIMNo) && Convert.ToInt64(item.SIMNo) <= Convert.ToInt64(i.CarNo.Split('-')[1])) : false)).FirstOrDefault();

                    //记录价格匹配成功数据
                    if (_price != null)
                    {
                        item.ChannelPrice = _price.price;
                        importExcelData.Add(item);
                    }
                    else//记录价格匹配失败数据
                    {
                        errorData.Add(item);
                    }
                }

                //导出“匹配成功”数据
                DataTable dtImport = ToDataTable(importExcelData);
                bool isSuccess = DataTableToExcel(fileparh, dtImport, false);
                if (!isSuccess)
                {
                    isok = "导出有效数据失败";
                }
                else
                {

                }

                //导出“匹配失败”数据
                DataTable dtError = ToDataTable(errorData);
                bool isOk = DataTableToExcel(importErrorExcelPath, dtError, false);
                if (!isOk)
                {
                    isok += "导出无效数据失败";
                }
            }
            catch (Exception ex)
            {
                isok = ex.Message;
            }
            rmg = isok;
            return importExcelData;
        }

        /// <summary>
        /// 创建表
        /// </summary>
        /// <returns></returns>
        public static DataTable createDataTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("SIMNo", typeof(string));
            dt.Columns.Add("ICCID", typeof(string));
            dt.Columns.Add("IMSI", typeof(string));
            dt.Columns.Add("IMEI", typeof(string));
            dt.Columns.Add("Saledate", typeof(string));
            dt.Columns.Add("Status", typeof(string));
            dt.Columns.Add("CardStatus", typeof(string));
            dt.Columns.Add("ActiveStatus", typeof(string));
            dt.Columns.Add("MonthFlow", typeof(string));
            dt.Columns.Add("OperatorsType", typeof(string));
            dt.Columns.Add("AvailableFlow", typeof(string));
            dt.Columns.Add("MainPackage", typeof(string));
            dt.Columns.Add("ServiceStartTime", typeof(string));
            dt.Columns.Add("ServiceEndTime", typeof(string));
            dt.Columns.Add("AuthState", typeof(string));
            dt.Columns.Add("RenewDate", typeof(string));
            dt.Columns.Add("Suspend", typeof(string));
            dt.Columns.Add("UsedFlow", typeof(string));
            dt.Columns.Add("UsageRateFlow", typeof(string));
            dt.Columns.Add("ChannelPrice", typeof(string));

            return dt;
        }

        #region Convert a List{T} to a DataTable.
        /// <summary>
        /// Convert a List{T} to a DataTable.
        /// </summary>
        public static DataTable ToDataTable<T>(List<T> items)
        {
            var tb = new DataTable(typeof(T).Name);
            System.Reflection.PropertyInfo[] props = typeof(T).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
            foreach (System.Reflection.PropertyInfo prop in props)
            {
                Type t = GetCoreType(prop.PropertyType);
                tb.Columns.Add(prop.Name, t);
            }
            foreach (T item in items)
            {
                var values = new object[props.Length];

                for (int i = 0; i < props.Length; i++)
                {
                    values[i] = props[i].GetValue(item, null);
                }

                tb.Rows.Add(values);
            }

            return tb;
        }

        /// <summary>
        /// Determine of specified type is nullable
        /// </summary>
        public static bool IsNullable(Type t)
        {
            return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>));
        }

        /// <summary>
        /// Return underlying type if type is Nullable otherwise return the type
        /// </summary>
        public static Type GetCoreType(Type t)
        {
            if (t != null && IsNullable(t))
            {
                if (!t.IsValueType)
                {
                    return t;
                }
                else
                {
                    return Nullable.GetUnderlyingType(t);
                }
            }
            else
            {
                return t;
            }
        }
        #endregion

        /// <summary>
        /// 导出Excel文件
        /// </summary>
        /// <param name="filePath">保存路径</param>
        /// <param name="dataTable">数据集</param>
        /// <param name="isShowExcle">导出后是否打开文件</param>
        /// <returns></returns>
        public static bool DataTableToExcel(string filePath, DataTable dataTable, bool isShowExcle)
        {
            int rowNumber = dataTable.Rows.Count;
            int columnNumber = dataTable.Columns.Count;
            int colIndex = 0;
            if (rowNumber == 0)
            {
                return false;
            }
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook workbook = excel.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
            excel.Visible = isShowExcle;
            Microsoft.Office.Interop.Excel.Range range;

            foreach (DataColumn col in dataTable.Columns)
            {
                colIndex++;
                excel.Cells[1, colIndex] = col.ColumnName;
            }
            object[,] objData = new object[rowNumber, columnNumber];
            for (int r = 0; r < rowNumber; r++)
            {
                for (int c = 0; c < columnNumber; c++)
                {
                    objData[r, c] = dataTable.Rows[r][c];
                }
            }
            range = worksheet.Range[excel.Cells[2, 1], excel.Cells[rowNumber + 1, columnNumber]];
            range.Value2 = objData;
            range.NumberFormatLocal = "@";
            worksheet.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
            return true;
        }
    }
}

 ====ConvertHelper==== 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection;

namespace ReadyExcel
{
    public class ConvertHelper
    {
        /// <summary>
        /// 转换 DataTable 对象为 IList 对象
        /// </summary>
        /// <param name="datas">数据集合</param>
        /// <returns>数组对象</returns>
        public static T[] ToArray<T>(DataTable datas) where T : class, new()
        {
            List<T> list = ToList<T>(datas) as List<T>;
            return list.ToArray();
        }

        /// <summary>
        /// 转换IList对象为DataTable对象
        /// </summary>
        /// <param name="datas">数据集合</param>
        /// <returns>DataTable对象</returns>
        public static DataTable ToDataTable<T>(IList<T> datas)
        {
            return ToDataTable<T>(datas, null);
        }

        /// <summary>
        /// 转换IList对象为DataTable对象
        /// </summary>
        /// <param name="datas">数据集合</param>
        /// <returns>DataTable对象</returns>
        public static DataTable ToDataTable<T>(T[] datas)
        {
            return ToDataTable<T>(datas, null);
        }

        /// <summary>
        /// 转换IList对象为DataTable对象
        /// </summary>
        /// <param name="datas">数据集合</param>
        /// <param name="tableName">要创建的表名</param>
        /// <returns>DataTable对象</returns>
        public static DataTable ToDataTable<T>(IList<T> datas, string tableName)
        {
            Type type = typeof(T);
            if (string.IsNullOrEmpty(tableName))
            {
                tableName = type.Name;
            }
            DataTable table = new DataTable(tableName);
            table.BeginLoadData();
            PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo info in properties)
            {
                string typeName = info.PropertyType.ToString();
                if (info.PropertyType.IsGenericType)
                {
                    typeName = info.PropertyType.GetGenericArguments()[0].ToString();
                }
                Type type2 = Type.GetType(typeName, false);
                if (type2 != null)
                {
                    table.Columns.Add(info.Name, type2);
                }
            }
            if ((datas != null) && (datas.Count > 0))
            {
                foreach (object obj2 in datas)
                {
                    DataRow row = table.NewRow();
                    foreach (PropertyInfo info2 in properties)
                    {
                        if ((Type.GetType(info2.PropertyType.ToString(), false) != null) && (info2.GetValue(obj2, null) != null))
                        {
                            row[info2.Name] = info2.GetValue(obj2, null);
                        }
                    }
                    table.Rows.Add(row);
                }
            }
            table.EndLoadData();
            table.AcceptChanges();
            return table;
        }

        /// <summary>
        /// 转换IList对象为DataTable对象
        /// </summary>
        /// <param name="datas">数据集合</param>
        /// <param name="tableName">要创建的表名</param>
        /// <returns>DataTable对象</returns>
        public static DataTable ToDataTable<T>(T[] datas, string tableName)
        {
            IList<T> list;
            if ((datas == null) || (datas.Length == 0))
            {
                list = new List<T>();
            }
            else
            {
                list = new List<T>(datas);
            }
            return ToDataTable<T>(list, tableName);
        }

        /// <summary>
        /// 转换 DataTable 对象为 IList 对象
        /// </summary>
        /// <param name="datas">数据集合</param>
        /// <returns>IList 对象</returns>
        public static IList<T> ToList<T>(DataTable datas) where T : class, new()
        {
            IList<T> list = new List<T>();
            if ((datas != null) && (datas.Rows.Count != 0))
            {
                PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
                foreach (DataRow row in datas.Rows)
                {
                    T local = Activator.CreateInstance<T>();
                    foreach (DataColumn column in datas.Columns)
                    {
                        object obj2 = null;
                        if (row.RowState == DataRowState.Deleted)
                        {
                            obj2 = row[column, DataRowVersion.Original];
                        }
                        else
                        {
                            obj2 = row[column];
                        }
                        if (obj2 != DBNull.Value)
                        {
                            foreach (PropertyInfo info in properties)
                            {
                                if (column.ColumnName.Equals(info.Name, StringComparison.CurrentCultureIgnoreCase))
                                {
                                    info.SetValue(local, obj2, null);
                                }
                            }
                        }
                    }
                    list.Add(local);
                }
            }
            return list;
        }

        /// <summary>
        /// DataTable To List
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dt"></param>
        /// <returns></returns>
        public static IList<T> ConvertToList<T>(DataTable dt) where T : class, new()
        {
            // 定义集合    
            IList<T> ts = new List<T>();
            // 获得此模型的类型   
            Type type = typeof(T);
            string tempName = "";
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                // 获得此模型的公共属性      
                PropertyInfo[] propertys = t.GetType().GetProperties();
                foreach (PropertyInfo pi in propertys)
                {
                    // 检查DataTable是否包含此列 
                    tempName = pi.Name;     
                    if (dt.Columns.Contains(tempName))
                    {
                        // 判断此属性是否有Setter      
                        if (!pi.CanWrite)
                        {
                            continue;
                        }
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                        {
                            pi.SetValue(t, value, null);
                        }
                    }
                }
                ts.Add(t);
            }
            return ts;
        }


        /// <summary>    
        /// 将集合类转换成DataTable (标准写法)   
        /// </summary>    
        /// <param name="list">集合</param>    
        /// <returns></returns>    
        public static DataTable ConvertToDataTable<T>(IList<T> list)
        {
            DataTable result = new DataTable();
            if (list.Count > 0)
            {
                Type type = typeof(T);
                result.TableName = type.Name;
                PropertyInfo[] propertys = type.GetProperties();

                foreach (PropertyInfo pi in propertys)
                {
                    result.Columns.Add(pi.Name, pi.PropertyType);
                }
                foreach (object t in list)
                {
                    ArrayList tempList = new ArrayList();
                    foreach (PropertyInfo pi in propertys)
                    {
                        object obj = pi.GetValue(t, null);
                        tempList.Add(obj);
                    }
                    object[] array = tempList.ToArray();
                    result.LoadDataRow(array, true);
                }
            }
            return result;
        }

        /// <summary>
        /// 转换类型
        /// </summary>
        /// <param name="property"></param>
        /// <returns></returns>
        public static DbType ConvertType(PropertyInfo property)
        {
            var dbTypeResult = DbType.String;
            if (property == null)
            {
                return dbTypeResult;
            }

            var typeName = property.PropertyType.Name;
            switch (typeName)
            {
                case "UInt64":
                    dbTypeResult = DbType.UInt64;
                    break;
                case "String":
                    dbTypeResult = DbType.String;
                    break;
                case "Int32":
                    dbTypeResult = DbType.Int32;
                    break;
                case "SByte":
                    dbTypeResult = DbType.SByte;
                    break;
                case "DateTime":
                    dbTypeResult = DbType.DateTime;
                    break;
                case "UInt32":
                    dbTypeResult = DbType.UInt32;
                    break;
                case "Byte":
                    dbTypeResult = DbType.Byte;
                    break;
                case "Decimal":
                    dbTypeResult = DbType.Decimal;
                    break;
                case "UInt16":
                    dbTypeResult = DbType.UInt16;
                    break;
            }
            return dbTypeResult;
        }
    }
}

4、两个实体:

====CarEntity====

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ReadyExcel
{
    public class CarEntity
    {   /// <summary>  
        /// 卡片号码  
        /// </summary>      
        public string SIMNo { get; set; }

        public string ICCID { get; set; }
   
        public string IMSI { get; set; }

        public string IMEI { get; set; }

        /// <summary>  
        /// 发卡(开户)日期  
        /// </summary>      
        public string Saledate { get; set; }

        /// <summary>  
        /// 状态:1未知、2正常、3停机、4未激活、5销号  
        /// </summary>      
        public string Status { get; set; }

        /// <summary>
        /// 卡(VKEL)状态:1测试期、2沉默期、3服务期、4服务即将到期、5停机、6暂停使用、7保号期、8已销号、100其他(默认)
        /// </summary>
        public string CardStatus { get; set; } = "其他";

        /// <summary>  
        /// 开机状态:1未知、2在线、3离线、4关机  
        /// </summary>      
        public string ActiveStatus { get; set; }

        /// <summary>
        /// 月实时流量
        /// </summary>
        public string MonthFlow { get; set; }

        /// <summary>
        /// 运营商类型,1 移动,2 联通,3 电信
        /// </summary>
        public string OperatorsType { get; set; }

        /// <summary>  
        /// 总流量  
        /// </summary>      
        public string AvailableFlow { get; set; }

        /// 主套餐名称  
        /// </summary>      
        public string MainPackage { get; set; }

        /// <summary>
        /// 服务到期开始时间
        /// </summary>
        public string ServiceStartTime { get; set; }

        /// <summary>
        /// 服务到期结束时间
        /// </summary>
        public string ServiceEndTime { get; set; }

        /// <summary>  
        /// 认证状态:1未认证、2认证中、3已认证、4未通过  
        /// </summary>      
        public string AuthState { get; set; }

        /// <summary>  
        /// 最后续费日期  
        /// </summary>      
        public string RenewDate { get; set; }

        /// <summary>  
        /// 停机保号:有:无  
        /// </summary>      
        public string Suspend { get; set; }

        /// <summary>  
        /// 已用流量  
        /// </summary>      
        public string UsedFlow { get; set; }

        /// <summary>
        /// 流量使用率(%)
        /// </summary>
        public string UsageRateFlow { get; set; }

        /// <summary>
        /// 渠道价
        /// </summary>
        public string ChannelPrice { get; set; }
    }
}

====CarPrice====

namespace ReadyExcel
{
    public class CarPrice
    {
        public string CarNo { get; set; }

        public string ICCID { get; set; }

        public string IMSI { get; set; }

        /// 主套餐名称  
        /// </summary>      
        public string MainPackage { get; set; }

        public string count { get; set; }

        public string price { get; set; }

        public string amount { get; set; }
    }
}

  

  

转载于:https://www.cnblogs.com/CHNMurphy/p/9466262.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值