예제 #1
0
        private void writeRow(Row row, SenderType sender)
        {
            int count = (sender == SenderType.WRITE_HEADER) ? dHeader_Template.Length : row.Length;

            for (int c = 0; c < count; c++)
            {
                Cell cell = (sender == SenderType.WRITE_HEADER) ? dHeader_Template[c] : row_Template[c];

                switch (cell.Type)
                {
                case CellType.TYPE_INT_16:
                    goto case CellType.TYPE_SHORT;

                case CellType.TYPE_SHORT:
                {
                    short s = row[c] as short? ?? default(short);
                    sHelper.WriteInt16(s);
                }
                break;

                case CellType.TYPE_USHORT:
                    goto case CellType.TYPE_UINT_16;

                case CellType.TYPE_UINT_16:
                {
                    ushort s = row[c] as ushort? ?? default(ushort);
                    sHelper.WriteUInt16(s);
                }
                break;

                case CellType.TYPE_INT:
                    goto case CellType.TYPE_INT_32;

                case CellType.TYPE_INT_32:
                {
                    int i = row[c] as int? ?? default(int);
                    sHelper.WriteInt32(i);
                }
                break;

                case CellType.TYPE_UINT_32:
                {
                    uint i = Convert.ToUInt32(row[c]);
                    sHelper.WriteUInt32(i);
                }
                break;

                case CellType.TYPE_INT_64:
                    goto case CellType.TYPE_LONG;

                case CellType.TYPE_LONG:
                {
                    long l = row[c] as long? ?? default(long);
                    sHelper.WriteDouble(l);
                }
                break;

                //TODO: Implement TYPE_ULONG
                //case CellType.TYPE_ULONG:
                //    break;

                case CellType.TYPE_BYTE:
                    if (cell.Length > 0)
                    {
                        byte[] b = new byte[cell.Length];
                        sHelper.WriteBytes(b);
                    }
                    else
                    {
                        byte b = row[c] as byte? ?? default(byte);
                        sHelper.WriteByte(b);
                    }
                    break;

                case CellType.TYPE_BIT_VECTOR:
                {
                    int i = BitConverter.ToInt32(generateBitVector(row, cell.Name), 0);
                    sHelper.WriteInt32(i);
                }
                break;

                case CellType.TYPE_DECIMAL:
                    //int v0 = sHelper.ReadInt32;
                    //decimal v1 = v0 / 100m;
                    //row[c] = v1;

                    decimal v0 = row[c] as decimal? ?? default(decimal);
                    int     v1 = Convert.ToInt32(v0 * 100);
                    sHelper.WriteInt32(v1);
                    break;

                case CellType.TYPE_FLOAT:
                    goto case CellType.TYPE_SINGLE;

                case CellType.TYPE_FLOAT_32:
                    goto case CellType.TYPE_SINGLE;

                case CellType.TYPE_SINGLE:
                {
                    float s = row[c] as float? ?? default(float);
                    sHelper.WriteSingle(s);
                }
                break;

                case CellType.TYPE_FLOAT_64:
                    goto case CellType.TYPE_DOUBLE;

                case CellType.TYPE_DOUBLE:
                {
                    double d = row[c] as double? ?? default(double);
                    sHelper.WriteDouble(d);
                }
                break;

                case CellType.TYPE_STRING:
                {
                    string s = row[c].ToString() + '\0';
                    sHelper.WriteString(s, s.Length);
                }
                break;

                case CellType.TYPE_STRING_BY_LEN:
                    goto case CellType.TYPE_STRING;

                case CellType.TYPE_STRING_BY_HEADER_REF:
                {
                    byte[] buffer    = ByteConverterExt.ToBytes(row[c].ToString(), Encoding.Default);
                    string refName   = cell.Dependency;
                    int    remainder = Convert.ToInt32(dHeader[refName]) - buffer.Length;
                    sHelper.WriteBytes(buffer);
                    sHelper.WriteBytes(new byte[remainder]);
                }
                break;

                case CellType.TYPE_STRING_LEN:
                {
                    string cellName = row.GetNameByDependency(cell.Name);
                    int    valLen   = row[cellName].ToString().Length + 1;
                    sHelper.WriteInt32(valLen);
                }
                break;
                }
            }
        }