public CSharpExporter(List <ExcelParser.TableInfo> tableInfos, string excelName, HashSet <string> exportTags) { //-- 创建代码字符串 StringBuilder sb = new StringBuilder(); sb.AppendLine("//"); sb.AppendLine("// Auto Generated Code By excel2json"); sb.AppendLine("// https://neil3d.gitee.io/coding/excel2json.html"); sb.AppendLine(); sb.AppendFormat("// Generate From {0}", excelName); sb.AppendLine(); sb.AppendLine(); foreach (var tableInfo in tableInfos) { var className = NameFormater.FormatCamelName(excelName, false); if (tableInfo.parseMode == ExcelParser.TableType.Config) { className = className.Replace("Cfg", "AttrCfg"); } sb.AppendFormat("public class {0}", className); sb.AppendLine(); sb.Append("{"); sb.AppendLine(); for (int i = 0; i < tableInfo.numFields; i++) { var fieldInfo = tableInfo.fieldInfos[i]; if (exportTags.Contains(fieldInfo.tag)) { var comment = NameFormater.FormatComment(fieldInfo.comment); sb.AppendFormat(" public {0} {1}; // {2}", fieldInfo.type, fieldInfo.name, comment); sb.AppendLine(); } } sb.Append('}'); sb.AppendLine(); sb.AppendLine(); } sb.AppendLine("// End of Auto Generated Code"); _code = sb.ToString(); }
private static void ParseColumnMajorTable(TableInfo tableInfo, DataTable sheet) { int descIndex = tableInfo.startRow + 1; int typeIndex = tableInfo.startRow + 2; int nameIndex = tableInfo.startRow + 3; tableInfo.numRows = tableInfo.endRow - tableInfo.startRow - 4; tableInfo.numFields = 0; if (tableInfo.numRows < 0) { tableInfo.numRows = 0; return; } for (int columnIndex = 0; columnIndex < sheet.Columns.Count; ++columnIndex) { var type = sheet.Rows[typeIndex][columnIndex].ToString(); string name; string tag; NameFormater.GetNameAndTag(out name, out tag, sheet.Rows[nameIndex][columnIndex].ToString()); name = NameFormater.FormatCamelName(name, true); if (name == "" || type == "") { break; } FieldInfo field = new FieldInfo(); field.comment = sheet.Rows[descIndex][columnIndex].ToString(); field.name = name; field.type = type; field.tag = tag; for (int i = tableInfo.startRow + 4; i < tableInfo.endRow; ++i) { field.datas.Add(ConvertData(field.type, sheet.Rows[i][columnIndex].ToString())); } tableInfo.fieldInfos.Add(field); } tableInfo.numFields = tableInfo.fieldInfos.Count; }
private static void ParseRowMajorTable(TableInfo tableInfo, DataTable sheet) { for (int i = tableInfo.startRow + 1; i < tableInfo.endRow; ++i) { FieldInfo field = new FieldInfo(); field.comment = sheet.Rows[i][0].ToString(); field.type = sheet.Rows[i][1].ToString(); string name; string tag; NameFormater.GetNameAndTag(out name, out tag, sheet.Rows[i][2].ToString()); field.name = NameFormater.FormatCamelName(name, true); field.tag = tag; field.datas.Add(ConvertData(field.type, sheet.Rows[i][3].ToString())); tableInfo.fieldInfos.Add(field); } tableInfo.numRows = 1; tableInfo.numFields = tableInfo.fieldInfos.Count; }
public string ConvertSheet(List <ExcelParser.TableInfo> tableInfos, string excelName, HashSet <string> exportTags) { ExcelParser.TableInfo attrs = null; ExcelParser.TableInfo table = null; foreach (var tableInfo in tableInfos) { if (tableInfo.parseMode == ExcelParser.TableType.Config) { attrs = tableInfo; } if (tableInfo.parseMode == ExcelParser.TableType.Table) { table = tableInfo; } } XmlDocument doc = new XmlDocument(); var xmlExData = doc.CreateElement("ExData"); doc.AppendChild(xmlExData); XmlElement xmlTable = null; if (table != null || attrs != null) { xmlTable = doc.CreateElement("Table"); m_strFileName = NameFormater.FormatCamelName(excelName, false); xmlTable.SetAttribute("Name", m_strFileName); xmlExData.AppendChild(xmlTable); } if (table != null) { var xmlColumnList = doc.CreateElement("ColumnList"); xmlTable.AppendChild(xmlColumnList); foreach (var fieldInfo in table.fieldInfos) { if (exportTags.Contains(fieldInfo.tag)) { var xmlColumn = doc.CreateElement("Column"); string finalName = fieldInfo.name; string finalDataType = fieldInfo.type; if (_typeMap.TryGetValue(fieldInfo.type, out var mappingInfo)) { finalName = mappingInfo.prefix + fieldInfo.name; finalDataType = mappingInfo.dataTypeIndex; } xmlColumn.SetAttribute("Name", finalName); xmlColumn.SetAttribute("DataType", finalDataType); xmlColumnList.AppendChild(xmlColumn); } } } if (attrs != null) { foreach (var fieldInfo in attrs.fieldInfos) { if (exportTags.Contains(fieldInfo.tag)) { var xmlAttribute = doc.CreateElement("Attribute"); xmlTable.AppendChild(xmlAttribute); string finalName = fieldInfo.name; string finalDataType = fieldInfo.type; if (_typeMap.TryGetValue(fieldInfo.type, out var mappingInfo)) { finalName = mappingInfo.prefix + fieldInfo.name; finalDataType = mappingInfo.dataTypeIndex; } xmlAttribute.SetAttribute("Name", finalName); xmlAttribute.SetAttribute("DataType", finalDataType); xmlAttribute.SetAttribute("Value", fieldInfo.datas[0].ToString()); } } } if (table != null) { for (int i = 0; i < table.numRows; ++i) { var xmlRecord = doc.CreateElement("Record"); for (int j = 0; j < table.numFields; ++j) { var fieldInfo = table.fieldInfos[j]; if (exportTags.Contains(fieldInfo.tag)) { string finalName = fieldInfo.name; Func <object, string> convertor = ConvertDefault; if (_typeMap.TryGetValue(fieldInfo.type, out var mappingInfo)) { finalName = mappingInfo.prefix + fieldInfo.name; convertor = mappingInfo.convertor; } xmlRecord.SetAttribute(finalName, convertor(fieldInfo.datas[i])); } } xmlTable.AppendChild(xmlRecord); } } var stringBuilder = new StringBuilder(); var settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; settings.Encoding = Encoding.UTF8; settings.Indent = true; using (var xmlWriter = XmlWriter.Create(stringBuilder, settings)) { doc.Save(xmlWriter); } return(stringBuilder.ToString()); }
/// <summary> /// 根据命令行参数,执行Excel数据导出工作 /// </summary> /// <param name="options">命令行参数</param> private static void Run(Options options) { //-- Excel File string excelPath = options.excelPath; string excelName = Path.GetFileNameWithoutExtension(options.excelPath); var excelFileInfo = new FileInfo(excelPath); if (!excelFileInfo.Exists) { throw new Exception("Excel文件不存在"); } HashSet <string> exportTags = new HashSet <string>(); exportTags.Add(""); if (options.exportTags != null) { var tags = options.exportTags.Split(','); foreach (var tag in tags) { exportTags.Add(tag); } } //-- Encoding Encoding cd = new UTF8Encoding(false); //-- Load Excel ExcelLoader excel = new ExcelLoader(excelPath); List <ExcelParser.TableInfo> tableInfos = null; //-- export json if (!string.IsNullOrEmpty(options.jsonDir)) { var finalPath = Path.Combine(options.jsonDir, NameFormater.FormatFileName(excelName) + ".json"); var fileInfo = new FileInfo(finalPath); if (!fileInfo.Exists || fileInfo.LastWriteTimeUtc.Ticks < excelFileInfo.LastWriteTimeUtc.Ticks) { if (tableInfos == null) { tableInfos = ExcelParser.ReadSheetData(excel.Sheets[0]); } JsonExporter jsonExporter = new JsonExporter(tableInfos, excelName, exportTags); jsonExporter.SaveToFile(finalPath, cd); } } //-- export xml if (!string.IsNullOrEmpty(options.xmlDir)) { var finalPath = Path.Combine(options.xmlDir, NameFormater.FormatCamelName(excelName, false) + ".xml"); var fileInfo = new FileInfo(finalPath); if (!fileInfo.Exists || fileInfo.LastWriteTimeUtc.Ticks < excelFileInfo.LastWriteTimeUtc.Ticks) { if (tableInfos == null) { tableInfos = ExcelParser.ReadSheetData(excel.Sheets[0]); } XmlExporter xmlExporter = new XmlExporter(tableInfos, excelName, exportTags); xmlExporter.SaveToFile(finalPath, cd); } } //-- export c# if (!string.IsNullOrEmpty(options.csharpDir)) { var finalPath = Path.Combine(options.csharpDir, NameFormater.FormatCamelName(excelName, false) + ".cs"); var fileInfo = new FileInfo(finalPath); if (!fileInfo.Exists || fileInfo.LastWriteTimeUtc.Ticks < excelFileInfo.LastWriteTimeUtc.Ticks) { if (tableInfos == null) { tableInfos = ExcelParser.ReadSheetData(excel.Sheets[0]); } CSharpExporter csharpExporter = new CSharpExporter(tableInfos, excelName, exportTags); csharpExporter.SaveToFile(finalPath, cd); } } }