func (self *DataSheet) Export(file *File, tab *model.Table, dataHeader *DataHeader) bool { // 是否继续读行 var readingLine bool = true // 遍历每一行 for self.Row = DataSheetRow_DataBegin; readingLine; self.Row++ { // 第一列是空的,结束 if self.GetCellData(self.Row, 0) == "" { break } record := model.NewRecord() // 遍历每一列 for self.Column = 0; self.Column < dataHeader.RawFieldCount(); self.Column++ { fieldDef := dataHeader.RawField(self.Column) // 数据大于列头时, 结束这个列 if fieldDef == nil { break } // #开头表示注释, 跳过 if strings.Index(fieldDef.Name, "#") == 0 { continue } rawValue := self.GetCellData(self.Row, self.Column) // repeated的, 没有填充的, 直接跳过, 不生成数据 if rawValue == "" && fieldDef.Meta.Default == "" { continue } node := record.NewNodeByDefine(fieldDef) // 结构体要多添加一个节点, 处理repeated 结构体情况 if fieldDef.Type == model.FieldType_Struct { node.StructRoot = true node = node.AddKey(fieldDef) } if !dataProcessor(file, fieldDef, rawValue, node) { goto ErrorStop } } tab.Add(record) } return true ErrorStop: r, c := self.GetRC() log.Errorf("%s|%s(%s)", self.file.FileName, self.Name, util.ConvR1C1toA1(r, c)) return false }
// 合并每个表带的类型 func (self *Globals) AddContent(tab *model.Table) bool { localFD := tab.LocalFD self.guard.Lock() defer self.guard.Unlock() // 有表格里描述的包名不一致, 无法合成最终的文件 if self.Pragma.Package == "" { self.Pragma.Package = localFD.Pragma.Package } else if self.Pragma.Package != localFD.Pragma.Package { log.Errorf("%s, '%s' '%s'", i18n.String(i18n.Globals_PackageNameDiff), self.Pragma.Package, localFD.Pragma.Package) return false } if _, ok := self.tableByName[localFD.Name]; ok { log.Errorf("%s, '%s'", i18n.String(i18n.Globals_TableNameDuplicated), localFD.Name) return false } // 表的全局类型信息与合并信息一致 tab.GlobalFD = self.FileDescriptor self.tableByName[localFD.Name] = tab self.Tables = append(self.Tables, tab) // 每个表在结构体里的字段 var rowFD model.FieldDescriptor rowFD.Name = localFD.Name rowFD.Type = model.FieldType_Struct rowFD.Complex = localFD.RowDescriptor() rowFD.IsRepeated = true rowFD.Order = int32(len(self.CombineStruct.Fields) + 1) rowFD.Comment = localFD.Name self.CombineStruct.Add(&rowFD) if localFD.RowDescriptor() == nil { panic("row field null:" + localFD.Name) } for _, d := range localFD.Descriptors { // 非行类型的, 全部忽略 if d.Usage != model.DescriptorUsage_RowType { continue } for _, indexFD := range d.Indexes { key := TableIndex{ Row: &rowFD, Index: indexFD, } self.GlobalIndexes = append(self.GlobalIndexes, key) } } return true }