|  11.09.2006, 16:20 | #1 | 
| Участник | Как работать с EXCEL файлами 
			
			Доброго времени суток Коллеги! Помогите пожалуйста в следующем вопросе. Я собираюсь вывести все имеющиеся таблицы и их описание в файл EXCEL. Первую часть я выполнил, а вот со второй никак не могу справиться. void CreateListTables() { Dictionary dictionary = new Dictionary(); DictTable dictTable; int i; str NameTab; for (i=1; i<=dictionary.tableCnt();i++) { dictTable = new DictTable(dictionary.tableCnt2Id(i)); NameTab = dictTable.label(); } } Огромное спасибо. | 
|  | 
|  11.09.2006, 16:30 | #2 | 
| Moderator | 
			
			Держите всё сразу    Код: static void KKu_Job_006_printTablesAndFields2(Args _args)
{
    Dictionary      dictionary      = new Dictionary();
    TableId         refTableId;
    FieldId         refFieldId;
    DictTable       dictTable;
    DictField       dictField;
    DictEnum        dictEnum;
    DictType        dictEDType;
    int             i, j;
    str strDictTableName;
    str strDictTableLabel;
    str strDictTableNameSQL;
 
    COM rstAxa;    // ADO: Recordset
    COM flds, fld; // ADO: Fields, Field
    COM xlApp;            // Excel.Application
    COM wbks, wbk;        // Workbooks, Workbook
    COM wkss, wks;        // Worksheets, Worksheet
    COM rng, cell, rngCR; // все Range
    COM font;             // Range.Font
    COM entCol;           // Range.EntireColumn
    COM actWin;           // Excel.Application.ActiveWindow
    int iMax; //i
 
// ============================================================================
    // СНАЧАЛА ВЛОЖЕННАЯ ФУНКЦИЯ
// ----------------------------------------------------------------------------
    // функция задает тип поля нашего Recordset-а в оперативной памяти
    // в данном демо-джобе используется для наглядности
    // для простоты используем всего 3 типа данных: число, строка и дата
    int adoTypeToExcel(str _type)
    {
        switch (_type)
        {
        // используются значения констант перечисления DateTypeEnum из топика TypeProperty (ADO)
        // (см. справку по ADO в файле ADO210.CHM - можно поискать на своем компе
            case 'num' : return   5; // adDouble
            case 'str' : return   8; // adBSTR
            case 'date': return 133; // adDBDate
        }
        return 8;
    }
// ============================================================================
    // ТЕПЕРЬ ОСНОВНОЙ ПРОЦЕСС
    // Recordset создается в оперативной памяти - без Connection!
    rstAxa = new COM('ADODB.Recordset');
    // формируем структуру нашего Recordset-а в "мозгах"
    flds = rstAxa.Fields();
    flds.Append('TableId'      , adoTypeToExcel('num' ));
    flds.Append('TableName'    , adoTypeToExcel('str' ));
    flds.Append('TableNameSQL' , adoTypeToExcel('str' ));
    flds.Append('TableLabel'   , adoTypeToExcel('str' ));
    flds.Append('FieldId'      , adoTypeToExcel('num' ));
    flds.Append('FieldName'    , adoTypeToExcel('str' ));
    flds.Append('FieldNameSQL' , adoTypeToExcel('str' ));
    flds.Append('FieldLabel'   , adoTypeToExcel('str' ));
    flds.Append('FieldBaseType'   , adoTypeToExcel('num' ));
    flds.Append('FieldBaseTypeTxt', adoTypeToExcel('str' ));
    flds.Append('FieldStringLen'  , adoTypeToExcel('num' ));
    flds.Append('FieldEnumId'  , adoTypeToExcel('num' ));
    flds.Append('FieldEnumName'  , adoTypeToExcel('str' ));
    flds.Append('FieldEnumLabel'  , adoTypeToExcel('str' ));
    flds.Append('FieldEDTypeId'  , adoTypeToExcel('num' ));
    flds.Append('FieldEDTypeName'  , adoTypeToExcel('str' ));
    flds.Append('FieldEDTypeLabel'  , adoTypeToExcel('str' ));
    // и наконец открываем его
    rstAxa.Open();
// ----------------------------------------------------------------------------
    startLengthyOperation();
    for (i=1; i<= dictionary.tableCnt(); i++)
    {
        refTableId   = dictionary.tableCnt2Id(i);
        dictTable = new DictTable(refTableId);
        strDictTableName    = dictTable.name();
        strDictTableNameSQL = dictTable.name(DbBackend::SQL);
        strDictTableLabel   = dictTable.label();
        for (j=1; j<= dictTable.fieldCnt(); j++)
        {
           refFieldId = dictTable.fieldCnt2Id(j);
           dictField = new DictField(refTableId, refFieldId);
        rstAxa.AddNew();
            fld = flds.Item('TableId'      ); fld.Value(refTableId          );
            fld = flds.Item('TableName'    ); fld.Value(strDictTableName    );
            fld = flds.Item('TableNameSQL' ); fld.Value(strDictTableNameSQL );
            fld = flds.Item('TableLabel'   ); fld.Value(strDictTableLabel   );
            fld = flds.Item('FieldId'      ); fld.Value(refFieldId                     );
            fld = flds.Item('FieldName'    ); fld.Value(dictField.name()               );
            fld = flds.Item('FieldNameSQL' ); fld.Value(dictField.name(DbBackend::SQL) );
            fld = flds.Item('FieldLabel'   ); fld.Value(dictField.label()              );
            fld = flds.Item('FieldBaseType'    ); fld.Value(dictField.baseType()             );
            fld = flds.Item('FieldBaseTypeTxt' ); fld.Value(enum2str(dictField.baseType()) );
            fld = flds.Item('FieldStringLen'   ); fld.Value(dictField.stringLen()            );
            fld = flds.Item('FieldEnumId'   ); fld.Value(dictField.enumId()            );
            if (dictField.enumId() != 0)
            {
                dictEnum = new DictEnum(dictField.enumId());
                fld = flds.Item('FieldEnumName'   );  fld.Value(dictEnum.name());
                fld = flds.Item('FieldEnumLabel'  );  fld.Value(dictEnum.label());
            }
            fld = flds.Item('FieldEDTypeId'   ); fld.Value(dictField.typeId());
            if (dictField.typeId() != 0)
            {
                dictEDType = new DictType(dictField.typeId());
                fld = flds.Item('FieldEDTypeName'   );  fld.Value(dictEDType.name());
                fld = flds.Item('FieldEDTypeLabel'  );  fld.Value(dictEDType.label());
            }
        rstAxa.Update();
        }
    }
    // к этому моменту в оперативной памяти сформирована НАША таблица
// ----------------------------------------------------------------------------
    // готовим новую рабочую книгу Excel для приема данных из Axapta:
    xlApp = new COM('Excel.Application');
    wbks = xlApp.Workbooks();
    wbk  = wbks.Add();
    wkss = wbk.Worksheets();
    wks  = wkss.Item(1);
    //wks.Name('AdoTestSheet');
    rng  = wks.Range('A1');
// ----------------------------------------------------------------------------
    // выводим строку имен полей (1-я строка листа Excel)
    flds = rstAxa.Fields();
    iMax = flds.Count() - 1;
    for (i = 0; i <= iMax; i += 1)
    {
        fld = flds.Item(i);
        cell = rng.Offset(0, i);
        cell.Value2(fld.Name());
    }
    rngCR = rng.CurrentRegion();
    font = rngCR.Font();
    font.Bold(true); // делаем выведенные заголовки жирным шрифтом
// ----------------------------------------------------------------------------
    // выводим данные, начиная со 2-й строки листа Excel
    cell = rng.Offset(1, 0);
    cell.CopyFromRecordset(rstAxa);
// ----------------------------------------------------------------------------
    // подгоняем ширину столбцов Excel
    rngCR = rng.CurrentRegion();
    entCol = rngCR.EntireColumn();
    entCol.AutoFit();
    // замораживаем строку заголовков Excel
    cell.Select();
    actWin = xlApp.ActiveWindow();
    actWin.FreezePanes(true);
// ----------------------------------------------------------------------------
    xlApp.Visible(true);
    rstAxa.Close();
}2 demon46: Для знакомства со способами вывода в Excel, как справедливо замечает ниже Yprit, смотрите тему, которую он указывает. Там масса вариантов экспорта, причем с количественной оценкой скорости. Но там далеко не все способы, которые существуют на Форуме, поэтому воспользуйтесь также функцией поиска. Способ экспорта, который я привел здесь в джобе, скалькирован по джобу Job_TestADO_2 из темы Поговорим об ADO. Этот способ не участвовал в "коллективном эксперименте" по причине моей лени, но я всё тешу себя мыслью, что он там тоже появится. Так уж получилось, что у меня сегодня был под рукой этот "рояль в кустах". Думаю, все так или иначе проходят через получение и изучение подобной информации о таблицах и полях. Последний раз редактировалось Gustav; 11.09.2006 в 18:42. | 
|  | |
| За это сообщение автора поблагодарили: kashperuk (3), demon46 (1). | |
|  11.09.2006, 16:30 | #3 | 
| Участник | 
			
			Посмотрите report - SysTableDefinition - там выгружается все инфа о таблице(цах). Или вас интересует именно выгрузка в Excel? если да, то поищите на форуме по этому слову - здесь очень много примеров с использованием различных технологий. | 
|  | 
|  11.09.2006, 16:31 | #5 | 
| NavAx | 
			
			может устроит просто вывод в текстовый файл с tab разделителем? Например так: Код: TextBuffer tb = TextBuffer(); 
;
tb.AppendText(strfmt("%1\t%2\t%3\n", id, Name, Desc));
tb.toFile("c:\\output.txt"); | 
|  | 
|  12.09.2006, 12:44 | #6 | 
| Участник | 
			
			Громадное спасибо всем. Получилось.
		 | 
|  |