/// <summary>
        /// 导出cs代码。
        /// </summary>
        /// <param name="excelDataTable"></param>
        public void ExportDataTable(ExcelDataTable excelDataTable)
        {
            WriteLog(LogLevel.Debug, $"开始导出数据表: {excelDataTable.DataFileName}");
            string classname = StringUtils.ToCamel(excelDataTable.DataFileName);
            string filename  = _csharpTableCodeOutDirectory
                               + Path.DirectorySeparatorChar
                               + _codeGenerateClassPrefix
                               + classname + ".cs";

            using (FileStream fileStream = new FileStream(filename, FileMode.Create))
                using (StreamWriter streamWriter = new StreamWriter(fileStream, Encoding.UTF8))
                {
                    streamWriter.WriteLine("using System;");
                    streamWriter.WriteLine("using System.IO;");
                    streamWriter.WriteLine("using System.Linq;");
                    streamWriter.WriteLine("using System.Collections.Generic;");
                    streamWriter.WriteLine("");
                    streamWriter.WriteLine($"namespace {_chsarpCodeNameSpace}");
                    streamWriter.WriteLine("{");
                    streamWriter.WriteLine($"    public partial class {classname}: DataRow");
                    streamWriter.WriteLine("    {");
                    // 字段.
                    foreach (var columnInfo in excelDataTable.GetColumnInfos(ColumnBelong.Client))
                    {
                        IColumnParser parser = _columnParserHelp.GetColumnParser(columnInfo.ColumnType);
                        streamWriter.WriteLine($"        /// <summary> {columnInfo.Title} </summary>");
                        streamWriter.WriteLine($"        public {parser.ToCSharpTypeString()} {columnInfo.Name}");
                        streamWriter.WriteLine("        {");
                        streamWriter.WriteLine("            get;");
                        streamWriter.WriteLine("            private set;");
                        streamWriter.WriteLine("        }");
                    }
                    // 解析函数
                    streamWriter.WriteLine($"        public override void ReadRowData(BinaryReader reader)");
                    streamWriter.WriteLine("        {");
                    foreach (var columnInfo in excelDataTable.GetColumnInfos(ColumnBelong.Client))
                    {
                        IColumnParser parser = _columnParserHelp.GetColumnParser(columnInfo.ColumnType);
                        streamWriter.WriteLine($"            {columnInfo.Name} = {parser.ReadFromBinaryReaderExpression()} ;");
                    }
                    streamWriter.WriteLine("        }");
                    // 主键函数
                    ColumnInfo pkInfo = excelDataTable.GetPrimaryColumnInfo();
                    streamWriter.WriteLine("        public override int GetPk()");
                    streamWriter.WriteLine("        {");
                    if (pkInfo == null)
                    {
                        streamWriter.WriteLine($"            return 0;");
                    }
                    else
                    {
                        streamWriter.WriteLine($"            return {pkInfo.Name};");
                    }
                    streamWriter.WriteLine("        }");
                    streamWriter.WriteLine("    }");
                    streamWriter.WriteLine("}");
                }
        }
        /// <summary>
        /// 导出 json 文件.
        /// </summary>
        /// <param name="dataFileName"></param>
        public void ExportJson(string dataFileName, ColumnBelong belong)
        {
            if (!_excelDataTables.ContainsKey(dataFileName))
            {
                WriteLog(LogLevel.Error, $"找不到配置表: {dataFileName}");
                return;
            }

            ExcelDataTable dataTable = _excelDataTables[dataFileName];

            List <ColumnInfo> columnInfos = dataTable.GetColumnInfos(belong);

            using (FileStream writeFile = new FileStream(GetJsonExportFileName(dataTable), FileMode.Create))
                using (TextWriter textWriter = new StreamWriter(writeFile, Encoding.UTF8))
                {
                    Stopwatch stopwatch = Stopwatch.StartNew();

                    List <Dictionary <string, Object> > list = new List <Dictionary <string, object> >();

                    for (int i = 0; i < dataTable.DataRowCount; i++)
                    {
                        Dictionary <string, object> dictionary = new Dictionary <string, object>();
                        foreach (var columnInfo in columnInfos)
                        {
                            try
                            {
                                IColumnParser parser = _columnParserHelp.GetColumnParser(columnInfo.ColumnType);
                                dictionary.Add(columnInfo.Name, parser.ToObject(columnInfo.GetRowValue(i)));
                            }
                            catch (Exception e)
                            {
                                WriteLog(LogLevel.Error,
                                         $"表格 {dataTable.DataFileName} {columnInfo.Name} 字段, {i + 5} 行, 值 {columnInfo.GetRowValue(i)}, 导出失败: {e.Message}");
                                return;
                            }
                        }

                        list.Add(dictionary);
                    }

                    textWriter.Write(JsonConvert.SerializeObject(list, Formatting.Indented));
                    stopwatch.Stop();
                    WriteLog(LogLevel.Information,
                             $"线程 {Thread.CurrentThread.ManagedThreadId.ToString()}, 耗时 {stopwatch.ElapsedMilliseconds / 1000} 秒 , 导出 json 文件: {dataFileName}");
                }
        }
        /// <summary>
        /// 之前旧版的字节流格式。
        /// </summary>
        /// <param name="dataFileName"></param>
        /// <param name="columnBelong"></param>
        public void ExportBytes(string dataFileName, ColumnBelong columnBelong)
        {
            if (!_excelDataTables.ContainsKey(dataFileName))
            {
                WriteLog(LogLevel.Error, $"找不到配置表: {dataFileName}");
                return;
            }

            ExcelDataTable    dataTable   = _excelDataTables[dataFileName];
            List <ColumnInfo> columnInfos = dataTable.GetColumnInfos(columnBelong);

            try
            {
                using (FileStream writeFile = new FileStream(GetBinaryExportFileName(dataTable), FileMode.Create))
                    using (BinaryWriter binaryWriter = new BinaryWriter(writeFile, Encoding.UTF8))
                    {
                        Stopwatch stopwatch = Stopwatch.StartNew();
                        for (int i = 0; i < dataTable.DataRowCount; i++)
                        {
                            foreach (var columnInfo in columnInfos)
                            {
                                try
                                {
                                    IColumnParser parser = _columnParserHelp.GetColumnParser(columnInfo.ColumnType);
                                    parser.WriteToBinaryWriter(binaryWriter, columnInfo.GetRowValue(i));
                                }
                                catch (Exception e)
                                {
                                    WriteLog(LogLevel.Error,
                                             $"表格 {dataTable.DataFileName} {columnInfo.Name} 字段, {i + 5} 行, 值 {columnInfo.GetRowValue(i)}, 导出失败: {e.Message}");
                                    throw e;
                                }
                            }
                        }

                        stopwatch.Stop();
                        WriteLog(LogLevel.Information,
                                 $"线程 {Thread.CurrentThread.ManagedThreadId.ToString()}, 耗时 {stopwatch.ElapsedMilliseconds / 1000} 秒 , 导出 byte 文件: {dataFileName}");
                    }
            }
            catch (Exception e)
            {
                File.Delete(GetBinaryExportFileName(dataTable));
            }
        }