ExtraFileData.cs 7.4 KB
using BLL;
using ClosedXML.Excel;
using Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BLL
{
    public class ExtraFileData
    {
        public static Dictionary<string, Dictionary<string, string>> AllData = new Dictionary<string, Dictionary<string, string>>();
        public static List<string> Titles = new List<string>();

        public static List<string> DataTitle = new List<string>();
        public static void Init() {
            var ext = Path.GetExtension(Config.DataSource_FilePath);
            if (string.IsNullOrEmpty(ext))
            {
                return;
            }
                ext = ext.ToLower();
            AllData.Clear();
            if (ext == ".xlsx")
                LoadXLSALlData();
            else if (ext == ".csv")
                LoadCSVALlData();
        }
        public static void LoadCSVALlData()
        {
            LogNet.log.Info("数据源:" + Config.DataSource_FilePath);
            if (!File.Exists(Config.DataSource_FilePath))
            {
                return;
                throw new FileNotFoundException(Config.DataSource_FilePath);
            }
            Titles = ParseCSVFileTitle(Config.DataSource_FilePath);
            //Common.extraKey = titles;
            string[] files;
            if (Config.DataSource_Recursive)
            {
                var ext = Path.GetExtension(Config.DataSource_FilePath);
                var path = Path.GetDirectoryName(Config.DataSource_FilePath);
                files=Directory.GetFiles(path, "*" + ext);
            }
            else
            {
                files = new string[] { Config.DataSource_FilePath };
            }

            DataTitle.Clear();
            AllData.Clear();
            foreach (var file in files)
            {
                LogNet.log.Info("数据源加载文件:"+file);
                try
                {
                    using var sm = new StreamReader(file, Encoding.GetEncoding(Config.DataSource_Encoding));
                    while (true)
                    {
                        var dataline = sm.ReadLine();
                        if (string.IsNullOrWhiteSpace(dataline))
                            break;
                        var datas = dataline.Split(',');
                        if (datas.Length < Titles.Count)
                            continue;
                        string keydata = "";
                        var rowdata = new Dictionary<string, string>();
                        for (int i = 0; i < Titles.Count; i++)
                        {
                            rowdata.Add(Titles[i], datas[i]);
                            if (Titles[i] == Config.DataSource_DataTitle)
                            {
                                keydata = datas[i];
                            }
                        }
                        if (!string.IsNullOrEmpty(keydata) && !AllData.ContainsKey(keydata))
                        {
                            AllData.Add(keydata, rowdata);
                            DataTitle.Add(keydata);
                        }
                           
                    }
                }
                catch(Exception ex) {
                    LogNet.log.Info("数据源加载文件出错:" + ex.ToString());
                }
            }
            //Common.extraData = AllData;
        }
        public static List<string> ParseCSVFileTitle(string filename)
        {
            if (!File.Exists(filename))
                return new List<string>() ;

            using var sm = new StreamReader(filename, Encoding.GetEncoding(Config.DataSource_Encoding.Val));
            var titleline = sm.ReadLine();
            var titles = new List<string>(titleline.Split(','));
            return titles;
        }


        public static void LoadXLSALlData() {
            if (!File.Exists(Config.DataSource_FilePath)) {
                return;
                //throw new FileNotFoundException(Config.DataSource_String);
            }
            Titles = ParseXLSFileTitle(Config.DataSource_FilePath);
            //Common.extraKey = titles;

            string[] files;
            if (Config.DataSource_Recursive)
            {
                var ext = Path.GetExtension(Config.DataSource_FilePath);
                var path = Path.GetDirectoryName(Config.DataSource_FilePath);
                files = Directory.GetFiles(path, "*" + ext);
            }
            else
            {
                files = new string[] { Config.DataSource_FilePath };
            }
            DataTitle.Clear();
            AllData.Clear();
            foreach (var file in files)
            {
                LogNet.log.Info("数据源加载文件:" + file);
                try
                {
                    XLWorkbook wb = new XLWorkbook(file);
                    IXLWorksheet ws = wb.Worksheet(1);
                    int emptyrow = 0;
                    int currow = 0;
                    while (emptyrow < 3)
                    {
                        string keydata = "";
                        var rowdata = new Dictionary<string, string>();
                        for (int i = 0; i < Titles.Count; i++)
                        {
                            var v = ws.Row(currow + 1).Cell(i + 1).Value.ToString().Trim();
                            rowdata.Add(Titles[i], v);
                            if (Titles[i] == Config.DataSource_DataTitle)
                            {
                                keydata = v;
                                if (string.IsNullOrWhiteSpace(v))
                                    emptyrow++;
                            }
                        }
                        if (!string.IsNullOrEmpty(keydata) && !AllData.ContainsKey(keydata))
                        {
                            AllData.Add(keydata, rowdata);
                            DataTitle.Add(keydata);
                        }                           
                        if (string.IsNullOrEmpty(keydata))
                            emptyrow++;

                        currow++;
                    }
                }
                catch (Exception ex)
                {
                    LogNet.log.Info("数据源加载文件出错:" + ex.ToString());
                }
            }
            //Common.extraData = AllData;
        }
        public static List<string> ParseXLSFileTitle(string filename)
        {
            List<string> titles = new List<string>();
            int emptycolcount = 0;

            if (!File.Exists(filename))
                return titles;

            XLWorkbook wb = new XLWorkbook(filename);
            IXLWorksheet ws = wb.Worksheet(1);
            for (int i = 1; i < 50; i++)
            {
                var v = ws.Row(1).Cell(i).Value.ToString().Trim();
                if (string.IsNullOrEmpty(v))
                {
                    emptycolcount++;
                    if (emptycolcount > 3)
                    {
                        break;
                    }
                }
                if (!string.IsNullOrEmpty(v))
                {
                    titles.Add(v);
                }
            }
            return titles;
        }


        public static Encoding GetEncoding(string coding) {
            try
            {
                return Encoding.GetEncoding(coding);
            }
            catch {
                return Encoding.UTF8;
            }
        }
    }
}