Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрое чтение данных их Excel 
V
    Опции темы
greykardinal
Дата 6.12.2010, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Уважаемые форумчане.
Подскажите, как считывать данные из документа Excel, если число строк в документе несколько тысячи несколько десятков столбцов.
Раньше всегда считывал данные из каждой ячейки, но это очень много времени занимает.
В инете прочитал что надо работать с объектом Range - его считывать из Excel и обрабатывать. 
Но как получить сами данные из диапазона Range?? smile 
Попробовал такой код:
Код

Variant app,sheet,ArrayData,App1,Value,Range;
int NumData;
int A;
float **F;

float F=new float *[A];
for (int i=0;i<A;i++) F[i]= new float[NumData];

  try { App1=Variant::CreateObject("Excel.Application");       }
  catch(...)
      { 
      try { App1=GetActiveOleObject("Excel.Application");      }
      catch (...)
        {Application->MessageBox("Ошибка Microsoft Excel!","Ошибка",MB_OK+MB_ICONERROR);   }
      }
  try {  if(!App1.IsNull())
         {
         App1.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str(),true);
         sheet = App1.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
         Range = sheet.OlePropertyGet("Range","A1:A25000");
         Value = Range.GetElement(1);           // Вылетает ошибка "Invalid arguments"


На форуме ничего похожего не нашел. Подскажите,, как исправить код.


PM MAIL   Вверх
Alca
Дата 6.12.2010, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Поиск по "VarArrayCreate". Здесь примеры для записи, для чтения - тоже самое.

Это сообщение отредактировал(а) Alca - 6.12.2010, 12:10

Присоединённый файл ( Кол-во скачиваний: 26 )
Присоединённый файл  _Excel_.zip 1,79 Kb


--------------------
PM WWW ICQ Skype Jabber   Вверх
greykardinal
Дата 6.12.2010, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Alca, спасибо, smile 
 попробовал переделать Ваш пример:
Код

sheet = App1.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
         ArrayData = VarArrayCreate(OPENARRAY(int,(0,10)),varDouble);
         Range = sheet.OlePropertyGet("Range","A1:A10");
         ArrayData = Range.OlePropertyGet("Value");   // Так всё работает

         for(int i=0;i<A-1;i++)  F[i][0]= ArrayData.GetElement(i+1);    //Здесь вылетает ошибка "Variant index array out of bounds"


Как вытащить из ArrayData значения ячеек?

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


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

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



greykardinal
Не понял юмора :(


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Код

for(int i=0;i<A-1;i++)  F[i][0]= ArrayData.GetElement(i+1);    //Здесь вылетает ошибка "Variant index array out of bounds"


А что такое A?



--------------------
PM WWW ICQ Skype Jabber   Вверх
greykardinal
Дата 6.12.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

А что такое A?


А- размер массива F, равен 25000.
Извиняюсь, малость неправильный код привел 
Код

int NumData;
Variant app,sheet,ArrayData,App1,Value,Range;
float **F;
int A;

F=new float *[A];
for (int i=0;i<A;i++) F[i]= new float[NumData];

// тут создаем OLE

         App1.OlePropertyGet("WorkBooks").OleProcedure("Open",File.c_str(),true);
         sheet = App1.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
         ArrayData = VarArrayCreate(OPENARRAY(int,(0,A)),varDouble);
         Range = sheet.OlePropertyGet("Range","A1:A25000");
         ArrayData = Range.OlePropertyGet("Value");

for(int i=0;i<А;i++)           F[i][0]= ArrayData.GetElement(i+1); // тут ошибка появляется


Прошу помощи.
PM MAIL   Вверх
Alca
Дата 6.12.2010, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

А- размер массива F, равен 25000

Цитата

//Здесь вылетает ошибка "Variant index array out of bounds"

Выход за пределы массива

Добавлено через 3 минуты и 12 секунд
Цитата

число строк в документе несколько тысячи несколько десятков столбцов

Может лучше (быстрее) через адо вынять?  smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
greykardinal
Дата 7.12.2010, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Нашел ответ. smile 
Надо было так сделать:
Код

for(int i=0;i<A;i++)     F[i][0]= ArrayData.GetElement(i+1,1);


А насчет ADO - действительно будет быстрее, но не хочется копаться в нем. Хочется старым проверенным способом попробовать.
PM MAIL   Вверх
Usper
Дата 10.2.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Alca,  сделал Вашим методом занесение данных в Excel, НО! Почему-то заносится одно и тоже значение во все ячейки! :( Что за нафик?
Код

std::vector <int> arr;
....
int Bounds [2];
size = arr.size();  
Bounds[0] = 0;
Bounds[1] = size;
Variant VariantArray;
VariantArray = VarArrayCreate(Bounds, 1, varVariant);
for(int i = 0; i < size; i++)
        VariantArray.PutElement(arr[i], i);  
Cell1=Cells.OlePropertyGet("Item",1,1); 
Cell2=Cells.OlePropertyGet("Item",size,1); 
Sheet.OlePropertyGet("Range", Cell1, Cell2).OlePropertySet("Value",VariantArray);


В Excel передаётся только arr[0];


--------------------
На посохе волшебном нехилый набалдашник, большой такой, огромный, нехилый набалдашник.
PM MAIL   Вверх
akrufar
Дата 19.5.2016, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня вопрос. Сделал что-то подобное. Но просто считываю большой массив из файла-Excel переменную типа variant. Таким е образом:

Код

Range = sheet.OlePropertyGet("Range","A1:A25000");
ArrayData = Range.OlePropertyGet("Value");


При однократном вызове все работает быстро. Диапазон 18 на 3500 меньше чем за секунду считывает. Но если вызвать повторно код, то работает порядка 30 секунд. Хотя при каждом вызове сначала открываю Excel, считываю данные, закрываю Excel. Кто подскажет в чем беда???? Кусок кода ниже:

Код

Variant
      v_Var_Excel,         
      v_Var_Books,         
      v_Var_Book,         
      v_Var_Sheets,       
      v_Var_Sheet,        
      v_Var_Cells,        
      v_Var_Cell,
v_RangeDataHelp
v_RangeData; 

void __fastcall TForm1::Button1Click(TObject *Sender)
{
// запускаем Excel
ExcelInit("ИМЯ_Файла.xls",1);
int i_TimeStart = GetTickCount();

Variant v_RangeDataHelp ,v_RangeData ;
v_RangeDataHelp = v_Var_Sheet.OlePropertyGet("Range","A1:R3500");
v_RangeData = v_RangeDataHelp.OlePropertyGet("Value");

Label1->Caption = "Time: " + FloatToStr((float)(GetTickCount()- i_TimeStart)/1000.0)+" c";

//Освобождается память и закрывается Excel
v_RangeDataHelp.Clear();
v_RangeData.Clear();
ExcelClose();
CleaningMemory();
}

void __fastcall ExcelInit(AnsiString as_File, int i_Number_Sheet)
{
  // Попытка запуска Excel
  try {
        //Пытаемся запустить Exel
        v_Var_Excel = CreateOleObject("Excel.Application");
        b_Excel_Start = true;
  } catch (...) {
        Application->MessageBox("Невозможно открыть Microsoft Excel!"
        "Возможно Excel не установлен на компьютере.",
        "Ошибка",MB_OK+MB_ICONERROR);
        b_Excel_Start = false;
        return;
  }

  try {
        if(as_File!=""){
                v_Var_Excel.OlePropertyGet("WorkBooks").OleProcedure("Open", as_File.c_str()); //Пытаемся открыть указанный файл
                b_Excel_Start = true;
        }
        else{
                b_Excel_Start = false;
                return;
        }

        //Открываем лист книги с которым будем работать
        v_Var_Sheet = v_Var_Excel.OlePropertyGet("Worksheets",i_Number_Sheet);
  } catch(...) {
        Application->MessageBox("Ошибка открытия книги Microsoft Excel!",
                                         "Ошибка",MB_OK+MB_ICONERROR);
        return;
  }
}

void __fastcall ExcelClose()
{
  v_Var_Excel.OlePropertyGet("WorkBooks").OleProcedure("Close");
  v_Var_Excel.OleProcedure("Quit");
}

void __fastcall CleaningMemory()
{
  v_Var_Excel.Clear();
  v_Var_Books.Clear();
  v_Var_Book.Clear();
  v_Var_Sheets.Clear();
  v_Var_Sheet.Clear();
  v_Var_Cells.Clear();
  v_Var_Cell.Clear();
}



Добавлено через 3 минуты и 2 секунды
При тестировании выяснил, что проблема именно в этой строке:
Код

v_RangeData = v_RangeDataHelp.OlePropertyGet("Value");


но что именно не так не понятно. т.е. если эту строку убрать, то код работает быстро при любом количестве вызовов, а если вернуть, то первый раз быстро, а при повторных вызовах очень медленно. 

Это сообщение отредактировал(а) akrufar - 19.5.2016, 22:03
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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