示例#1
0
        internal EntryAst AddEntry(string name)
        {
            var e = new EntryAst(name);

            Entries.Add(e);
            return(e);
        }
示例#2
0
        internal EntryAst DupLastEntry()
        {
            if (Entries.Count == 0)
            {
                return(null);
            }
            var e = new EntryAst(Entries.Last().Name);

            Entries.Add(e);
            return(e);
        }
示例#3
0
        public TableDataAst Parse()
        {
            using (var input = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
                var book = WorkbookFactory.Create(input);
                if (book == null)
                {
                    return(null);
                }
                var repo = new TableDataAst();
                for (int i = 0, i_n = book.NumberOfSheets; i < i_n; ++i)
                {
                    var sheet = book.GetSheetAt(i);
                    if (sheet == null)
                    {
                        continue;
                    }
                    TableAst table       = null;
                    int      tableIndent = -1;
                    for (int j = sheet.FirstRowNum, j_n = sheet.LastRowNum; j <= j_n; ++j)
                    {
                        var row = sheet.GetRow(j);
                        if (row == null)
                        {
                            continue;
                        }
                        RowType  rowType = RowType.Entry;
                        EntryAst entry   = null;
                        for (int k = row.FirstCellNum, k_n = row.LastCellNum; k < k_n; ++k)
                        {
                            var cell = row.GetCell(k);
                            if (cell == null)
                            {
                                continue;
                            }
                            var str = GetCellString(cell, cell.CellType);
                            if (string.IsNullOrEmpty(str))
                            {
                                continue;
                            }
                            if (str.StartsWith("[") && str.EndsWith("]"))
                            {
                                tableIndent = k;
                                table       = repo.AddTable(str.Trim('[', ']'));
                                rowType     = RowType.Table;
                                continue;
                            }
                            if (table == null)
                            {
                                continue;
                            }
                            if (k < tableIndent)
                            {
                                continue;
                            }
                            var index = k - tableIndent;
                            if (index == 0)
                            {
                                switch (str.ToLower())
                                {
                                case "<tag>":
                                    rowType = RowType.Tag;
                                    break;

                                case "<type>":
                                    rowType = RowType.Type;
                                    break;

                                default:
                                    entry   = table.AddEntry(str);
                                    rowType = RowType.Entry;
                                    break;
                                }
                                continue;
                            }
                            index -= 1;
                            switch (rowType)
                            {
                            case RowType.Tag:
                                table.AddTagName(index, str);
                                break;

                            case RowType.Type:
                                table.AddTagType(index, str);
                                break;

                            case RowType.Entry:
                                if (entry == null)
                                {
                                    entry = table.DupLastEntry();
                                }
                                entry.AddValue(index, str);
                                break;

                            default:
                                break;
                            }
                        }
                    }
                }
                return(repo);
            }
        }