|
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 |
Участник
|
Громадное спасибо всем. Получилось.
|
|