|
|
#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(); } } Огромное спасибо. |
|
|
|
|
#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). | |
|
|
#3 |
|
Участник
|
Посмотрите report - SysTableDefinition - там выгружается все инфа о таблице(цах).
Или вас интересует именно выгрузка в Excel? если да, то поищите на форуме по этому слову - здесь очень много примеров с использованием различных технологий. |
|
|
|
|
#5 |
|
NavAx
|
может устроит просто вывод в текстовый файл с tab разделителем?
Например так: Код: TextBuffer tb = TextBuffer();
;
tb.AppendText(strfmt("%1\t%2\t%3\n", id, Name, Desc));
tb.toFile("c:\\output.txt"); |
|
|
|
|
#6 |
|
Участник
|
Громадное спасибо всем. Получилось.
|
|
|