public IEnumerable <IDictionary <string, object> > XmlReaderDictionary() { current = current ?? configs.FirstOrDefault(); var sheet = $"sheet{current.SheetIndex}"; var entry = zip.GetEntry($"xl/worksheets/{sheet}.xml"); List <IDictionary <string, object> > dicList = new List <IDictionary <string, object> >(); IDictionary <int, string> Columns = new Dictionary <int, string>(); IDictionary <string, object> temp = null; XmlReadKit xmlReadKit = new XmlReadKit(entry.Open()); bool readColumns = false; bool readData = false; bool isValue = false; int rowIndex = default; int colIndex = default; string dataType = default; string xfs = default; xmlReadKit.XmlReadXlsx("sheetData", (node, attrs, content) => { switch (node) { case "end": if (temp != null) { dicList.Add(temp); } break; case "row": rowIndex = int.Parse(attrs.SingleOrDefault(x => x.Name.Equals("r", StringComparison.OrdinalIgnoreCase)).Text); if (current.StartRow <= current.ColumnNameRow) { throw new XlsxRowConfigException(); } if (rowIndex == current.ColumnNameRow) { readColumns = true; } if (rowIndex > current.EndRow) { return(false); } if (rowIndex >= current.StartRow) { readColumns = false; readData = true; if (temp != null) { dicList.Add(temp); } temp = new Dictionary <string, object>(); } break; case "c": if (readColumns || readData) { string colEn = new string(CellPosition(attrs.SingleOrDefault(x => x.Name.Equals("r", StringComparison.OrdinalIgnoreCase)).Text).ToArray()); colIndex = ExcelHelper.ColumnToIndex(colEn).Value; dataType = attrs.FirstOrDefault(x => x.Name.Equals("t", StringComparison.OrdinalIgnoreCase)).Text; xfs = attrs.FirstOrDefault(x => x.Name.Equals("s", StringComparison.OrdinalIgnoreCase)).Text; } break; case "v": if (colIndex >= current.StartColumnIndex && (current.EndColumnIndex != null ? colIndex <= current.EndColumnIndex : true)) { isValue = true; } break; case "f": break; case "text": if (isValue) { if (readColumns) { if (dataType == "s") { Columns.Add(colIndex, sharedStrings[int.Parse(content)]); } else { Columns.Add(colIndex, content); } } if (readData) { if (dataType == "s") { temp.Add(Columns[colIndex], sharedStrings[int.Parse(content)]); } else { temp.Add(Columns[colIndex], content); } } isValue = false; } break; default: isValue = false; break; } return(true); }); return(dicList); }
public DataTable XmlReadDataTable() { current = current ?? configs.FirstOrDefault(); var sheet = $"sheet{current.SheetIndex}"; var entry = zip.GetEntry($"xl/worksheets/{sheet}.xml"); DataTable dt = new DataTable(); DataRow ndr = default; IDictionary <int, string> Columns = new Dictionary <int, string>(); var changing = new List <Action <DataRowChangeEventArgs> >(); if (current.ColumnSetting != null) { foreach (var item in current.ColumnSetting) { var dc = dt.Columns.Add(item.ColumnName, item.ColumnType); if (item.Column != null) { Columns.Add(item.ColumnIndex.Value, item.ColumnName); } dc.AllowDBNull = item.IsAllowNull; switch (item.NormalType) { case ColumnNormal.Guid: dc.DefaultValue = Guid.NewGuid(); changing.Add(e => { dc.DefaultValue = Guid.NewGuid(); }); break; case ColumnNormal.NowDate: dc.DefaultValue = DateTime.Now; break; case ColumnNormal.Increment: int increment = item.DefaultValue == null ? 0 : Convert.ToInt32(item.DefaultValue); dc.DefaultValue = increment; changing.Add(e => { dc.DefaultValue = ++increment; }); break; case ColumnNormal.Default: if (item.DefaultValue != null) { dc.DefaultValue = item.DefaultValue; } break; } } dt.RowChanging += RowChanging; } void RowChanging(object sender, DataRowChangeEventArgs e) { if (e.Action == DataRowAction.Add) { foreach (var item in changing) { item(e); } } } XmlReadKit xmlReadKit = new XmlReadKit(entry.Open()); bool readColumns = false; bool readData = false; bool isValue = false; int rowIndex = default; int colIndex = default; string dataType = default; string xfs = default; xmlReadKit.XmlReadXlsx("sheetData", (node, attrs, content) => { switch (node) { case "end": if (ndr != null) { dt.Rows.Add(ndr); } break; case "row": rowIndex = int.Parse(attrs.SingleOrDefault(x => x.Name.Equals("r", StringComparison.OrdinalIgnoreCase)).Text); if (current.StartRow <= current.ColumnNameRow) { throw new XlsxRowConfigException(); } if (current.ColumnSetting == null && rowIndex == current.ColumnNameRow) { readColumns = true; } if (rowIndex > current.EndRow) { return(false); } if (rowIndex >= current.StartRow) { readColumns = false; readData = true; if (ndr != null) { dt.Rows.Add(ndr); } ndr = dt.NewRow(); } break; case "c": if (readColumns || readData) { string colEn = new string(CellPosition(attrs.SingleOrDefault(x => x.Name.Equals("r", StringComparison.OrdinalIgnoreCase)).Text).ToArray()); colIndex = ExcelHelper.ColumnToIndex(colEn).Value; dataType = attrs.FirstOrDefault(x => x.Name.Equals("t", StringComparison.OrdinalIgnoreCase)).Text; xfs = attrs.FirstOrDefault(x => x.Name.Equals("s", StringComparison.OrdinalIgnoreCase)).Text; } break; case "v": if (colIndex >= current.StartColumnIndex && (current.EndColumnIndex != null ? colIndex <= current.EndColumnIndex : true)) { isValue = true; } break; case "f": break; case "text": if (isValue) { if (readColumns) { if (dataType == "s") { dt.Columns.Add(sharedStrings[int.Parse(content)], typeof(string)); Columns.Add(colIndex, sharedStrings[int.Parse(content)]); } else { dt.Columns.Add(content, typeof(string)); Columns.Add(colIndex, content); } } if (readData) { if (Columns.ContainsKey(colIndex)) { if (dataType == "s") { ndr[Columns[colIndex]] = sharedStrings[int.Parse(content)]; } else { ndr[Columns[colIndex]] = content; } } } isValue = false; } break; default: isValue = false; break; } return(true); }); dt.RowChanging -= RowChanging; return(dt); }