← Atrás

Ошибка при генерации отчёта через ExcelStrategyReport

При вызове new ExcelStrategyReport(strategy, "c:\1.xls").Generate(); возникает ошибка, ниже прилагаю трассу: (xml генерируется нормально)

System.Runtime.InteropServices.COMException was unhandled by user code HelpLink=xlmain11.chm Message=Введено недопустимое имя для листа или диаграммы. Убедитесь, что:

  • длина введенного имени не превышает 31 знака;
  • имя не содержит ни одного из следующих знаков: : \ / ? * [ или ];
  • имя не оставлено пустым. Source=Microsoft Excel ErrorCode=-2146827284 StackTrace: at Microsoft.Office.Interop.Excel._Worksheet.set_Name(String RHS) at Ecng.Trading.Algo.ExcelStrategyReport. (Sheets , String ) at Ecng.Trading.Algo.ExcelStrategyReport. () at Ecng.Trading.Algo.ExcelStrategyReport.Generate() at Robots.MainWindow.MainWindow.OnClosing(CancelEventArgs e) in C:\Users\Alexander\Documents\Visual Studio 2010\Projects\Robots\Robots \MainWindow\MainWindow.xaml.cs:line 65 at System.Windows.Window.WmClose() InnerException:

¿Le resultó útil este tema?

Compartir tema

Comentarios (19)

Iniciar sesión o Crear cuenta, Inicie sesión o regístrese para dejar un comentario

Mikhail Sukhov
Mikhail Sukhov

А если указать без пути?

Alexander
Alexander Autor

т.е. с пустым путём? конструктора с 1м параметром там нет new ExcelStrategyReport(strategy, "").Generate();

Mikhail Sukhov
Mikhail Sukhov

Я имел ввиду new ExcelStrategyReport(strategy, "1.xls").Generate();

Alexander
Alexander Autor

Тоже самое, возникает ошибка. Xml отчёт при этом генерируется на ура

Mikhail Sukhov
Mikhail Sukhov

А какая версия офиса?

Alexander
Alexander Autor

2010

Mikhail Sukhov
Mikhail Sukhov

Такой разве есть? Я тестил на 2003 и на 2010.

Alexander
Alexander Autor

наверное на 2003 и 2007 =)

2010 в мае вышел написано:

http://ru.wikipedia.org/wiki/Microsoft_Office_2010

я где-то тогда и поставил себе

Mikhail Sukhov
Mikhail Sukhov

Ага, 2007.

Насчет 2010 не уверен. У меня такая трабла была, когда версия была не та для офиса. Ошибка 2146827284 - это считайте все, что угодно.

В 2.3 я полностью переделываю код работы с Эксель. Там не через API будет, а напрямую файл создаваться. Так мне кажется универсальнее. Если хотите, могу отослать код ExcelReport чтобы его можно было подогнать под 2010. Но это самостоятельно =)

Alexander
Alexander Autor

Мне не критично, я просто тестировал, думал чего ещё реализовать в роботах =) Тем более моя работа не поможет проекту. Подожду 2.3. Я так понимаю её дней через 10 уже можно ждать =)

Mikhail Sukhov
Mikhail Sukhov

Не, не через 10... Я там новшество одно ввожу. Так что может затянутся.

Mikhail Sukhov
Mikhail Sukhov

Скачал 2010. Пока не устанавливал... Что воодушевляет - офис написан на .NET FW. Прямо как S# =)

Alexander
Alexander Autor

Сегодня впервые робот на Stock# 2.2.1 проработал весь день - в конце дня у меня по планам была генерация отчёта, в итоге возник такой exception:

System.ArgumentOutOfRangeException was unhandled by user code Message=Ticks must be between DateTime.MinValue.Ticks and DateTime.MaxValue.Ticks. Parameter name: ticks Source=mscorlib ParamName=ticks StackTrace: at System.DateTime..ctor(Int64 ticks) at Ecng.Common.TimeSpanEx.ToString(String format, IFormatProvider formatProvider) at Ecng.Common.TimeSpanEx.ToString(String format) at Ecng.Trading.Algo.XmlStrategyReport.Generate() at Robots.MainWindow.MainWindow.OnClosing(CancelEventArgs e) at System.Windows.Window.WmClose() InnerException:

Отчёт генерирую для каждой стратегии через var fileNameXml = "{0} _{1}.xml".Put(DateTime.Now.ToString("MM_dd"), strategy.Portfolio.Name); new XmlStrategyReport(strategy, Path.Combine("c:
", fileNameXml)).Generate();

Alexander
Alexander Autor

Никаких мыслей пока нет? Сегодня попробую вечером сгенерировать отчёт, пока работает без ошибок весь день - заменил снятие заявок на старое, через Trader.CancelOrder

Ещё заметил такую вещь, ещё начиная с 2.1 - периодически пропадает связь или, к примеру, перед торгами - в нижнем левом углу Квика просто в этом случае не отображается текущее время. Тогда вылетает эксепшен необрабатываемый:

http://img.pixs.ru/storage/3/8/5/123png_1161875_897385.png

Мелочь, а не приятно =) Можно вместо этой ошибки выдавать просто текущее время? У некоторых брокеров, которыми я пользуюсь, в первые секунды (а то и пару минут) торгов время не идёт в нижнем левом углу - опять же, ошибка возникает. Я сейчас использую следующую функцию-заглушку: static public DateTime GetMarketTime(ITrader trader) { return trader.MarketTime.TimeOfDay < new TimeSpan(10, 5, 0) ? DateTime.Now : trader.MarketTime; }

Но в случае когда пропадает связь и время не отображается это не помогает (скрин выше - то что получил час назад судя по логу).

Mikhail Sukhov
Mikhail Sukhov

Насчет ошибки с отчетом - это значит задержка получилась отрицательной. Пока не выяснил, это какая-то особенность или неправильный расчет.

Насчет необрабатываемого исключения. Уверены? Судя по скрину - он то как раз обрабатываемый. Я специальное в try catch обернул получение времени из Квика.

Но доп проверку на время поставить не мешает.

Alexander
Alexander Autor
Mikhail Sukhov
Mikhail Sukhov

Оно все как раз так и реализовано. Если ошибка - просто возвращается по старому (системное со смещением). А Вы если что-то правите, лучше делайте наследника и переопределяйте методы.

Насчет игнорирования - отпишитесь от события ProcessDataError. Только так лучше не делать =)

Alexander
Alexander Autor

Переопределил, сегодня с утра попробовал просто использовать base.MarketTime - событие CandlesFinished не приходило до 10:01:57 (у меня 1 и 5-минутки фьючерса ртс). Как то может быть связано с неправильным временем? (как раз с тем, что первые пару минут неверное время отображается в самом квике. просто раньше не замечал такого долгого формирования свечек на открытии сессии...)

Mikhail Sukhov
Mikhail Sukhov

Связанно прямо. TimeFrameCandle опираются как раз на данное время.