Модераторы: mihanik
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выгрузка данных в Excel в виде текста, Excel преобразует формат - как избежать? 
V
    Опции темы
Alexander06
Дата 14.9.2009, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Здравствуйте, я осуществляю выгрузку данных в Excel таблицей, через VarArrayCreate и myRange->set_Value(data);

Недостаток в том, что некоторые значения (arr[row].col[col] представляет собой AnsiString) Эксель преобразует по своему усмотрению в момент импорта.
Например, строку "10E109" в число 1.00E+110.

Подскажите, как я могу указать ему принимать данные как текст, передавая из через массив Variant?

Код моих функций привожу ниже. 

Спасибо.

Код

char ExportChannelsXLS::saveFileTable(AnsiString path, int startX, int startY, int cols, int rows, RowType *arr, TComponent* owner){
    ExcelWork *xls;
    bool status;
    int bounds[4] = {0, rows-1, 0, cols-1};
    TVariant val;
    xls = new ExcelWork(owner);
    Variant matrix = VarArrayCreate(bounds, 3, varVariant);
    for(int col = 0; col < cols; col++){
        for(int row=0 ; row < rows ; row++){
            val = arr[row].col[col];
            matrix.PutElement(val, row, col);
        }
    }
    xls->FastInsertVariantTableToAddress(startY, startX, rows, cols, matrix);
    xls->SaveReport("c:\\testClass.xls");
    status = xls->IfReportSaved;
    xls->CloseReport();
    delete xls;
    return status;
}
void __fastcall ExcelWork::FastInsertVariantTableToAddress(int firstRow, int firstCol, int rows, int cols, Variant data){
   int CurShift = 0;
   TVariant cell1, cell2;
   ExcelRangePtr myRange;
   if(firstRow<1) firstRow = 1;
   if(firstCol<1) firstCol = 1;
   cell1  = WorkExcelSheet->get_Cells()->get_Item(TVariant(firstRow), TVariant(firstCol));
   cell2  = WorkExcelSheet->get_Cells()->get_Item(TVariant(firstRow + rows - 1), TVariant(firstCol + cols - 1));
   myRange = WorkExcelSheet->get_Range(cell1, cell2);
   myRange->set_Value(data);
   CurShift=GetShiftRow();
   SetShiftRow(CurShift + rows - 1);
}

PM MAIL   Вверх
Alexander06
Дата 14.9.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 90
Регистрация: 28.7.2006

Репутация: нет
Всего: нет




Напрасно создал тему, вопрос решается просто.

У Range есть свойство NumberFormat

Ему передается в текстовом виде формат. Конкретные значения легко установить, записав макрос на установке формата ячеек в Excel.

В моем случае это выглядит так

Код

    myRange->set_NumberFormat(TVariant("@"));


Тема закрыта.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.