19.09.2008, 13:56 | #1 |
int 20h
|
Еще проблема с Excel при построении диаграмм
Добрый день.
Пытаясь построить диаграмму программно на Х++ столкнулся с затруднением. Как вывести содержимое объедененных ячеек в легенду. Диаграмма строится на отдельном листе. Лист с данными называется свод. Методом проб выяснил что передать в xValue можно только форматом RC колонок. ячейки с R2C5 по R2C23 являются объедененными по принципу R2C5 объеденена R2C6 R2C7 объеденена R2C9 и тд Данные содержатся для легенды содержатся в R2C5, R2C7 то есть каждой нечетной до 23 столбца включительно. пытаясь передать в метод ComExcelDocument_RU содержимое X++: outputRangeHeader ="=\свод\'\!R2C5\:R2C23"; X++: SeriesCollection.xValue(_outputRangeHeader); Метод "range" в COM-объекте класса "_Application" возвратил код ошибки 0x800A03EC (<неизвестно>), который означает: <неизвестно>. Подскаджите пожалуйста, как можно передать такой Range
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind Последний раз редактировалось zZ_TOP_Zz; 19.09.2008 в 15:09. |
|
19.09.2008, 14:19 | #2 |
Moderator
|
"За сколько времени сможете подготовиться и сдать экзамен по китайскому языку? - Конспект есть? Щас докурю и пойдём сдавать!"
Если руками в Excel делать, то это в каком месте? Во-первых, SeriesCollection.XValues, наверное, всё-таки, а не .xlValue? |
|
19.09.2008, 14:58 | #3 |
int 20h
|
Ну да опечатался...что же теперь ....по существу есть что то?...
Там же между строк написано, что строится отчет в неком классе, Из него вызывается метод класса ComExcelDocument_RU Вызывается вот этой командой со значениями указанными в начале поста X++: exceldocument.addXlPieChart(1,outputRange,'Отчет за месяц','Диаграмма',outputRangeHeader ); X++: #define.xlPie(5) void addXlPieChart(int _workSheet, BookMark _bookMark, str _title, str _newSheetName, str _outputLegendRange, boolean _reverse = false) { COM Charts, Chart, comRange; COM ChartTitle, Characters, SeriesCollection,Border, Legend; COM ActiveSheet; int i; str bookmark; ; if (! m_comDocument) throw error(strFmt("@DIS6401", this.getApplicationName())); Charts = m_comDocument.charts(); Charts.Add(); Chart = m_comDocument.ActiveChart(); comRange = this.findRange(_bookMark, _workSheet); Chart.SetSourceData(comRange, 1); Chart.ChartType(#xlPie); SeriesCollection = Chart.SeriesCollection(1); SeriesCollection.ApplyDataLabels(1,0,0,0,0,0,1); SeriesCollection.XValues(_outputLegendRange); Border = SeriesCollection.Border(); Border.Weight(1); Chart.HasTitle(True); ChartTitle = Chart.ChartTitle(); Characters = ChartTitle.Characters(); Characters.Text(_title); ChartTitle.AutoScaleFont(false); Chart.Name(_newSheetName); } X++: SeriesCollection.XValues(_outputLegendRange);
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
19.09.2008, 16:02 | #4 |
int 20h
|
Вопрос снимается.
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
19.09.2008, 16:09 | #5 |
Moderator
|
Получилось? Расскажете? У меня, честно говоря, с наскока не получилось, поэтому и затих
|
|
19.09.2008, 16:20 | #6 |
int 20h
|
Конечно расскажу
Не совсем красиво, но это работает передал не как Range, а как перечисление всех нужных ячеек вот такую строчку X++: outputRangeHeader = "=\'свод\'\!R2C5\;\'свод\'\!R2C7\;\'свод\'\!R2C9\;\'свод\'\!R2C11\;\'свод\'\!R2C13\;\'свод\'\!R2C15\;\'свод\'\!R2C17\;\'свод\'\!R2C19"; exceldocument.addXlPieChart(1,outputRange,'Отчет за месяц','Диаграмма',outputRangeHeader );
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
20.09.2008, 17:37 | #7 |
Moderator
|
Спасибо. А вот мой рассказ
Я собирался попробовать подсунуть такой диапазон, как если бы в Excel, держа Ctrl, щелкать мышкой по ячейкам через одну: Код: 'код - Excel VBA SeriesCollection.XValues = Worksheets("свод").Range("E2,G2,I2,K2,M2,O2,Q2,S2,U2") Далее я попытался "где-то сбоку" в той же строке, в подряд идущих ячейках AA2:AI2 написать формулы, ссылающиеся на разрозненные ячейки исходного диапазона: Код: Set cell = Worksheets("свод").Range("AA2") For i = 22 To 15 Step -1 cell.FormulaR1C1 = "=RC[-" & i & "]" Set cell = cell.Offset(0, 1) Next i SeriesCollection.XValues = Worksheets("свод").Range("AA2:AJ2") При попытке же переноса в Аксапту происходили какие-то странные вещи с FormulaR1C1. В ячейку AA2 по этому моему алгоритму должна была попасть формула =RC[-22], которая в ячейке преображалась в формулу A1-стиля: =E2. И при прогоне в Excel всё так и происходило. При попытке же задать формулы из Аксапты в ячейке AA2 вместо ожидаемого =E2 оказалось =IA1, что в R1C1-стиле соответствует =R1C235. Интересно, что 235 - это 257-22 (взгляните на исходную формулу =RC[-22] ). Ну, а 257 - это нечто рядом с 256. Есть ощущение, что значение в квадратных скобках, внешнее напоминающее контейнер или индекс массива, каким-то таинственным образом преображается. В общем, хочу всё это на досуге поисследовать. НО! Даже если это наконец заработает, всё равно необходим дополнительный код, объем которого будет явно не меньше кода, формирующего строку outputRangeHeader. Так что оставим в покое вопросы красивости. Ваше решение - простое, экономное и, самое главное, уже работающее. |
|
22.09.2008, 10:16 | #8 |
Moderator
|
В общем, формулы оказались ни при чем. Точнее, "при чем", но как бы не по своей воле.
Всему "виной" программное построение диаграммы, которое, как выяснилось, весьма капризно, и успешное завершение этого процесса зависит даже от последовательности операторов. Например, поменяйте местами два самых последних оператора (казалось бы, абсолютно независимых) в нижеследующем демонстрационном джобе и вы получите сообщение об ошибке. Что касается формул, то всё получилось, как хотелось, после помещения кода по их созданию перед кодом для создания диаграммы. Опять-таки, если хотите увидеть, какие с ними были проблемы, перенесите код по "организации непрерывного диапазона" в место перед оператором series.XValues (см. комментарии). X++: { ComExcelDocument_RU doc = new ComExcelDocument_RU(); COM xlApp; COM wbook; COM activeSheet; int i; COM charts; COM activeChart; COM rangeOutputHeader; COM range; COM seriesCollection; COM series; ; doc.NewFile(); wbook = doc.getComDocument(); xlApp = wbook.Parent(); activeSheet = xlApp.ActiveSheet(); // генерация тестовых данных для примера for (i=1; i<=10; i++) doc.insertValue(ComExcelDocument_RU::numToNameCell(i,1), i*10); // тестовые значения для XValues for (i=5; i<=23; i+=2) doc.insertValue(ComExcelDocument_RU::numToNameCell(i,2), strFmt('Категория %1', i)); // организация непрерывного диапазона в AA2:AJ2 range = activeSheet.Range('AA2'); for (i=22;i>=13;i--) { range.FormulaR1C1(strFmt('=RC[-%1]', i)); range = range.Offset(0, 1); } rangeOutputHeader = activeSheet.Range('AA2:AJ2'); // построение диаграммы charts = wbook.Charts(); activeChart = charts.Add(); activeChart.ChartType(5); // 5 = xlPie activeChart.SetSourceData(activeSheet.Range('A1:J1')); series = activeChart.SeriesCollection(1); // немного странно, что это работает, не требуя промежуточного series = seriesCollection.Item(1); // если организацию непрерывного диапазона перенести сюда, // то будут описанные выше проблемы с формулами series.XValues(rangeOutputHeader); // и, как хотелось, здесь Range, а не стринг activeChart.Location(2, activeSheet.Name()); // 2 = xlLocationAsObject } X++: // организация непрерывного диапазона в AA2:AJ2 rangeOutputHeader = activeSheet.Range('AA2:AJ2'); rangeOutputHeader.FormulaArray('=INDEX(RC[-22]:RC[-4],{1,3,5,7,9,11,13,15,17,19})'); // построение диаграммы |
|
|
За это сообщение автора поблагодарили: G.Menshikh (1), kornix (1). |
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|